回复 10楼 sunyh1999
嘿嘿!好的!劳您费心了哈!我把那个死循环的问题解决了现在!现在还在修改中
#include<stdio.h> #include<stdlib.h> #define N 5 /*控制结点数*/ struct stu { int num;/*学号*/ struct stu *next; }stu[N]; void main() { struct stu *head;/*结点声明*/ struct stu *creat(struct stu *head);/*函数声明建立链表*/ struct stu *delet(struct stu *head,int r,int len);/*函数声明在i结点开始连删len个结点*/ struct stu *input(struct stu *head,int r,int x);/*函数声明在第i个结点后插入值为x的节点*/ void print(struct stu *head);/*函数声明输出链表数据*/ int r,len,x; printf("请输入相关数据:\n"); while(1) { printf("请输入r和len:\n"); scanf("%d%d",&r,&len); if(r>0&&len>0&&r<=N) break; else continue; } printf("请输入要插入的结点数据x:\n"); scanf("%d",&x); head=creat(head);/*函数掉用建立链表*/ printf("输出初始链表:\n"); print(head);/*函数调用输出初始链表*/ head=delet(head,r,len);/*函数调用输出删除len个结点后的链表*/ printf("输出删除len个结点后的结点:\n"); print(head);/*输出删除len个结点后的链表*/ head=input(head,r,x);/*函数调用插入链表*/ printf("输出插入结点后的链表:\n"); print(head);/*函数调用输出插入x结点后的链表*/ } /*-------------函数定义建立链表------------*/ struct stu *creat(struct stu *head) { struct stu *thisp,*newp; head=NULL;/*置空表*/ int i; printf("输入四个学生的信息:\n");/*建立链表*/ for(i=0;i<N;i++) { newp=(struct stu *)malloc(sizeof(stu)); if(head==NULL) head=newp; else { thisp=head; while(thisp->next!=NULL) thisp=thisp->next; thisp->next=newp;/*指向新开辟的节点*/ } thisp=newp; printf("学号为%d的学生的信息\n",i+1); printf("学号:\n"); scanf("%d",&thisp->num); thisp->next=NULL; } return head; } /*-----------函数定义删除题目要求的结点---------*/ struct stu *delet(struct stu *head,int r,int len) { struct stu *pointer,*ward,*back,*zh;/*结点声明*/ pointer=head;/*设为头结点*/ int j,count=0;/*count为计数器记录删除的结点个数*/ for(j=0;j<r;j++)/*此循环为找到开始删除的那个结点*/ { back=pointer;/*pointer结点的前一结点*/ pointer=pointer->next; } if(pointer->next==NULL)/*如果出循环时就只想了链表尾*/ return head; else ward=pointer->next;/*从ward结点开始删除*/ if(ward->next==NULL)/*如果ward结点是最后一个结点*/ { pointer->next=ward->next;/*上一个结点设为尾结点*/ free(ward);/*释放ward结点*/ } if(N-r<=len)/*如果从第i个结点开始计算剩余的结点数目小于len*/ { while(ward->next!=NULL)/*释放后面的所有结点*/ { ward=ward->next; free(ward); } pointer->next=ward->next; free(ward);/*释放最后一个结点*/ } else/*如果要删的len个数小于剩下的结点数*/ { while(1) { zh=ward; ward=ward->next; pointer->next=ward->next; free(zh); count++; if(len==count)/*当按要求删完后*/ { break; } } } return head; } /*-------------函数定义插入结点------------*/ struct stu *input(struct stu *head,int r,int x) { struct stu *pointer,*back,*ward,*nextd;/*结点声明*/ int j; ward=(struct stu *)malloc(sizeof(stu));/*开辟新结点*/ ward->num=x;/*把x赋值给新开辟的结点*/ for(j=0;j<r;j++) /*找到要插入的前一位置*/ { back=pointer; pointer=pointer->next; } if(pointer->next=NULL)/*插在表尾*/ { ward->next=pointer->next; pointer->next=ward; } else/*插在pointer和nextd结点之间*/ { nextd=pointer->next; ward->next=nextd; pointer->next=ward; } return head; } /*---------------输出链表---------------*/ void print(struct stu *head) { struct stu *pointer;/*结点声明*/ pointer=head;/*设为头结点*/ while(pointer!=NULL) { printf("%2d",pointer->num); pointer=pointer->next; } printf("\n"); }这是我改后的代码!不过还是不行!我都技穷了啊!