主题:对链表的综合操作 问题
/* lianbiao.C -- 对链表的综合操作 */
/*建立链表函数如下*/
#include <stdio.h>
#include <malloc.h>
#define NULL 0
#define LEN sizeof(struct student)
struct student
{ long num;
float score;
struct student * next;
};
int n; /*N为全局变量,本文件模块中各函数均可使用它*/
struct student * creat(void) /*定义函数,此函数带回一个指向链表的指针*/
{ struct student * head;
struct student * p1,* p2;
n=0;
p1=p2=(struct student *)malloc(LEN); /*开辟一个新单元*/
scanf("%1d,%f",&p1->num,&p1->score);
head=NULL;
while(p1->num!=0)
{ n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(struct student *)malloc(LEN);
scanf("%1d,%f",&p1->num,&p1->score);
}
p2->next=NULL;
return(head);
}
/*输出链表的函数print*/
void print(struct student * head)
{ struct student * p;
printf("\nnow,these %d records are:\n",n);
p=head;
if(head!=NULL)
do
{ printf("%1d %5.1f\n",p->num,p->score);
p=p->next;
}while(p!=NULL);
}
/*删除结点的函数del如下*/
struct student * del(struct student * head,long num)
{ struct student * p1,* p2;
if(head==NULL)
{ printf("\nlist null! \n");
goto stop1;
}
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:%d\n",num);
n=n-1;
}
else
printf("%1d not been found ! \n",num);/*找不到该节点*/
stop1: return(head);
}
/*插入结点的函数insert如下*/
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);
}
void main()
{ struct student * head,* stu;
long del_num;
printf("input records:\n");
head=creat();
print(head);
printf("\ninput the deleted number:\n");
scanf("%1d",&del_num);
while(del_num!=0)
{ head=del(head,del_num);
print(head);
printf("input the deleted number:");
scanf("%1d",&del_num);
}
printf("\ninput the inserted number:");
stu=(struct student * )malloc(LEN);
scanf("%1d,%f",&stu->num,&stu->score);
while(stu->num!=0)
{ head=insert(head,stu);
print(head);
printf("input the inserted record:");
stu=(struct student * )malloc(LEN);
scanf("%1d,%f",&stu->num,&stu->score);
}
}
以上是对链表的综合操作的源代码,我用Win-Tc试了好几遍 编译没错,死循环...我输入的是10101,90 10103,98 10105,76 0,0 检查不出来了,有路过的大侠指点指点啊![em10]
/*建立链表函数如下*/
#include <stdio.h>
#include <malloc.h>
#define NULL 0
#define LEN sizeof(struct student)
struct student
{ long num;
float score;
struct student * next;
};
int n; /*N为全局变量,本文件模块中各函数均可使用它*/
struct student * creat(void) /*定义函数,此函数带回一个指向链表的指针*/
{ struct student * head;
struct student * p1,* p2;
n=0;
p1=p2=(struct student *)malloc(LEN); /*开辟一个新单元*/
scanf("%1d,%f",&p1->num,&p1->score);
head=NULL;
while(p1->num!=0)
{ n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(struct student *)malloc(LEN);
scanf("%1d,%f",&p1->num,&p1->score);
}
p2->next=NULL;
return(head);
}
/*输出链表的函数print*/
void print(struct student * head)
{ struct student * p;
printf("\nnow,these %d records are:\n",n);
p=head;
if(head!=NULL)
do
{ printf("%1d %5.1f\n",p->num,p->score);
p=p->next;
}while(p!=NULL);
}
/*删除结点的函数del如下*/
struct student * del(struct student * head,long num)
{ struct student * p1,* p2;
if(head==NULL)
{ printf("\nlist null! \n");
goto stop1;
}
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:%d\n",num);
n=n-1;
}
else
printf("%1d not been found ! \n",num);/*找不到该节点*/
stop1: return(head);
}
/*插入结点的函数insert如下*/
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);
}
void main()
{ struct student * head,* stu;
long del_num;
printf("input records:\n");
head=creat();
print(head);
printf("\ninput the deleted number:\n");
scanf("%1d",&del_num);
while(del_num!=0)
{ head=del(head,del_num);
print(head);
printf("input the deleted number:");
scanf("%1d",&del_num);
}
printf("\ninput the inserted number:");
stu=(struct student * )malloc(LEN);
scanf("%1d,%f",&stu->num,&stu->score);
while(stu->num!=0)
{ head=insert(head,stu);
print(head);
printf("input the inserted record:");
stu=(struct student * )malloc(LEN);
scanf("%1d,%f",&stu->num,&stu->score);
}
}
以上是对链表的综合操作的源代码,我用Win-Tc试了好几遍 编译没错,死循环...我输入的是10101,90 10103,98 10105,76 0,0 检查不出来了,有路过的大侠指点指点啊![em10]