124124实验3单项链表【实验目的】1.掌握单向链表的概念和建立方法。2.掌握单向链表的基本操作。【实验内容】一.调试示例输入若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束,用单向链表组织这些学生信息后,再按顺序输出。(源程序error11_3.cpp)源程序(有错误的程序)1#includestdio.h2#includestdlib.h3#includestring.h4structstud_node{5intnum;6charname[20];7intscore;8structstud_node*next;9};10intmain(void)11{12structstud_node*head,*tail,*p;13intnum,score;14charname[20];15intsize=sizeof(structstud_node);16head=tail=NULL;17printf(Inputnum,nameandscore:\n);18scanf(%d,&num);19/*建立单向链表*/20while(num!=0){实验11指针进阶12521p=malloc(size);22scanf(%s%d,name,&score);23p-num=num;24strcpy(p-name,name);25p-score=score;26p-next=NULL;27tail-next=p;28tail=p;29scanf(%d,&num);30}31/*输出单向链表*/32for(p=head;p-next!=NULL;p=p-next)/*调试时设置断点*/33printf(%d%s%d\n,p-num,p-name,p-score);34return0;35}运行结果(改正后程序的运行结果):Inputnum,nameandscore:1zhang782wang803Li754zhao8501zhang782wang803Li754zhao851.编译后共有1errors,鼠标双击第一个错误,观察源程序中箭头指向第21行,分析错误原因并改正:错误信息::errorC2440:'=':cannotconvertfrom'void*'to'structstud_node*';错误原因:动态申请要指定其类型;改正方法:在malloc前加上(structstud_node*);2.改正错误后重新编译、连接程序没有错误。运行程序,当输入完第一行数据按回车后,出现出错信息。错误信息:;错误原因:在建立链表时没有考虑初始状态链表是空的情况;改正方法:在第27行前插入语句:if(head==NULL){head=p;tail=p;}else;实验11指针进阶1263.改正错误后重新编译、运行程序,运行结果与预期不符之处为:少了一行;4.调试步骤:(1)设置断点,具体位置见源程序的注释。(2)单击(go)按钮,输入题目中给出的运行数据,程序运行到断点,在观察窗口中输入head,单击head前面的加号,就可以看到链表第一个结点的内容,再单击next前面的加号,就可以看到链表第二个结点的内容,以此类推(如图1所示)。经查看,各元素值与输入的数据一致,说明链表建立正确。(3)继续单步运行,同时观察输出窗口的信息。发现当输出倒数第二个学生信息后for循环就结束了。错误原因:最后一个学生的信息输出不了;改正方法:32改for(p=head;p!=NULL;p=p-next);(4)单击(StopDebugging)按钮,结束程序调试。图1链表调试5.重新编译、连接、运行,运行结果与预期相符。思考:为什么要用动态内存分配方式建立链表结点?省空间运算效率高在链表结构中,next成员起什么作用?实验11指针进阶127记录下一个结构体的位置二.改错题输入若干个学生的学号(共7位,其中第2、3位是专业编号),以#作为输入结束标志,将其生成一个链表,统计链表中专业为计算机(编号为02)的学生人数。(源程序error11_4.cpp)输入输出示例102120220223108102134103091231102034021205#3源程序(有错误的程序)1#includestdio.h2#includestdlib.h3#includestring.h4structnode{5charcode[8];6structnode*next;7};8intmain(void)9{10structnode*head,*p;11inti,n,count;12charstr[8];13intsize=sizeof(structnode);14head=NULL;15gets(str);16/*按输入数据的逆序建立链表*/17while(strcmp(str,”#”)!=0){18p=(structnode*)malloc(size);19strcpy(p-code,str);20head=p-next;21head=p;22gets(str);23}实验11指针进阶12824count=0;25for(p=head;p-next!=NULL;p=p-next)26if(p-(code[1])==’0’&&p-(code[2])==’2’)27count++;28printf(“%d\n”,count);29return0;30}1.编译后共有3errors,鼠标双击第一个错误,观察源程序中箭头位置,分析错误原因并改正:错误信息::errorC2059:syntaxerror:'(';错误原因:括号不用加;改正方法:把26行中的code[]前后的括号去掉;2.改正上述错误后,再次编译连接后无错误出现。运行程序,输入测试数据。运行出错情况:运行不了对程序中的数据输入及链表建立过程进行单步调试,以查找错误。查错过程:错误原因:没有建立链表;改正方法:删去2021加入p-next=NULL;if(head==NULL){head=p;t=p;}else{t-next=p;t=p;}t=p;要在上面定义一个structnode*t;3.改正上述错误后,链表能够正确建立。再次运行程序。运行结果:没有是否正确:错误对程序中的for循环部分进行单步调试,以查找错误。查错过程:错误原因:for(p=head;p-next!=NULL;p=p-next)错了;改正方法:改为for(p=head;p!=NULL;p=p-next);实验11指针进阶1294.改正上述错误后,再次运行程序,运行结果正确。改错汇总:错误行号:26正确语句:if(p-code[1]==’0’&&p-code[2]==’2’)错误行号:25正确语句:for(p=head;p!=NULL;p=p-next)错误行号:2021正确语句:三.编程题1.输入若干个学生信息(包括学号、姓名和成绩),输入学号为0时输入结束,建立一个单向链表,再输入一个成绩值,将成绩大于等于该值的学生信息输出。输入输出示例1zhang782wang803Li754zhao850802wang804zhao85#includestdio.h#includestdlib.h#includestring.hstructstud_node{intnum;charname[20];intscore;structstud_node*next;};intmain(void){structstud_node*head,*tail,*p;intnum,score;charname[20];intcount;intsize=sizeof(structstud_node);head=tail=NULL;实验11指针进阶130printf(Inputnum,nameandscore:\n);scanf(%d,&num);while(num!=0){p=(structstud_node*)malloc(size);scanf(%s%d,name,&score);p-num=num;strcpy(p-name,name);p-score=score;p-next=NULL;if(head==NULL){head=p;tail=p;}elsetail-next=p;tail=p;scanf(%d,&num);}scanf(%d,&count);for(p=head;p!=NULL;p=p-next){if(p-score=count)printf(%d%s%d\n,p-num,p-name,p-score);}return0;}2.输入若干个正整数(输入-1为结束标志),要求按输入数据的逆序建立一个链表,并输出。输入输出示例1234567-17654321#includestdio.h实验11指针进阶131#includestdlib.h#includestring.hstructstud_node{intnum;structstud_node*next;};structstud_node*Creat_Stu_Doc();voidPtrint_Stu_Doc(structstud_node*head);intmain(){structstud_node*head,*ptr;head=Creat_Stu_Doc();if(head==NULL){printf(NoRecords\n);for(ptr=head;ptr;ptr=ptr-next)printf(%d,ptr-num);printf(\n);}structstud_node*Creat_Stu_Doc(){structstud_node*head,*p;intnum;intsize=sizeof(structstud_node);head=NULL;scanf(%d,&num);while(num!=-1){p=(structstud_node*)malloc(size);p-num=num;p-next=head;head=p;scanf(%d,&num);}returnhead;}实验11指针进阶1323.输入若干个正整数(输入-1为结束标志),并建立一个单向链表,将其中的偶数值结点删除后输出。输入输出示例1234567-11357#includestdio.h#includestdlib.h#includestring.hstructstud_node{intnum;structstud_node*next;};intmain(void){structstud_node*head,*tail,*tempP,*frontP,*deleteP,*p,*t;intnum;intcount;intsize=sizeof(structstud_node);head=tail=NULL;printf(输入数据\n);scanf(%d,&num);while(num!=-1){p=(structstud_node*)malloc(size);p-num=num;p-next=NULL;实验11指针进阶133if(head==NULL){head=p;tail=p;}elsetail-next=p;tail=p;scanf(%d,&num);}tempP=head;while(tempP!=NULL){if(0==tempP-num%2){if(tempP==head){head=tempP-next;}else{//找到偶数的前一个数,该数的next指向偶数的next;for(frontP=head;NULL!=frontP;++frontP)if(frontP-next==tempP){frontP-next=tempP-next;break;}}}deleteP=tempP;tempP=tempP-next;if(deleteP-nu