定义一个结构体:
typedef struct stu
{
char num[10];
char name[12];
float score;
struct stu *next;
}STU;
创建链表函数:
STU *create_link(STU *head,STU *p_new)
{
STU *p_mov=head;
if(head==NULL)
{
head=p_new;
p_new->next=NULL;
}
else
{
while(p_mov->next!=NULL)
p_mov=p_mov->next;
p_mov->next=p_new;
p_new->next=NULL;
}
return head;
}
遍历链表函数:
void print_link(STU *head)
{
STU *p_mov=head;
if(head==NULL)
printf("链表为空!\n");
else
{
while(p_mov!=NULL)
{
printf("\t%-5s %-6s %4.1f\n",p_mov->num,p_mov->name,p_mov->score);
p_mov=p_mov->next;
}
}
}
链表查找函数:
void find_link(STU *head,char *name)
{
int flag=1;
STU *p_mov=head;
if(head==NULL)
printf("链表为空!\n");
else
{
while(p_mov!=NULL)
{
if(!strcmp(p_mov->name,name))
{
printf(" %s %s %.1f\n",p_mov->num,p_mov->name,p_mov->score);
flag=0;
}
p_mov=p_mov->next;
}
if(flag)
printf("没有找到信息!\n");
}
}
删除链表节点函数:
STU *delete_link(STU *head,char *name)
{
int flag=0;
STU *p_mov=head,*p_front=head;
if(head==NULL)
printf("链表为空!\n");
else
{
while(p_mov!=NULL)
{
if(!strcmp(p_mv->name,name))
{
flag=1;
break;
}
p_front=p_mov;//把要删除的节点前一个节点缓存一下
p_mov=p_mov->next;
}
if(flag)
{
if(p_mov==head)
head=p_mov->next;
else
p_front->next=p_mov->next;//把删除的节点的前一个节点指向后一个节点
free(p_mov);
}
else
printf("没有找到信息!\n");
}
return head;
}
插入链表节点函数:
STU *insert_link(STU *head,STU *p_in)
{
STU *p_mov=head,*p_front=NULL;
if(head==NULL)
printf("链表为空!\n");
else
{
while(strcmp(p_in->num,p_mov->num)==1&&p_mov->next!=NULL)
{
p_front=p_mov;
p_mov=p_mov->next;
}
if(strcmp(p_in->num,p_mov->num)!=1)
{
if(head==p_mov)//在链表头部插入
{
p_in->next=head;
head=p_in;
}
else //在链表中间插入
{
p_front->next=p_in;
p_in->next=p_mov;
}
}
else //在链表末尾插入
{
p_mov->next=p_in;
p_in->next=NULL;
}
}
return head;
}
释放链表函数:
STU *free_link(STU *head)
{
STU *p_mov=head,*p_temp=NULL;
if(head==NULL)
printf("链表为空!\n");
else
{
while(p_mov!=NULL)
{
p_temp=p_mov->next; //先存放到别的地方
free(p_mov);
p_mov=p_temp; // 释放后再还回来
}
}
return NULL;
}
链表排序函数:
STU *sort_link(STU *head)
{
STU temp;
STU *p_mov=head,*p_front=head;
if(head==NULL)
printf("链表为空!\n");
else
{
while(p_front!=NULL)
{
p_mov=p_front->next;
while(p_mov!=NULL)
{
if(p_mov->score<p_front->score)
{
//把结构体所有成员进行交换
temp=*p_mov;
*p_mov=*p_front;
*p_front=temp;
//把指针域再交换回来
temp.next=p_mov->next;
p_mov->next=p_front->next;
p_front->next=temp.next;
}
p_mov=p_mov->next;
}
p_front=p_front->next;
}
}
return head;
}