前言
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;
}
四, 插入/增加數據
void insert_node_by_Head(node* headNode, int data) {
node* newNode= createNode(data);//初始化給此指針賦值(調用的上面的函數)
newNode->next = headNode->next;//新結點指向原來表頭的下一個
headNode->next = newNode;//原來表頭的下一個指向新結點
//相當於都往後橫移了一位;
}
嘿!看圖
這回明白了吧hhhhh
五, 指定位置刪除
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;
}
注:如何在實際項目中運用:這裏的int data改成需要的結構體就可實現;
strcmp()字符串比較函數,兩個字符串是不是一樣的**
稍後我會做一個c++/c萬能的信息管理系統課程設計,
此片贊多了我就上傳,快給主播點點關注hhhhh