链接列表突然改变C中的值

时间:2014-07-12 16:17:48

标签: c linked-list

我正在制作一个简单的链表,问题是它在课后上课时,第一个节点的值会发生变化。这是我的插入代码:

int adjob(int job,int time, int size,JOBS **list)
{
    JOBS *temp,*new;
    temp=*list;
    if(temp==NULL)
        *list=create(job,time,size);

    else
    {
        new=(JOBS*)malloc(sizeof(JOBS));
        new->job=job;
        new->size=size;
        new->duration=time;
        new->next=NULL;
        while(temp->next!=NULL)
            temp=temp->next;
        temp->next=new; 
    }
        return 0;
}

这是主要的:

MEM mmem[10];
int main()
{
    int i=1,jtime,jsize,status;
    char option;
    JOBS *joblist;
    joblist=NULL;
    status=initmem(mmem);
    for(;;)
    {
        clrscr();
        printer(mmem,&joblist);
        scanf("%s",&option);
        switch(option)
        {
            case 'I':       if(i<16)
                            {
                                printf("Input size of job %i: ",i);
                                scanf("%i",&jsize);
                                printf("Input duration: ");
                                scanf("%i",&jtime);
                                status=adjob(i,jtime,jsize,&joblist);
                            }
                                i++;
                                break;
            case 'S':       break;
            case 'R':       break;
            case 'E':       exit(0);
        }
    }
    free(joblist);
    joblist=NULL;
    return 0;
}

这些是我的结构:

struct node
{
    int job;
    int size;
    int duration;
    struct node *next;
};

struct mainmem
{
    int memblock;
    int size;
    int jobnum;
    int jobsize;
    int timer;
};
typedef struct mainmem MEM;
typedef struct node JOBS;

然后这是我的打印机:

int printer(MEM *mymem,JOBS **list)
{
    JOBS *temp;
    int i=0,pr=3;
    temp=*list;

    /*MEM LIST*/
    printf("\t\tMEMORY LIST\t\t\t\tJOB LIST\nMem Block    Size    Job    Job Size    Timer\n");
    while(i!=10)
    {
        printf("   %i\t     %i\n",i+1,mymem[i].size);
        i++;
    }
    /*JOB LIST*/
    gotoxy(50,2);
    printf("Job no.\tTime\tJob Size");
    if(temp==NULL)
    {
        gotoxy(50,pr);
        printf("No jobs on queue.");
    }
    else
    {
        while(temp!=NULL)
        {   
            gotoxy(50,pr);
            printf("%i\t%i\t%i",temp->job,temp->duration,temp->size);
            pr++;
            temp=temp->next;
        }
    }
    gotoxy(1,20);
    printf("[I]-INPUT   [S]-START   [R]-RESULT  [E]-EXIT\n");
    return 0;
}

第一个节点插入没有问题。当我插入第二个节点时,第一个节点会更改。当我尝试插入超过2时,程序按原样运行。我尝试调试它,当第二个输入插入到JOBS LL中时值会改变,但我无法从我的代码中找出它。什么可能出错?

1 个答案:

答案 0 :(得分:1)

您遇到的问题可能是因为您的代码中有undefined behavior:变量option是单个char,但您将其读入为将写入两个字符(您读取的字符字符串终结符)。没有办法告诉它会覆盖什么,但它可能会覆盖存储其他局部变量的堆栈部分。

您应该将输入处理更改为只读取一个字符:

scanf(" %c", &option);

注意前导空格,它会告诉scanf在字符前读取并丢弃任何空格(包括换行符)。