9.23数据结作业

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值