我正在制作一个简单的链表,问题是它在课后上课时,第一个节点的值会发生变化。这是我的插入代码:
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中时值会改变,但我无法从我的代码中找出它。什么可能出错?
答案 0 :(得分:1)
您遇到的问题可能是因为您的代码中有undefined behavior:变量option
是单个char
,但您将其读入为将写入两个字符(您读取的字符和字符串终结符)。没有办法告诉它会覆盖什么,但它可能会覆盖存储其他局部变量的堆栈部分。
您应该将输入处理更改为只读取一个字符:
scanf(" %c", &option);
注意前导空格,它会告诉scanf
在字符前读取并丢弃任何空格(包括换行符)。