回复 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");
}
这是我改后的代码!不过还是不行!我都技穷了啊!