基于C++的单链表操作 创建,增删查改,遍历 双向链表

系列文章目录



前言

文章建议复制到编译器查看学习,因为注释和讲解都在代码上。
运行环境:Dev_C++,vs2019

博主最近在学习数据结构,学到链表类知识,想自己用代码实践一下,参考了网上一些文章,发现讲解的多,代码部分少且不精简,始终觉得只有自己能独立敲出代码后,该部分知识才是真的学到了,就想发自己写单链表部分的程序在论坛上,以供自己与他人学习之用。文章以代码为主题,讲解为辅,解释都在注释行中了。秉承程序设计按高类聚低耦合的原则,将各功能都封装为函数了。

提示:以下是本篇文章正文内容,下面案例可供参考

一、代码示例。

示例:

#include<iostream>
using namespace std;
/*
单链表的基本操作
该例的链表排序以0开始
以输入 9 4 8 6 22 11 为例
*/
struct List {
	int data;//链表的数据
	List* next;//链表的next指针
};

int main() {
	//创建一个头指针
	void create(List * );//创建一个指针链表,传入头指针
	void through(List * );//遍历整个链表
	void insert(List *,int n,int new_date);//插入在第几个节点后面插入,插入数据为new_date的数据
	void List_delete(List *,int n);//删除第n个位置的节点
	void find(List * p, int n);//查找第n个节点
	void change(List * p, int n, int new_date);//修改第n个节点

	List head;
	head.data = 0;
	head.next = NULL;
	List* p = &head;

	create(p);
	through(p);
	insert(p, 4, 7);//为第四个位置后新加一个节点,该节点的数据成员为7
	cout << endl;
	through(p);
	cout << endl;
	List_delete(p, 5);//删除第4个节点
	through(p);
	find(p, 5);//查找位置5的数据
	change(p, 2,99);//修改位置2的节点值为99

	through(p);//遍历链表查看结果

	
	return 0;
}
void create(List* phead) {//传入头结点
	//假设创建一个6长的链表
	List* p = phead;

	for (int i=0;i<6;i++) {
	      
		List* new_p = new List; //创建一个新节点
		cin >> new_p->data;	   //设置节点内的数据		
		new_p->next = NULL;
		
		p->next = new_p;//让指向头结点的指针,指向下一个节点
		p = new_p;

		
	}
}

void through(List *phead) {
	List* p = phead;
	int i=0;
	while (1) {
		p = p->next;//从第一个节点输出
		cout << "第" << i << "个节点:";
		
		cout << p->data << "   ";
		if (i % 5 == 4) cout << endl;//输出5个换行
		
		++i;
		if (p->next == NULL) break;
	 
	}
	cout << endl;


}
void insert(List* phead,int n,int new_date ) {
	List* p = phead;
	for (int i = 0; i <=n; i++) {
		p = p->next;
	}
	List* new_p = new List;//创建一个新结点,赋值给新结点
	new_p->data = new_date;
	new_p->next = p->next;//新结点指向n+1节点

	p->next = new_p;//将新节点连起来

}

void List_delete(List* phead,int n) {
	List* p = phead;
	
	for (int i=0;i<n-1;i++) {
		p = p->next; //定位到要删除结点的前一个节点
	}
	
	p->next = p->next->next;//将上个节点的next指向删除节点的后一个,绕过它

}
void find(List* phead, int n){
	List* p = phead;
	for (int i=0;i<=n;i++) {
		p = p->next;  //使p到这个位置
	}
	cout << "第" << n << "个节点是:" << p->data << endl;

}

void change(List *phead,int n,int new_data) {
	List* p = phead;
	for (int i=0;i<=n;i++) {
		p = p->next;
	}
	p->data = new_data;//修改这个节点值

}

二、结果展示

1.定义的函数和全局变量

在这里插入图片描述

2.链表的创建

creat(List *p)函数

在这里插入图片描述

3.链表的遍历

through(List *)函数

在这里插入图片描述

4.插入

void insert(List *,int n,int new_date);//插入在第几个节点后面插入,插入数据为new_date的数据

在这里插入图片描述

5.删除

void List_delete(List *,int n);//删除第n个位置的节点

在这里插入图片描述

6.查找

void find(List * p, int n);//查找第n个节点
在这里插入图片描述

7.修改

void change(List * p, int n, int new_date);//修改第n个节点
在这里插入图片描述

三、双向链表

双向链表的基本操作与单链表差不多,所以这里仅给出添加,删除,创建,展示,求长度这五个函数
总的:
在这里插入图片描述

源代码

#include<iostream>
typedef int Datatype;
using namespace std;
typedef struct List {
	Datatype  data;
	List* prior;//前节点
	List* next;
};

int main() {
	void create(List * phead, Datatype n);//创建
	int InsertDList(List * L, int index, Datatype x);//插入
	void show(List * L);//打印数据
	int  deletDList(List * L, int index, Datatype * e);//删除

	int T=0;//存下被删除的值

	List head;//创建头结点
	head.data = 0;
	head.next = NULL;
	head.prior = NULL;

	create(&head,5);
	
	InsertDList(&head, 3, 100);

	show(&head);

	cout << "以下为删除" << endl;

	deletDList(&head, 4, &T);
	show(&head);




	return 0;
}
int InsertDList(List *L,int index,Datatype x) {//在第index个位置插入值为X的节点 index:下标
	int i = 0;
	List* p = L,* temp;
	while (1) {
		if (p->next == NULL) 	break;
		i++;
		p = p->next;
	}
	if (index<=0 || index>i) {
		cout << "插入位置错误";
		return -1;
	}

	temp= L;//让指针再指回L
	for (int j=0;j<index-1;j++) {//循环到插入位置前一个节点
	temp = temp->next;
	}

	List* new_node = new List;//创建一个新结点
	
	new_node->data = x;//将新结点指向下一个
	new_node->next = temp->next;
	new_node->prior = temp;

	temp->next = new_node;//移位

}



void create(List* phead, Datatype n) {//传入头节点和,创建链表的多少
	List* p = phead;
	for (int i = 0; i < n; i++) {
		List *new_node = new List;
		
		cin >> new_node->data;//初始化新结点
		new_node->next = NULL;
		new_node->prior = p;

		p->next = new_node;//指向新结点

		p = p-> next;//移位


	}
}
void show(List *L) {
	int i = 0;
	List* p = L;
	while (1) {
		cout << "第" << i << "位:" << p->data<< endl;
		p = p->next;
		i++;
		if (p== NULL) break;
	}
}

int  deletDList(List *L,int index,Datatype *e) {//删除下标为index的值,将被删除值保存到e
	int lenthDList(List * L);
	List* p = L,*p1=L;
	
	
	

	if (index <= 1 || index > (lenthDList(p))) {
		cout << "删除位置错误" << endl;
		return -1;
	}
	for (int i=0;i<index-1;i++) {//定位节点指向index
	
		p = p->next;
	}
	cout << "p:" << p->data;

	if (p->next==NULL) {//是为节点
		p->prior->next = NULL;//将前一个节点指向空
		*e = p->data;//保存值
		delete p;
		return 1;
	}
	else { 
		
		p->next->prior = p->prior;//将链表指向更改
		p->prior->next = p->next;
		*e = p->data;
		delete p;
		return 1;

	}
	



}

int lenthDList(List *L) {
	List* p = L;
	int i = 0;
	while (1) {
		if (p->next == NULL) break;
		i++;

		p = p->next;

	}
	return i;

}

运行结果演示:
这里是创建一个5长的双向链表
在第3位添加100
在第4位删除100
的操作截图
在这里插入图片描述


总结

本例的链表操作均未涉及到空链表的细节操作,主要是为了掌握大体逻辑,编写的程序。 如果对你有用,点个

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值