【数据结构】链表定义及其常用的基本操作(C/C++)

news2024/11/18 9:38:38


 目录

●图示 

●链表类型定义

●常用的基本操作(单链表)

●简单案例


●图示 


  ●链表类型定义

1.单链表存储结构的定义

typedef struct lnode{
	elemtype data;
	struct lnode *next;
}lnode,*linklist; 

定义链表L:linklist &L;

定义结点指针:lnode *p;

实例如下:

        ①数据和链表结构的第一种定义方法

typedef struct student{
	char num[8];
	char name[8];
	int score;
	struct student *next;
}lnode,*linklist;

        ②将数据和链表结构第二种定义方法

typedef struct{
	char num[8];
	char name[8];
	int score;
}elemtype;
typedef struct lnode{
	elemtype date;
	struct lnode *next;
}lnode,*linklist;

2. 带尾指针循环链表的合并(将单链表的头尾用指针进行相连)

linklist connect(linklist ta,linklist tb)
{
    p=ta->next;
	ta->next=tb->next->next;
	delete tb->next;
	tb->next=p;
	return tb;	
} 

3.双向链表结构的定义

typedef struct lnode{
    elemtype data;
	struct lnode *prior,*next;	
}lnode,*linklist;

●常用的基本操作(单链表)

1.链表的初始化

void initlist(linklist &L)
{
	L = new lnode;
	L->next = NULL;
}

2. 判断链表是否为空

int listempty(linklist& L)
{
	if (L->next)
		return 0;
	else
		return 1;
}

3. 单链表的销毁

int destorylist(linklist& L)
{
	lnode* p;
	while (L != NULL)
	{
		p = L;
		L = L->next;
		delete p;
	}
	return 1;
}

4. 单链表的清空

int clearlist(linklist& L)
{
	lnode* p;  //结点指针
	lnode* q;
	p = L->next;
	while (p)
	{
		q = p->next;
		delete p;
		p = q;
	}
	L->next = NULL;
	return 1;
}

5. 求链表表长

int listlength(linklist& L)
{
	lnode* p;
	p = L->next;
	int i = 0;
	while (p)
	{
		i++;
		p = p->next;
	}
	return 1;
}

6. 取单链表中第i个元素的内容 

int getelem(linklist& L, int i, elemtype e)
{
	lnode* p;
	p = L->next;
	int j = 1;
	while (p && j < i)
	{
		p = p->next;
		j++;
	}
	if (!p || j > i)
	{
		return 0;
	}
	e = p->data;
	return 1;
}

7. 在第i个结点前插入值为e的新结点

int listinsert(linklist& L, int i, elemtype e)
{
	lnode* p;
	p = L;
	int j = 0;
	while (p && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (!p || j > i - 1)
	{
		return 0;
	}
	linklist s;
	s = new lnode;
	s->data = e;
	s -> next = p -> next;
	p -> next = s;
	return 1;
}

8. 删除第i个结点

int listdelete(linklist& L, int i, elemtype e)
{
	lnode* p;
	lnode* q;
	p = L;
	int j = 0;
	while (p->next&&j<i-1)
	{
		p = p->next;
		j++;
	}
	if (!(p->next) || j > i - 1)
	{
		return 0;
	}
	q = p->next;
	p->next = q->next;
	e = q->data;
	delete q;
	return 1;
}

9. 头插法

void createlist_H(linklist &L,int n)
{
	linklist p;
	for(i=n;i>0;i--)
	{
	p=new lnode;
	cin>>p->date; //输入数据
	p->next=L->next;
	L->next=p;	
	} 
}

10.尾插法

void create_R(linklist &L,int n)
{
	linklist p;
    linklist r;
	r=L;
	while(i=0;i<n;i++)
	{
	p=new lnode;	
	cin>>p->date;  //输入数据
	p->next=NULL; 
	r->next=p;
	r=p;	
	}	
} 

●简单案例

(这里只实现用顺序表存储3个学生的学号、姓名、年龄并且将其输出查看。若进行其他操作,对代码进行简单修改即可)

#include<iostream>
using namespace std;
//数据的准备
typedef struct {
	char key[10];
	char name[20];
	int age;
}elemtype;
typedef struct lnode {
	elemtype data;
	struct lnode* next;
}lnode,*linklist;
//链表的初始化
void initlist(linklist &L)
{
	L = new lnode;
	L->next = NULL;
}
//判断链表是否为空
int listempty(linklist& L)
{
	if (L->next)
		return 0;
	else
		return 1;
}
//单链表的销毁
int destorylist(linklist& L)
{
	lnode* p;
	while (L != NULL)
	{
		p = L;
		L = L->next;
		delete p;
	}
	return 1;
}
//单链表的清空
int clearlist(linklist& L)
{
	lnode* p;  //结点指针
	lnode* q;
	p = L->next;
	while (p)
	{
		q = p->next;
		delete p;
		p = q;
	}
	L->next = NULL;
	return 1;
}
//求链表表长
int listlength(linklist& L)
{
	lnode* p;
	p = L->next;
	int i = 0;
	while (p)
	{
		i++;
		p = p->next;
	}
	return 1;
}
//取单链表中第i个元素的内容 
int getelem(linklist& L, int i, elemtype e)
{
	lnode* p;
	p = L->next;
	int j = 1;
	while (p && j < i)
	{
		p = p->next;
		j++;
	}
	if (!p || j > i)
	{
		return 0;
	}
	e = p->data;
	return 1;
}
//在第i个结点前插入值为e的新结点	
int listinsert_L(linklist& L, int i, elemtype e)
{
	lnode* p;
	p = L;
	int j = 0;
	while (p && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (!p || j > i - 1)
	{
		return 0;
	}
	linklist s;
	s = new lnode;
	s->data = e;
	s -> next = p -> next;
	p -> next = s;
	return 1;
}
//删除第i个结点
int listdelete(linklist& L, int i, elemtype e)
{
	lnode* p;
	lnode* q;
	p = L;
	int j = 0;
	while (p->next&&j<i-1)
	{
		p = p->next;
		j++;
	}
	if (!(p->next) || j > i - 1)
	{
		return 0;
	}
	q = p->next;
	p->next = q->next;
	e = q->data;
	delete q;
	return 1;
}
//头插法
void createlist_H(linklist& L, int n)
{
	linklist p;
	for (int i = n; i > 0; i--)
	{
		p = new lnode;
		cin >> p->data.key;
		cin >> p->data.name;
		cin >> p->data.age;
		p->next = L->next;
		L->next = p;
	}
}
//尾插法
void create_R(linklist& L, int n)
{
	linklist p;
	linklist r;
	r = L;
	for(int i = 0; i < n; i++)
	{
		p = new lnode;
		cin >> p->data.key;
		cin >> p->data.name;
		cin >> p->data.age;
		p->next = NULL;
		r->next = p;
		r = p;
	}
}
//查询所有结点
void listall(linklist& L,int n)
{
	lnode* p;
	p = L->next;
	for(int i=1;i<=n;i++)
	{ 
		cout << p->data.key << " "<<p->data.name <<" "<< p->data.age << endl;
	    p=p->next;
    }
}
void showfunc()
{
	cout << "1.单链表的初始化" << endl;
	cout << "2.判断单链表是否为空" << endl;
	cout << "3.单链表的销毁" << endl;
	cout << "4.单链表的清空" << endl;
	cout << "5.求单链表表长" << endl;
	cout << "6.取单链表中第i个元素的内容" << endl;
	cout << "7.在第i个结点前插入值为e的新结点" << endl;
	cout << "8.删除第i个结点" << endl;
	cout << "9.头插法" << endl;
	cout << "10.尾插法" << endl;
	cout << "11.查询顺序表所有结点" << endl;
}
void text()
{
	linklist ll;
	while(1)
	{ 
		showfunc();
		cout << "#要执行的操作#" << endl;
		int n;
		cin >> n;
		switch (n)
		{
		int num;
		case 1:
			initlist(ll);
			cout << "初始化成功" << endl;
			break;
		case 10:
			cout << "要输入的学生数:" << endl;
			cin >> num;
			createlist_H(ll, num);
			cout << "输入成功" << endl;
			break;
		case 11:
			listall(ll,num);
			break;
		}
		system("pause");
		system("cls");  //每执行一次操作清一次屏
	}
}
int main()
{
	text();
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows系统服务器如何架设网站

Windows系统服务器如何架设网站 架设网站我们的需服务器必须要有iis功能&#xff0c;我们随便找个网站素材进行搭建 大家跟着我的步骤操作就可以啦 下面我们以Windows server 2008系统为例 右键我的电脑----管理-----角色-----web服务器&#xff08;iis&#xff09; Internet信…

值得一看!从0编写一份PID控制代码

【推荐阅读】 浅析linux 系统进程冻结&#xff08;freezing of task&#xff09; 深入linux内核架构--进程&线程 纯干货&#xff0c;linux内存管理——内存管理架构&#xff08;建议收藏&#xff09; 轻松学会linux下查看内存频率,内核函数,cpu频率 概述Linux内核驱动之GPI…

Servlet与表单、数据库综合项目实战【学生信息管理】

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;JAVA开发者…

开关电源环路稳定性分析(07)——电压型补偿网络

大家好&#xff0c;这里是大话硬件。 在前面的文章中&#xff0c;已经分析了控制级和功率级的传递函数&#xff0c;这一节咱们来分析反馈级的传递函数。 在分析反馈网络的传递函数之前&#xff0c;我想&#xff0c;应该有几个问题需要做一下介绍。 1. 功率级和控制级传递函数…

游戏开发41课 unity shader 优化

Shader有专门语言用来编写&#xff0c;常见类型有DirectX的HLSL&#xff0c;OpenGL的GLSL以及NVIDIA的Cg&#xff0c;为了优化shader代码&#xff0c;我们需要知道代码从被编写到被执行的流程&#xff0c;知道什么样的代码是不好的。 注意点&#xff1a; 避免if、switch分支语…

关于前端低代码的一些个人观点

2022&#xff0c;低代码彻底火了&#xff0c;甚至火到没有点相关经验&#xff0c;都不好意思出去面试的程度&#xff0c;堪称lowcode“元年”。在整个互联网大裁员的背景下&#xff0c;无论你是否相信它是降本提效的利器&#xff0c;彷佛都不重要了。因为行业趋势总是这般浩浩荡…

为什么其他地方的智能网联汽车产业都跟着北京模式走?

随着新一轮科技革命和产业变革加速演进&#xff0c;智能网联汽车已成为全球汽车产业发展的战略方向&#xff0c;是全球大国竞争的重要科技和产业领域。在技术路线层面&#xff0c;我国率先提出车路云融合的智能网联汽车“中国方案”&#xff0c;该路线已逐步成为国际共识。在产…

大学生端午节网页作业制作 学生端午节日网页设计模板 传统文化节日端午节静态网页成品代码下载 端午节日网页设计作品

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【云原生】二进制k8s集群(下)部署高可用master节点

内容预知 本次部署说明 本次部署的架构组件 1. 新master节点的搭建 1.1 对master02 进行初始化配置 1.2 将master01的配置移植到master02 2.负载均衡的部署 3. k8s的web UI界面的搭建 二进制部署k8s集群部署的步骤总结 &#xff08;1&#xff09;k8s的数据存储中中心的搭建…

Spring项目建立过程

1&#xff0c;导入依赖 导入Spring依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency> 2&#xff0c;实现部分 2.1 自动给我们请求返回一个登录页面&am…

【计算机网络】物理层

物理层考虑的是在各种传输媒体上传输比特流&#xff0c;而不是指具体的传输媒体。物理层作用是尽可能地屏蔽媒体之间的差异。 物理层的主要任务是描述与传输媒体有关的一些特性&#xff1a; 机械特性、电气特性、功能特性、过程特性。 数据通信系统可分为&#xff1a;源系统、…

攻击类型分析

攻击类型分析 2018 年&#xff0c;主要的攻击类型 1 为 SYN Flood&#xff0c;UDP Flood&#xff0c;ACK Flood&#xff0c;HTTP Flood&#xff0c;HTTPS Flood&#xff0c; 这五大类攻击占了总攻击次数的 96&#xff05;&#xff0c;反射类攻击不足 3%。和 2017 年相比&…

Vue系列之组件化

文章の目录一、组件化开发思想1、现实中的组件化思想体现2、编程中的组件化思想体现3、组件化规范: Web Components二、组件注册1、全局组件注册语法2、组件语法3、组件注册注意事项4、局部组件注册写在最后一、组件化开发思想 1、现实中的组件化思想体现 标准分治重用组合 2…

k8s网络策略

网络策略介绍 网络策略官方文档&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/ 网络策略是控制Pod之间如何进行通信的规则&#xff0c;它使用标签来筛选Pod&#xff0c;并在该组Pod之上定义规则来定义管控其流量&#xff0c;…

何为Spring Batch?怎么玩?

何为批处理&#xff1f; 何为批处理&#xff0c;大白话讲就是将数据分批次进行处理的过程。比如&#xff1a;银行对账&#xff0c;跨系统数据同步等。这些处理逻辑一般来说都不需要人工参与就能够自动高效地进行复杂的数据处理与分析。 典型批处理特点&#xff1a; 自动执行&…

ubuntu下使用vscode开发golang程序,从控制台到简单web程序

最近项目要使用go语言开发一个web程序&#xff0c;由于是第一次使用go开发&#xff0c;就将开发过程中的点滴做个记录吧。 1.安装go 1.1 安装 Ubuntu下安装go语言开发运行环境有如下两种方法 &#xff08;1&#xff09;方法一&#xff1a;使用命令 sudo apt install golan…

天天刷 B站,了解他们的评论系统是如何设计的吗?

今天给大家分享 B站的评论系统的 组件化、平台化建设 通过持续演进架构设计&#xff0c;管理不断上升的系统复杂度&#xff0c;从而更好地满足各类用户的需求。 基础功能模块 评论的基础功能模块是相对稳定的。 1. 发布评论&#xff1a;支持无限盖楼回复。 2. 读取评论&am…

异步编程解决方案 Promise

1. 回调地狱 2. Promise 的使用 3. Promise 的状态 4. Promise 的结果 5. Promise 的 then 方法 6. Promise 的 catch 方法 7. 回调地狱的解决方案 1. 回调地狱 回调地狱: 在回调函数中嵌套回调函数 因为 ajax 请求是异步的&#xff0c;所以想要使用上一次请求的结果作为请求…

ADI Blackfin DSP处理器-BF533的开发详解21:RTC实时时钟的原理及应用(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 ADSP-BF53x 处理器上集成了一个实时时钟&#xff08;RTC&#xff09;模块&#xff0c;板卡上设计了一个专门用于 RTC 时钟源的晶体32.7…

如何修复错误:无法下载 metadata repo appstream

如何修复错误&#xff1a;无法下载 metadata repo appstream 如果您出于某种原因仍在积极使用CentOS 8&#xff0c;您可能在尝试更新系统或只是安装软件包时遇到以下错误。 Error: Failed to download metadata for repo appstream: Cannot prepare internal mirrorlist: No …