.h文件
#ifndef __NA__
#define __NA__
#include <myhead.h>
typedef struct
{
int id;//学号
char name[20];//姓名
float transcript;//成绩
}student;
typedef struct linked
{
union
{
student advice;
int len;
};
struct linked *next;
}liink,*Plink;
//创建头节点
Plink creare();
//头插法
int front_insert(Plink,student);
//任意位置插入
int anypos_insert(Plink,student,int);
//任意位置删除
int anypos_delete(Plink,int);
//逆序
int link_re(Plink);
//排序
int popul_sort(Plink);
//遍历
int output_link(Plink);
//释放
void link_destroy(Plink);
#endif
.h文件
#include "link.h"
//创建头节点
Plink creare()
{
Plink p=malloc(sizeof(liink));
if(p==NULL)
{
printf("申请空间失败\n");
return NULL;
}
p->len=0;
printf("创建链表成功\n");
return p;
}
//头插法
int front_insert(Plink p,student arr)
{
if(p==NULL)
printf("链表异常,插入失败\n");
Plink t=malloc(sizeof(liink));
t->next=p->next;
p->next=t;
t->advice=arr;
p->len++;
//printf("插入完成\n");
return 0;
}
//任意位置插入
int anypos_insert(Plink p,student arr,int n)
{
if(p->next==NULL || p->len<n)
{
printf("链表异常,任意位置插入失败\n");
return -1;
}
Plink t=p;
for(int i=0;i<n;i++)
t=t->next;
Plink m=malloc(sizeof(liink));
m->advice=arr;
m->next=t->next;
t->next=m;
p->len++;
printf("任意位置插入成功\n");
return 0;
}
//任意位置删除
int anypos_delete(Plink p,int n)
{
if(p==NULL || p->len<n)
{
printf("链表异常,任意位置插入失败\n");
return -1;
}
Plink t=p;
for(int i=0;i<n;i++)
t=t->next;
Plink t1=t->next;
t->next=t1->next;
free(t1);
t1=NULL;
p->len--;
printf("任意位置删除成功\n");
return 0;
}
//逆置
int link_re(Plink p)
{
if(p==NULL || p->len<1 )
{
printf("链表异常,逆置失败\n");
return -1;
}
Plink t=p->next;
for(int i=0;i<p->len-1;i++)
{
Plink t1=t->next;
t->next=t1->next;
t1->next =p->next;
p->next=t1;
}
printf("逆置成功\n");
return 0;
}
//排序
int popul_sort(Plink p)
{
if(p==NULL || p->len<1)
{
printf("链表异常,排序失败\n");
return -1;
}
for(int i=0;i<p->len-1;i++)
{
Plink t=p;
for(int m=0;m<p->len-i-1;m++)
{
t=t->next;
Plink t1=t->next;
if(t->advice.transcript>t1->advice.transcript)
{
student test;
test=t->advice;
t->advice=t1->advice;
t1->advice=test;
}
}
}
printf("排序完成\n");
return 0;
}
//遍历输出
int output_link(Plink p)
{
if(p==NULL || p->len<1)
{
printf("链表异常,遍历失败\n");
return -1;
}
Plink t=p;
printf("节点数量%d\n",p->len);
for(int i=0;i<p->len;i++)
{
t=t->next;
printf("第%d个学生学号:%6d,\t姓名:%10s,\t成绩:%3.2f\n",i+1
,t->advice.id
,t->advice.name
,t->advice.transcript);
}
return 0;
}
main.c文件
#include "link.h"
int main()
{
//1、创建单链表
Plink L=creare();
//2、头插法
#if 0
int x;
printf("请输入学生个数:");
scanf("%d",&x);
getchar();
for(int i=0;i<x;i++)
{
student arr1;
printf("请输入第%d个学生学号:",i+1);
scanf("%d",&arr1.id);
getchar();
printf("请输入第%d个学生姓名:",i+1);
scanf("%s",arr1.name);
getchar();
printf("请输入第%d个学生成绩:",i+1);
scanf("%f",&arr1.transcript);
getchar();
front_insert(L,arr1);
}
#endif
student arr1[5]=
{
{1003,"张三",95.678},
{1007,"李四",94.999},
{1002,"王五",98.001},
{1009,"赵三",91.372},
{1005,"孙六",91.999}
};
for(int i=0;i<5;i++)
front_insert(L,arr1[i]);
printf("插入完成\n");
output_link(L);
//任意位置插入
anypos_insert(L,arr1[3],5);
output_link(L);
//任意位置删除
anypos_delete(L,5);
output_link(L);
//逆置
link_re(L);
output_link(L);
//排序
popul_sort(L);
output_link(L);
return 0;
}