【问题标题】:Ghost output when displaying; Nested Linked list [C]显示时的幻影输出;嵌套链表 [C]
【发布时间】:2017-06-01 03:56:28
【问题描述】:

很抱歉,我对 c 来说仍然是新的长代码。它只是在我显示数据时发生,活动数据总是插入 1 个以上数据,这使我的程序无法响应。

#include <stdio.h>
#include <stdlib.h>

struct activity{
    int reps, calBurn;
    char aName[30];

    struct activity *ptrnexto;
};

struct activity *newptro, *curptro, *prevptro;

struct plan {
    char pName[30], focus;
    int recWieght;

    struct plan *ptrnext;
    struct activity *act;
};

struct plan *headptr, *newptr, *curptr, *prevptr;

int menu(int num);
int insertPlan ();
int displayPlans ();

int main()
{
    menu(1);
}

//菜单功能

int menu(int no)
{
    int choice;
    if (no==0){
        return 0;
    }
    while(no==1)
    {
        system("cls");
        printf("\n");
        printf("\t\t\t\t   Welcome!\n");
        printf("\t\t\t   Input a new fitness plan\t [1]\n"
               "\t\t\t   View ALL fitness plan\t [5]\n");
        printf("\n\t\t\t          -----------\n ");
        printf("\t\t\t   Choice: ");
        scanf("%d",&choice);
        fflush(stdin);
        system("cls");
        switch(choice)
        {
            case 1:
            {
                insertPlan ();
                break;
            }
            case 5:
            {
                displayPlans ();
                return 0;
                break;
            }
            default:
            {
                printf("Invalid key entry.");
                break;
            }

        }//end switch
        printf("\n\tDo you wish to return to menu?\n"
               "\tYes[1]\t\tNo[0]\n\t");
        printf("-->  ");
        scanf("%d",&no);
        return menu(no);
    }
    return 0;
}

//插入函数

int insertPlan ()
{

    int pos=0,ch;
    newptr = (struct plan*)malloc(sizeof(struct plan));

    printf("\n Recomended Wieght : ");
    scanf(" %d",&newptr->recWieght);
    printf("\n Plan Name : ");
    scanf(" %s",&newptr->pName);
    printf("\nUpperBody(U)--LowerBody(L)--Abdomen(A)--Stamina(S) \nPlan Focus : ");
    scanf(" %c",&newptr->focus);
    printf("\n Put in the plans : ");
    while(ch!=0)
    {
        newptro= (struct activity*)malloc(sizeof(struct activity));
        pos = pos +1;
        printf("\nInsert in actvity %d",pos);
        printf("\n Activity Name : ");
        scanf("%s",&newptro->aName);
        printf("\n how many reps : ");
        scanf("%d",&newptro->reps);
        printf("\n estimated calory burn : ");
        scanf("%d",&newptro->calBurn);

        if (newptr->act==NULL)
        {
            newptr->act=newptro;
            newptro->ptrnexto=NULL;
        }
        else
        {
            newptro->ptrnexto=newptr->act;
            newptr->act=newptro;
        }
        printf("\n\tIs there anymore plans?\n"
               "\tYes[1]\t\tNo[0]\n\t");
        scanf("%d",&ch);
    }


    if (headptr==NULL)
    {
        headptr=newptr;
        newptr->ptrnext=NULL;
    }
    else
    {
        newptr->ptrnext=headptr;
        headptr=newptr;
    }
    return
 menu(1);
}

//显示

int displayPlans ()
{
    int pos=0;
    if (headptr==NULL)
        printf("EMPTY LIST");
    else
    {
        curptr=headptr;
        while(curptr!=NULL)
        {
            pos=pos +1;
            printf("\n%d -%s \n",pos, curptr->pName);
            curptro=curptr->act;

            while(curptro!=NULL)
            {
                printf(" #%s --> %d", curptro->aName, curptro->reps);
                curptro=curptro->ptrnexto;
            }
            curptr=curptr->ptrnext;
        }
    }
}

fitnessCookie.c 健身CpCookie 由 Asyraf Fuyu 于 23/04/2017 创建。 版权所有fitnessCookie© 2017。保留所有权利。

这是从菜单运行显示输出后的输出

注意:我没有输入最后带有红色下划线的数据。

一个人怎么输入笑脸..

【问题讨论】:

  • 首先使用调试器定位哪里崩溃发生。然后检查未初始化的变量或结构成员。但最重要的是,不要试图一次编写整个程序。迭代,编写它的一小部分,一步一步地测试它在每个步骤之间是否有效。我还建议您阅读How to debug small programs
  • 我正在使用代码块,它内置了一些调试插件。重写代码和改变其结构已经一周了,我认为这是我尝试从专业人士那里寻求帮助的时候了。还有更多代码,但是当我尝试显示我的活动结构时,我发现崩溃发生在显示功能上,我怀疑我的插入或显示可能有误,但我把主菜单功能放在了以防被忽略。
  • 使用未初始化变量。 chwhile(ch!=0)newptr-&gt;actif (newptr-&gt;act==NULL)
  • 我已经在这里初始化了int pos=0,ch;,并全局定义了struct plan *headptr, *newptr, *curptr, *prevptr;
  • 那么代码中将NULL 设置为newptr-&gt;act 的部分在哪里?

标签: c struct linked-list


【解决方案1】:

BLUEPIXY 在评论中给出了答案:
NULL 设置为newptr-&gt;act

【讨论】:

  • “我不知道如何将我的问题标记为已回答提醒我,因为我无法在 2 天内回答我自己的问题”,这并不重要。
  • 问题在有答案时会被视为“已回答”,而您现在已经有了答案。没有机制可以直接做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 2016-09-13
相关资源
最近更新 更多