刚才发的咋回事啊!看不到居然!再发一下
先建立一若干结点(结点数据域的值由键盘输入)构成的单链表,再实现下列操作:(每一功能用一函数实现)11·
从链表的第i个结点开始连删len个结点,若不够个len结点,则从第i个结点开始删到表尾。
22·
在第i个结点之后插入一值为x的结点,并返回成功与否的标志。
以上是题目要求!
以下是我的代码:
程序代码:
[color=#0000FF]#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 i,int len);/*函数声明在i结点开始连删len个结点*/ struct stu *input(struct stu *head,int i,int x);/*函数声明在第i个结点后插入值为x的节点*/ void print(struct stu *head);/*函数声明输出链表数据*/ int i,len,x; printf("请输入相关数据:\n"); while(1) { printf("请输入i和len:\n"); scanf("%d%d",&i,&len); if(i>0&&len>0&&i<=N) break; else continue; } printf("请输入要插入的结点数据x:\n"); scanf("%d",&x); head=creat(head);/*函数掉用建立链表*/ print(head);/*函数调用输出初始链表*/ head=delet(head,i,len);/*函数调用输出删除len个结点后的链表*/ print(head);/*输出删除len个结点后的链表*/ head=input(head,i,x);/*函数调用输出链表*/ 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 i,int len) { struct stu *pointer,*ward,*back;/*结点声明*/ pointer=head;/*设为头结点*/ int j,count=0;/*count为计数器记录删除的结点个数*/ while(j=0;j<i;j++)/*此循环为找到开始删除的那个结点*/ { back=pointer;/*pointer结点的前一结点*/ pointer=pointer->next; } ward=pointer->next;/*从ward结点开始删除*/ if(ward->next==NULL)/*如果back结点是最后一个结点*/ { pointer->next=NULL;/*上一个结点设为尾结点*/ free(ward);/*释放back结点*/ } else if(pointer->next=NULL)/*如果要从最后一个结点开始删*/ { back->next=NULL;/*上一节点为尾结点*/ free(pointer); } else { if(N-i<=len)/*如果从第i个结点开始计算剩余的结点数目小于len*/ { pointer->next=NULL; while(ward->next!=NULL)/*释放后面的结点*/ { ward=ward->next; free(ward); } free(ward);/*释放最后一个结点*/ } else { while(1) { ward=ward->next; free(ward); count++; if(len==count)/*当按要求删完后*/ { pointer->next=back; break; } } } } return head; } /*-------------函数定义插入结点------------*/ struct stu *input(struct stu *head,int i,int x) { struct stu *pointer,*back,*ward,*nextd;/*结点声明*/ int j; ward=(struct stu *)malloc(sizeof(stu));/*开辟新结点*/ ward->num=x;/*把x赋值给新开辟的结点*/ while(j=0;j<i;j++) /*找到要插入的前一位置*/ { back=pointer; pointer=pointer->next; } if(pointer->next=NULL)/*插在表尾*/ { pointer->next=ward; ward->next=NULL; } 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("%d",pointer->num); pointer=pointer->next; printf("\n"); } } 另外这个程序没有实现那个要求插入的那个返回成功的标志:希望谁给完善一下!不胜感激 [/color]