当前位置: 首页 > article >正文

数据结构--单链表创建、增删改查功能以及与结构体合用

一、作业要求

单链表操作,要求节点是结构体类型,实现以下功能:

1.尾插学生
2.任意位置插入学生
3.任意位置删除学生
4.逆置单链表
5.学生按学号排序
6.销毁单链表
二、实现过程
1.代码如下:

(1)头文件创建

#ifndef _LINK_L_
#define _LINK_L_
#include <myhead.h>
//学生信息结构体
typedef struct
{
	int id;
	char name[20];
}stu,*Stu;
//单链表结构体
typedef struct Link
{
	union 
	{
		int len;
		stu xs;
	};
    struct Link *next;
}links,*Plink;
//创建头节点
Plink create();
//尾插法
int rear_insert(Plink,stu);
//输出函数
int output_link(Plink);
//学生信息输入
Stu input_stu(Stu);
//任意位置插入
int anypos_insert(Plink,int,Stu);
//任意位置删除
int anypos_delete(Plink,int);
//单链表逆置
int rev_stulink(Plink);
//按学号排序
int id_sort(Plink);
//单链表销毁
int link_destroy(Plink);
#endif

(2)主函数编写 

#include "link.h"
int main(int argc, const char *argv[])
{
	int n,pos;
	Stu s=NULL;
	Stu sp=NULL;
	Plink L=create();
    //学生信息管理系统结构
	while(1){
		printf("\t++++++学生管理系统++++++++++\n");
		printf("\t\t1、尾插法\n");
		printf("\t\t2、任意位置插入信息\n");
		printf("\t\t3、任意位置删除信息\n");
		printf("\t\t4、单链表逆置\n");
		printf("\t\t5、学生学号排序\n");
		printf("\t\t6、销毁链表退出系统\n");
		printf("\n");
		int cz=0;
		printf("请输入操作数:");
		scanf("%d",&cz);
		switch(cz){
		case 1:
			//尾插法
			printf("请输入学生个数:");
			scanf("%d",&n);
			s=malloc(sizeof(stu)*n);
			for(int i=0;i<n;i++){
				printf("请输入学生信息:");
				scanf("%d %s",&s[i].id,s[i].name);
			}
			for(int i=0;i<n;i++){
				rear_insert(L,s[i]);
			}
			output_link(L);break;
		case 2:
			//任意位置插入
			printf("请输入要插入位置:");
			scanf("%d",&pos);
			sp=input_stu(sp);
			anypos_insert(L,pos,sp);
			output_link(L);break;
		case 3:
			//任意位置删除
			printf("请输入要删除位置:");
			scanf("%d",&pos);
			anypos_delete(L,pos);
			output_link(L);break;
		case 4:
			//单链表逆置
			rev_stulink(L);
			output_link(L);break;
		case 5:
			id_sort(L);
			output_link(L);
			break;
		case 6:
			//销毁单链表并退出程序
			link_destroy(L);
			return 0;
		}
	}
	return 0;
}

 (3)功能函数编写

#include "link.h"
Plink create()
{
	Plink L=malloc(sizeof(links));
	if(L==NULL)
	{
		printf("创建头节点失败\n");
		return NULL;
	}
	L->next=NULL;
	L->len=0;
	printf("创建成功\n");
	return L;
}
//任意位置删除
int anypos_delete(Plink L,int pos)
{
	if(L==NULL||pos<1||pos>L->len)
	{
		printf("删除失败\n");
		return -1;
	}
	Plink t=L;
    //t指针移至指定节点的前驱
	for(int i=1;i<pos;i++)
		t=t->next;
    //p指针指向要删除节点
	Plink p=t->next;
    //t指针链接要删除节点的后一节点
	t->next=t->next->next;
    //长度-1
	L->len--;
    //释放p节点
	free(p);
	p=NULL;
	return 0;
}
//单链表逆置
int rev_stulink(Plink L)
{
	if(L==NULL||L->len<1)
	{
		printf("逆置失败\n");
		return -1;
	}
    //Q指针指向头节点下一节点
	Plink Q=L->next;
    //t指向Q的下一节点
	Plink t=Q->next;
    //后移直到next指向空
	while(Q->next!=NULL)
	{
        //Q指针指向t节点下一节点
        //单拎t节点
		Q->next=t->next;
        //t节点放到头节点之后
		t->next=L->next;
        //头节点链接t节点
		L->next=t;
        //再次将t指针指向Q节点的下一节点
		t=Q->next;
	}
	return 0;
}
//按学号排序
int id_sort(Plink L)
{
	Plink j=L;
    //遍历次数
	for(int i=1;i<L->len;i++)
	{
        //指针指向头节点后一节点
        //后移直到j指针的next为空
		for(j=L->next;j->next!=NULL;j=j->next)
		{
            //判断学号大小
			if(j->xs.id>j->next->xs.id){
                //结构体内容交换
				stu temp=j->xs;
				j->xs=j->next->xs;
				j->next->xs=temp;
			}
		}
	}
	return 0;
}
//尾插法
int rear_insert(Plink L,stu s)
{
	if(L==NULL)
	{
		printf("插入失败\n");
		return -1;
	}
	Plink t=L;
	for(int i=0;i<L->len;i++)
		t=t->next;
	Plink p=malloc(sizeof(links));
	p->xs.id=s.id;
	strcpy(p->xs.name,s.name);
	p->next=NULL;
	t->next=p;
	L->len++;
	return 0;
}
//输出函数
int output_link(Plink L)
{
	if(L==NULL)
	{
		printf("该链表为空\n");
		return -1;
	}
	Plink t=L;
	for(int i=0;i<L->len;i++)
	{
		t=t->next;
		printf("学号:%d\t姓名:%s\n",t->xs.id,t->xs.name);
	}
	printf("\n");
	return 0;
}
//学生信息输入
Stu input_stu(Stu s)
{
	s=malloc(sizeof(stu));
	printf("请输入学生信息:");
	scanf("%d %s",&s->id,s->name);
	return s;
}
//任意位置插入
int anypos_insert(Plink L,int pos,Stu s)
{
	if(L==NULL||pos<1||pos>L->len+1)
	{
		printf("插入失败\n");
		return -1;
	}
	Plink t=L;
	for(int i=1;i<pos;i++)
		t=t->next;
	Plink p=malloc(sizeof(links));
	p->xs.id=s->id;
	strcpy(p->xs.name,s->name);
	p->next=t->next;
	t->next=p;
	L->len++;
	return 0;

}
//销毁单链表
int link_destroy(Plink L)
{
    //链表为空销毁失败
	if(L==NULL)
	{
		printf("销毁失败\n");
		return -1;
	}
    //t指针指向单链表
	Plink t=L;
	while(L!=NULL)
	{
        //t指针后移
		t=t->next;
        //从头节点开始释放
		free(L);
        //指向t
		L=t;
	}
	printf("销毁成功\n");
	return 0;
}
2.运行结果如图所示:
(1)尾插法插入学生信息

 (2)任意位置插入学生信息

 (3)任意位置删除学生信息

 (4)单链表逆置

 (5)按学号给学生排序

(6)销毁单链表并退出系统


http://www.kler.cn/news/316625.html

相关文章:

  • Java 入门指南:JVM(Java虚拟机)—— 双亲委派模型(Parent Delegation Model)
  • 2024短剧系统开发,付费短剧小程序app源码教程,分销功能讲解搭建上线
  • 【UI自动化】前言
  • 服务器相关问题
  • 机器学习及其应用领域【金融领域】
  • css 控制虚线刻度尺寸
  • 【手写数据库内核组件】1001词法分析器,语言被程序识别的第一步,将语句分解为最小词根token
  • Qt 模型视图(二):模型类QAbstractItemModel
  • 可智能生成刺绣图案!武汉纺织大学可视计算与数字纺织团队发布首个多缝线刺绣生成对抗网络模型,被顶级期刊 TVCG 录用
  • 后端开发刷题 | 最长无重复子数组
  • ArcGIS Pro SDK (十六)公共设施网络 1 网络管理
  • 人工智能与机器学习原理精解【22】
  • 深度学习-16-深入理解BERT基于本地数据微调训练文本分类模型的流程
  • SQL语法学习指南
  • 9月23日
  • Shiro rememberMe反序列化漏洞(Shiro-550) 靶场攻略
  • 水下攻防面试题
  • 『功能项目』QFrameWork拾取道具UGUI【69】
  • 深度学习速通系列:什么是文本数据标注
  • 《SmartX ELF 虚拟化核心功能集》发布,详解 80+ 功能特性和 6 例金融实践
  • 高级大数据开发协会
  • PHP邮件发送教程:如何用PHP发送电子邮件?
  • 4.结构型设计模式 - 第1回:引言与适配器模式 (Adapter Pattern) ——设计模式入门系列
  • Vulkan 学习(8)---- vkImageView 创建
  • 关于SpringBoot项目使用maven打包由于Test引起的无法正常打包问题解决
  • 亲测好用,ChatGPT 3.5/4.0新手使用手册~
  • 振弦式渗压计常见故障有哪些?怎么解决?
  • 探秘淘宝商品详情原数据:主图与数据的神秘获取之旅
  • 盲盒扭蛋机系统开发源码部署
  • LeetCode 滑动窗口 每个字符最多出现两次的最长子字符串