#include<stdafx.h>
#include<stdlib.h>
typedef struct student
{ int num ;
int score ;
struct student *next ;
}ST;
#define LEN sizeof(ST)
int n;
ST *creat(void)
{
ST *p1,*p2,*head=NULL;
int n=0;
p1=(ST *) malloc (LEN); //产生一个新结点
if(p1==NULL)
{
printf("\n No enough memory!\n");exit(0);
}
scanf("%d %d",&p1->num,&p1->score);
while ( p1->num!=0 )
{
n=n+1;//结点个数加1
if(n==1)head=p1;//若n等于1,则p1当前所指向的是表头结点
else p2->next=p1;
p2=p1;//让指针p2指向p1所指向的结点
p1=(ST *) malloc (LEN);//p1指向新产生的结点
if(p1==NULL)
{
printf("\n No enough memory!\n");exit(0);
}
scanf("%d %d",&p1->num, &p1->score);
}
p2->next =NULL; //表尾结点的指针成员赋为空
free(p1);//释放p1所指向的结点空间
return(head);
}
void list(ST *head)
{
ST *p;
p=head;
while (p!=NULL)
{
printf("%d,%d\n",p->num,p->score);
p=p->next ;
}
}
ST *del(ST *head, int num)
{
ST *p,*q=NULL;
p=head;
while((num!=p->num)&&(p->next!=NULL))
{
q=p;
p=p->next;
}
if(num==p->num)
{
if(p==head)head=p->next;//删除结点为表头结点
else q->next=p->next;//删除结点为表尾结点或中间结点
free(p); //释放已删除的结点空间
n=n-1; //链表的结点个数减1
printf("deleted ! \n");
}
else printf("can not delete!\n");
return(head);//返回链表的头指针
}
ST *insert(ST *head)
{
ST *p0,*p1,*p2;
p1=head;
p0=(ST*)malloc(LEN);
scanf("%d%d",&p0->num,&p0->score);
if(head==NULL)//如果是空链表,则新结点是链表的表头结点
{
head=p0;
p0->next=NULL;
}
else
{
while((p0->num>p1->num)&&(p1->next!=NULL))
{
p2=p1;
p1=p1->next;
}//找到要插入结点的位置
if(p0->num<=p1->num)
{
if(head==p1)head=p0;//插入结点作表头结点
else p2->next=p0;//插入结点作中间结点
p0->next=p1;
}
else
{
p1->next=p0;p0->next=NULL;
}//插入结点作表尾结点
}
n++;//链表的结点个数加1
return( head ) ;
}
void main()
{
ST *h=NULL;
h=creat();
list(h);
h=del(h,2);
list(h);
h=insert(h);
list(h);
}
数据结构实训二Debug
最新推荐文章于 2021-11-28 14:22:28 发布