求大神看下这个书上的学生信息管理链表源码
程序代码:
/*用链表实现学生成绩信息的管理*/ #include<stdio.h> #include<stdlib.h> #include<string.h> struct stud_node { int num; char name[20]; int score; struct stud_node *next; }; struct stud_node *Create_Stu_Doc();/*新建链表*/ struct stud_node *InsertDoc(struct stud_node *head,struct stud_node *stud);/*插入*/ struct stud_node *DeleteDoc(struct stud_node *head,int num);/*删除*/ void Print_Stu_Doc(struct stud_node *head);/*遍历*/ int main(void) { struct stud_node *head,*p; int choice,num,score; char name[20]; int size=sizeof(struct stud_node); do { printf("1:添加 2:插入 3:删除 4:打印 0:退出\n"); scanf("%d",&choice); switch(choice) { case 1:head=Create_Stu_Doc();break; case 2:printf("请输入学号,姓名和成绩:\n"); scanf("%d%s%d",&num,name,&score); p=(struct stud_node *)malloc(size); p->num=num; strcpy(p->name,name); p->score=score; head=InsertDoc(head,p); break; case 3: printf("请输入学号:\n"); scanf("%d",&num); head=DeleteDoc(head,num); break; case 4: Print_Stu_Doc(head); break; case 0:break; } }while(choice!=0); return 0; } /*新建链表*/ struct stud_node *Create_Stu_Doc() { struct stud_node *head,*p; int num,score; char name[20]; int size=sizeof(struct stud_node); head=NULL; printf("请输入学号,姓名和成绩:\n"); scanf("%d%s%d",&num,name,&score); while(num!=0) { p=(struct stud_node*)malloc(size); p->num=num; strcpy(p->name,name); p->score=score; head=InsertDoc(head,p);/*调用插入函数*/ scanf("%d%s%d",&num,name,&score); } return head; } /*插入操作*/ struct stud_node *InsertDoc(struct stud_node *head,struct stud_node *stud) { struct stud_node *ptr,*ptr1,*ptr2; ptr2=head; ptr=stud;/*ptr指向待插入的新的学生记录结点*/ /*原链表为空时的插入*/ if(head==NULL) { head=ptr; head->next=NULL; } else/*原链表不为空时的插入*/ { while((ptr->num>ptr2->num)&&(ptr2->next!=NULL)) { ptr1=ptr2;/*ptr1,ptr2各后移一个结点*/ ptr2=ptr2->next; } if(ptr->num<=ptr2->num)/*在ptr1与ptr2之间插入新结点*/ { if(head==ptr2) head=ptr; else ptr1->next=ptr; ptr->next=ptr2; } else/*新插入结点成为尾结点*/ { ptr2->next=ptr; ptr->next=NULL; } } return head; } /*删除操作*/ struct stud_node *DeleteDoc(struct stud_node *head,int num) { struct stud_node *ptr1,*ptr2; /*要被删除结点为表头结点*/ while(head!=NULL && head->num==num) { ptr2=head; head=head->next; free(ptr2); } if(head==NULL)/*链表空*/ return NULL; /*要被删除结点为非表头结点*/ ptr1=head; ptr2=head->next;/*从表头的下一个结点搜索所有符合删除要求的结点*/ while(ptr2!=NULL) { if(ptr2->num==num)/*ptr2所指结点符合删除要求*/ { ptr1->next=ptr2->next; free(ptr2); } else ptr1=ptr2;/*ptr1后移一个结点*/ ptr2=ptr1->next;/*ptr2指向ptr1的后一个结点*/ } return head; } /*遍历操作*/ void Print_Stu_Doc(struct stud_node *head) { struct stud_node *ptr; if(head==NULL) { printf("\nNo Records\n"); return; } printf("\nThe Students' Records Are:\n"); printf("Num\tName Score\n"); for(ptr=head;ptr;ptr=ptr->next) printf("%d\t%s\t%d \n",ptr->num,ptr->name,ptr->score); }
编译一直运行,一直在插入数据。求帮忙,任务是要我们自学链表这章内容。