前言
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