链表的综合应用.
nbsp; /*删除结点的函数*/////////////////////////////////////////////////////////*/函数的类型是指向struct student类型数据的指针,它的值是链表的头指针。函数参数为head和要删除的学号num。head的值可能在函数执行过程中被改变(当删除第一个结点时)。struct student *del(struct student *head,long num){ struct student *p1,*p2; if (head==NULL) {printf("\n list null! \n"); goto end; } p1=head; while (num!=p1->num&&p1->next!=NULL)/*p1指向的不是所要找的结点,并且后面还有结点*/ {p2=p1; p1=p1->next;} /*p1后移一个结点*/ if (num==p1->num) /*找到了*/ { if (p1==head)head=p1->next; /*若p1指向的是首结点,把第二个结点地址赋予head*/ else p2->next=p1->next; /*否则将下一结点地址赋给前一结点地址*/ printf("delete:%ld\n",num); n=n-1; } else printf("%ld not been found! \n",num); /*找不到该结点*/end: return (head);} /*结点的插入************************///////////////////////////////////*/函数参数是head和stud。Stud也是一个指针变量,从实参传来待插入结点的地址给stud。语句“p0=stud;”的作用是使p0指向待插入的结点。函数类型是指针类型,函数值是链表起始地址head.struct student *insert(struct student *head,struct student *stud){ struct student *p0,*p1,*p2; p1=head; /*使p1指向第一个结点*/ p0=stud; /*p0指向要插入的结点*/ if (head==NULL) /*原来的链表是空表*/ {head=p0; p0->next=NULL;} /*使p0指向的结点作为头结点*/ else { while ((p0->num>p1->num)&&(p1->next!=NULL)) {p2=p1; /*使p2指向刚才p1指向的结点*/ p1=p1->next; /*p1后移一个结点*/ } if (p0->num<=p1->num) {if (head==p1)head=p0; /*插到原来第一个结点之前*/ else p2->next=p0; /*插入到p2结点之后*/ p0->next=p1;} else {p1->next=p0;p0->next=NULL;} /*插到最后的结点之后*/ } n=n+1; /*结点数加1*/ return(head);}&