例:用表尾添加法编写函数建立一个链表,存放若干名学生的数据,直到输入的学号是“0”为止。
#include "stdio.h"
#include "stdlib.h"
struct stu_node // 定义结构体类型
{ int num ;
float score ;
struct stu_node*next ;
};
#define LEN sizeof(struct stu_node) //求出结构体类型占用的字节数
一、建表
struct stu_node *creat( void ) //函数返回值为链表的头指针
{ struct stu_node *p1, *p2, *head=NULL;
p1=p2=(struct stu_node *) malloc(LEN); //令p1、p2指向新结点
scanf("%d%f",&p1->num,&p1->score); //输入新结点数据成员
while ( p1->num !=0 ) //判断新结点的学号是否为0
{ if ( head==NULL ) //若头指针为空,则令头指针指向表头结点
head = p1;
else
p2->next = p1; //否则令当前表尾结点指针成员指向新结点
p2 = p1; //p2指向新的表尾结点
p1= ( struct stu_node *) malloc (LEN); //p1指向新结点
scanf("%d%f",&p1->num,&p1->score) ;
}
p2->next= NULL; //表尾结点的指针成员赋空值
free(p1); //释放p1指向的结点空间
return(head); //返回头指针
}
二、输出链表
编写函数输出链表中所有结点的数据成员的值
void list(struct stu_node *head)
{ struct stu_node *p;
if (head==NULL) printf(“链表为空!\n”);
else
{ printf(“链表信息如下:\n”);
p=head; //p赋值为head,即p指向表头结点
while(p!=NULL)
{ printf("%d, %5.2f\n", p->num,p->score);
p=p->next; //令p指向下一个结点
}
}
}
三、链表结点的删除操作
编写函数删除链表中的结点。
struct stu_node *del (struct stu_node*head, int num)
{ struct stu_node *p1 , *p2=NULL ;
if (head==NULL) printf("链表为空不能进行删除操作!\n");
else
{ p1 = head; //p1指向表头结点
while((num!=p1->num)&& (p1->next!=NULL))
{ p2 = p1; //p2指向p1所指向的结点
p1= p1->next ; //p1指向下一个结点
}
if ( num == p1->num ) //判断p1是否指向要删除的结点
{ if (p1==head) head = p1->next; //删除表头结点
else p2->next = p1->next; //删除中间或表尾结点
free(p1); //释放已删除的结点空间
printf("结点已删除! \n");
}
else printf("链表中不存在该结点, 不能删除!\n");
}
return head;
}
通过使用循环, 可以不断删除结点, 直到用户输入字符’n’为止
int main(void)
{ struct stu_node *head; intdelnum;
char ch=’y’;
head=creat(); list(head);
printf(“进行删除结点操作\n”);
while(ch==’y’||ch==’Y’)
{ printf(“输入要删除学生的学号:”);
scanf(“%d”,&delnum); getchar( );
head=del (head, delnum);
printf(“继续删除其他学生的信息吗?(y/n):”);
ch=getchar( ); //读取字符’y’或字符’n’
getchar( ); //空读,读取回车符
}
printf(“删除后的学生信息:\n”);
list(head);
return 0;
}
四、链表结点的插入操作
编写函数实现向有序链表中插入一个结点
struct stu_node *insert ( struct stu_node *head )
{ struct stu_node *p0 , *p1 , *p2 ;
p0=( struct stu_node *) malloc (LEN); //p0指向产生的新结点
p0->next = NULL; //p0指针成员赋NULL
printf("输入学号和成绩:");
scanf("%d%f",&p0->num,&p0->score); //输入数据成员
getchar( ); //空读,读取回车符
if (head==NULL) head = p0; //链表为空时,令head指向新结点
else //链表不为空时,执行以下插入操作
{ p1 = head; //p1 指向表头结点
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; // p0的指针成员指向p1
}
else p1->next = p0; //插入表尾结点
}
return( head );
}