完成单链表操作,要求节点构造类型。
1、建立学生结构体(学号,姓名,成绩)
2、循环调用头插法创建整表
3、遍历单链表
4、任意位置插入一个完整的学生信息
5、任意位置删除一个学生。
6、单链表逆置
7、单链表按照学生成绩排序。
stu.h
#ifndef __STUD__
#define __STUD__
#include<myhead.h>
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
//定义学生结构体
typedef struct
{
int id;
char name[20];
int score;
}stud;
//定义单链表结构体
typedef struct student
{
union
{
stud data;
int len;
};
struct student *next;
}Link,*Plink;
//创建头节点
Plink create();
//头插法
int front_insert(Plink,stud);
//遍历输出函数
int output_link(Plink L);
//任意位置插入
int anypos_insert(Plink,int,stud);
//任意位置删除
int anypos_dele(Plink,int);
//逆置单链表
int reverse(Plink);
//冒泡排序
int buble_sort(Plink);
#endif
stu.c
#include "stu.h"
//创建头节点
Plink create()
{
//申请动态内存
Plink p=malloc(sizeof(Link));
if(NULL==p)
{
printf("申请失败\n");
return NULL;
}
//长度初始化为0,表尾指向空
p->len=0;
p->next=NULL;
//返回头结点
return p;
}
//头插法
int front_insert(Plink L,stud e)
{
//判断单链表是否存在
if(NULL==L)
{
printf("插入失败\n");
return -1;
}
//为需要插入的节点申请空间
Plink p=malloc(sizeof(Link));
//为节点数据赋值
p->data=e;
//连线
//插入节点的指针域指向头节点后一个节点
p->next=L->next;
//头节点指向插入节点
L->next=p;
//节点长度自增
L->len++;
return 0;
}
//输出函数
int output_link(Plink L)
{
//定义一个节点变量用来遍历节点
Plink t=L;
for(int i=0;i<L->len;i++)
{
t=t->next;
printf("%d\t%s\t%d\n",t->data.id,t->data.name,t->data.score);
}
return 0;
}
//任意位置插入
int anypos_insert(Plink L,int pos,stud e)
{
//判断插入条件是否满足
if(NULL==L||pos<1||pos>L->len)
{
printf("插入失败\n");
return -1;
}
Plink t=L;
//遍历至需要插入位置的前驱
for(int i=0;i<pos-1;i++)
{
t=t->next;
}
Plink p=malloc(sizeof(Link));
p->data=e;
//插入节点的指针域指向原位置节点
p->next=t->next;
//前驱的指针域指向p
t->next=p;
L->len++;
return 0;
}
//任意位置删除
int anypos_dele(Plink L,int pos)
{
if(NULL==L||pos<1||pos>L->len||L->len==0)
{
printf("删除失败\n");
return -1;
}
Plink t=L;
for(int i=0;i<pos-1;i++)
{
t=t->next;
}
//保留需要删除的节点
Plink Q=t->next;
//跳过需要删除的节点
t->next=t->next->next;
L->len--;
//释放空间并置空
free(Q);
Q=NULL;
return 0;
}
//逆置单链表
int reverse(Plink L)
{
if(L==NULL||L->len<=1)
{
printf("无需逆序\n");
return -1;
}
//定义两个节点变量用于遍历单链表
//Q为原链表的第一个节点,t为Q后面一个节点
Plink Q=L->next;
Plink t=Q->next;
while(t!=NULL)
{
//先将Q节点与t后面一个节点相连
Q->next=t->next;
//将t节点移动到第一位
t->next=L->next;
//头结点指向t
L->next=t;
//保持t节点为Q后面一个节点
t=Q->next;
}
return 0;
}
//冒泡排序
int buble_sort(Plink L)
{
if(NULL==L||L->len<=1)
{
printf("无需排序\n");
return -1;
}
//定义两个变量遍历单链表
Plink i,j;
for(i=L->next;i->next!=NULL;i=i->next)
{
for(j=L->next;j->next!=NULL;j=j->next)
{
//根据成绩从小到大排序
if(j->data.score>j->next->data.score)
{
//定义学生结构体变量用于交换数据
stud temp=j->data;
j->data=j->next->data;
j->next->data=temp;
}
}
}
return 0;
}
main.c
#include "stu.h"
int main(int argc, const char *argv[])
{
//初始化学生结构体数据
stud m[4]={
{2005,"张三",95},
{2002,"李华",76},
{2004,"刘能",68},
{2001,"王五",82}
};
//创建头节点
Plink L = create();
//函数调用
for(int i=0;i<4;i++)
{
front_insert(L,m[i]);
}
output_link(L);
printf("***********************************\n");
//定义一个结构体元素
stud e1={2003,"赵四",86};
anypos_insert(L,3,e1);
output_link(L);
printf("***********************************\n");
anypos_dele(L,3);
output_link(L);
printf("***********************************\n");
reverse(L);
output_link(L);
printf("***********************************\n");
buble_sort(L);
output_link(L);
return 0;
}