单向链表基础操作

完成单链表操作,要求节点构造类型。

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值