单链表 【增删改查功能 】【头插/尾插】(超详细版)

前言
1,此为头插法/尾插法线性表链式结构
2,涉及到了单链表的增删改查
3.可以照搬的c++/c的信息管理系统项目中
4.简单易学,完成课设
实现步骤
一, 创建结构体

#include <iostream>
using namespace std;
//结点类
class node{
	public:
		int data;//数据空间
		node* next;//指针域
};

二, 创建空链表

//创建链表(头插法)
node* creatList() {
	node* headNode = new node;
	//headNode 成为了结构体变量
	//变量使用前必须初始化
	//headNode->data=1;
	headNode->next = NULL;
	return headNode;
}

三, 创建结点

//创建结点
node* createNode(int data) {

	node* newnode = new node;//给newnode开辟(申请)一个空间,
	//相当于(struct node* )malloc(size of(struct node));
	newnode->data = data;
	newnode->next = NULL;
	return newnode;
}

四, 插入/增加数据
4.1(头插法)

void insert_node_by_Head(node* headNode, int data) {
	node* newNode= createNode(data);//初始化给此指针赋值(调用的上面的函数)
	newNode->next = headNode->next;//新结点指向原来表头的下一个
	headNode->next = newNode;//原来表头的下一个指向新结点
	//相当于都往后横移了一位;
}

嘿!看图
这回明白了吧hhhhh
在这里插入图片描述
4.2(尾插法)

void insert_node_by_Last(node* lastNode, int data) {
	node* newNode =createNode(data);//要插入的结点

	node* tmp = lastNode;
	while (tmp->next) {    //指针向后移动(如果为空,就跳出循环了)
						  //目的:直到指向表尾跳出
		tmp = tmp->next;   //指针的向后移动
	}
	tmp->next = newNode;//找到表尾后插入新结点数据
}

五, 指定位置删除

void deleNode(node* headNode, int posData) {
	node* posNode = headNode->next;//初始化
	node* posNodeFront = headNode;
	if (posNode == NULL)
		cout << "无法删除,链表为空" << endl;
	else {
		while (posNode->data != posData) {//如果要找的数据不等于现在的数据就一直往下找
			posNodeFront = posNode;//前面结点到后面结点的位置
			posNode = posNodeFront->next;//后面结点位置到原来位置的next
			if (posNode == NULL) {
				cout << "未找到相关信息,无法删除" << endl;
				break;//return()直接结束掉函数也可
			}
		}
		posNodeFront->next = posNode->next;//前面结点的next指向后一个结点的next(中间的结点已经删除)
		free(posNode);//释放空间
	}
}

六,查找

node* sreachData(node* headNode, int posdata) {
	node* pMove = headNode->next;
	while (pMove != NULL && pMove->data != posdata) {//如果pMove没有指向空:没到表尾
	//与上指针没找到指定数据就一直循环。两个条件必须全部满足才可以
		pMove = pMove->next;
	}
	return pMove;
}

六, 打印出输出

//遍历(打印)
void printlist(node* headNode) {
	node* pMove = headNode->next;
	while (pMove) {
		cout << pMove->data<<"\t";
		pMove = pMove->next;
	}
	cout << endl;
}

主函数

int main()
{
	node* list = creatList();
	insert_node_by_Head(list,1);
	insert_node_by_Head(list, 2);
	insert_node_by_Head(list, 3);
	insert_node_by_Head(list, 4);
	insert_node_by_Head(list, 5);
	printlist(list);
	deleNode(list, 2);
	printlist(list);
	cout << sreachData(list, 3)->data << endl;

	system("pause");
	return 0;
}

下面是完整代码(可运行)

#include "pch.h"
#include <iostream>

using namespace std;
class node{
	public:
		int data;//数据空间
		node* next;//指针域
};
//创建链表(头插法)
node* creatList() {
	node* headNode = new node;
	//headNode 成为了结构体变量
	//变量使用前必须初始化
	//headNode->data=1;
	headNode->next = NULL;
	return headNode;
}
//创建结点
node* createNode(int data) {
	node* newnode = new node;
	newnode->data = data;
	newnode->next = NULL;
	return newnode;
}
void insert_node_by_Head(node* headNode, int data) {
	//创建插入结点
	node* newNode= createNode(data);
	newNode->next = headNode->next;//新结点指向原来表头的下一个
	headNode->next = newNode;//原来表头的下一个指向新结点
}
//指定位置删除
void deleNode(node* headNode, int posData) {
	node* posNode = headNode->next;//初始化
	node* posNodeFront = headNode;
	if (posNode == NULL)
		cout << "无法删除,链表为空" << endl;
	else {
		while (posNode->data != posData) {//如果要找的数据不等于现在的数据就一直往下找
			posNodeFront = posNode;//前面结点到后面结点的位置
			posNode = posNodeFront->next;//后面结点位置到原来位置的next
			if (posNode == NULL) {
				cout << "未找到相关信息,无法删除" << endl;
				break;//return()直接结束掉函数也可
			}
		}
		posNodeFront->next = posNode->next;//前面结点的next指向后一个结点的next(中间的结点已经删除)
		free(posNode);
	}
}
//查找
node* sreachData(node* headNode, int posdata) {
	node* pMove = headNode->next;
	while (pMove != NULL && pMove->data != posdata) {
		pMove = pMove->next;
	}
	return pMove;
}
//遍历(打印)
void printlist(node* headNode) {
	node* pMove = headNode->next;
	while (pMove) {
		cout << pMove->data<<"\t";
		pMove = pMove->next;
	}
	cout << endl;
}
int main()
{
	node* list = creatList();
	insert_node_by_Head(list,1);
	insert_node_by_Head(list, 2);
	insert_node_by_Head(list, 3);
	insert_node_by_Head(list, 4);
	insert_node_by_Head(list, 5);
	printlist(list);
	deleNode(list, 2);
	printlist(list);
	cout << sreachData(list, 3)->data << endl;

	system("pause");
	return 0;
}

补充:修改函数

//修改
node* alter(node* posnode, int posdata) {
	int newdata;//新数据
	node* pMove = posnode->next;
	while (pMove != NULL && pMove->data != posdata) {//直接找要修改的结点
		pMove = pMove->next;						//找到后跳出循环
	}
	cout << "请输入新值:" << endl;//此时已经找到要修改的结点
	cin >> newdata;//输入新值
	pMove->data = newdata;
	return pMove;//注意:这里是要返回的结点,而不是那个data,(看函数属性)

注:如何在实际项目中运用:这里的int data改成需要的结构体就可实现;
strcmp()字符串比较函数,两个字符串是不是一样的
**

稍后我会做一个c++/c万能的信息管理系统课程设计,
此片赞多了我就上传,快给主播点点关注hhhhh

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值