链表结构及操作
什么是鏈表結(jié)構(gòu):
? 鏈表結(jié)構(gòu)是由許多節(jié)點(diǎn)構(gòu)成的,每個(gè)節(jié)點(diǎn)都包含兩部分:
鏈表的特點(diǎn):
鏈表的優(yōu)點(diǎn):
?
鏈表的缺點(diǎn):
?
?
在進(jìn)行鏈表操作時(shí),首先需要定義一個(gè)頭指針變量(head表示),該指針變量指向鏈表的第一個(gè)節(jié)點(diǎn)。
最后一個(gè)節(jié)點(diǎn)不再指向其他節(jié)點(diǎn)(單鏈表),稱為表尾。
?
單鏈表:
鏈表數(shù)據(jù)表示:
typedef struct {char key[10]; //關(guān)鍵字char name[20];int age; }Data; //數(shù)據(jù)節(jié)點(diǎn)類型typedef struct Node {Data nodeData; //數(shù)據(jù)域struct Node *nextNode; //指針域 }CLType;?
添加節(jié)點(diǎn)步驟:
? ?添加鏈表實(shí)現(xiàn)代碼:
//在鏈表尾添加節(jié)點(diǎn) CLType *CLAddEnd(CLType *head, Data nodeData) {CLType *node, *htemp;node = new CLType;if (!node){std::cout << "內(nèi)存申請(qǐng)失敗." << std::endl;return NULL;}else{node->nodeData = nodeData; //保存數(shù)據(jù)node->nextNode = nullptr; //將節(jié)點(diǎn)置為NULL,當(dāng)前插入位置為表尾if (head == nullptr){head = node; return head;}htemp = head;while (htemp->nextNode != nullptr) //查找鏈表的末尾{htemp = htemp->nextNode;}htemp->nextNode = node; //修改指針域把鏈表連接起來(lái)return head;} }在鏈表頭插入頭節(jié)點(diǎn)步驟:
? 1 .首先分配內(nèi)存空間,保存新增節(jié)點(diǎn)。
? 2 .使新增節(jié)點(diǎn)指向頭指針 head所指向的節(jié)點(diǎn)。
? 3 .然后使頭指針 head指向新增節(jié)點(diǎn)。
//在鏈表頭插入節(jié)點(diǎn) CLType *CLAddFirst(CLType *head, Data nodedata) {CLType *node = new CLType;if (!node) //內(nèi)存分配失敗{std::cout << "內(nèi)存申請(qǐng)失敗!" << std::endl;return nullptr;}else{node->nodeData = nodedata; //保存數(shù)據(jù)node->nextNode = head; //指向頭指針?biāo)腹?jié)點(diǎn)head = node; //頭指針指向新增節(jié)點(diǎn)return head;} }?
查找節(jié)點(diǎn):
??
?
//查找節(jié)點(diǎn) CLType *CLFindNode(CLType *head, char *key) {CLType *htemp;htemp = head; //保存鏈表頭指針while (htemp) //若節(jié)點(diǎn)有效,則進(jìn)行循環(huán)查找{if (strcmp(htemp->nodeData.key, key) == 0) //若節(jié)點(diǎn)關(guān)鍵字與傳入關(guān)鍵字相同{return htemp; //return 該節(jié)點(diǎn)指針}htemp = htemp->nextNode; //進(jìn)行迭代查找}return nullptr; //不存在,返回空指針 }?
隨機(jī)插入節(jié)點(diǎn)步驟:
?1 .首先分配內(nèi)存,保存新增節(jié)點(diǎn)。
?2 .找到要插入的邏輯位置,也就是要插入某兩個(gè)節(jié)點(diǎn)之間。
?3 .修改插入位置的節(jié)點(diǎn)指針,使其指向新增節(jié)點(diǎn),而使新增節(jié)點(diǎn)指向原插入位置所指向的節(jié)點(diǎn)
?
//隨機(jī)插入節(jié)點(diǎn) CLType *CLinsertNode(CLType *head, char *findkey, Data nodedata) {CLType *node, *nodetemp; node = new CLType; //分配保存的節(jié)點(diǎn)內(nèi)存if (!node) //內(nèi)存分配失敗{std::cout << "內(nèi)存申請(qǐng)失敗." << std::endl; return nullptr;}node->nodeData = nodedata; //保存節(jié)點(diǎn)中的數(shù)據(jù)nodetemp = CLFindNode(head, findkey); if (nodetemp) //若找到要插入的節(jié)點(diǎn){node->nextNode = nodetemp->nextNode; //新插入節(jié)點(diǎn)指向關(guān)鍵節(jié)點(diǎn)的下一節(jié)點(diǎn)nodetemp->nextNode = node; //設(shè)置關(guān)鍵節(jié)點(diǎn)指向新插入節(jié)點(diǎn)}else{std::cout << "未找到正確的插入位置." << std::endl;delete node; //釋放內(nèi)存}return head; //返回頭指針 }?刪除節(jié)點(diǎn)步驟:
?1 .查找要?jiǎng)h除的節(jié)點(diǎn)
?2 .使前一節(jié)點(diǎn)指向當(dāng)前節(jié)點(diǎn)下一節(jié)點(diǎn)
?3 .刪除節(jié)點(diǎn)
//刪除節(jié)點(diǎn) int CLDeleteNode(CLType *head, char *key) {CLType *node, *htemp; //node保存刪除節(jié)點(diǎn)的前一節(jié)點(diǎn)htemp = head;node = head;while (htemp){if (strcmp(htemp->nodeData.key, key) == 0) //找到關(guān)鍵字,執(zhí)行刪除操作{node->nextNode = htemp->nextNode; //使前一節(jié)點(diǎn)指向當(dāng)前節(jié)點(diǎn)的下一節(jié)點(diǎn)delete htemp; //釋放內(nèi)存return 1;}else{node = htemp; //指向當(dāng)前節(jié)點(diǎn)htemp = htemp->nextNode; //指向下一節(jié)點(diǎn)}}return 0; //刪除失敗 }?
計(jì)算鏈表長(zhǎng)度
//計(jì)算鏈表長(zhǎng)度 int CLLength(CLType *head) {CLType *htemp;int len = 0;htemp = head;while (htemp) //遍歷鏈表{len++; //累計(jì)節(jié)點(diǎn)數(shù)htemp = htemp->nextNode; //處理下一節(jié)點(diǎn)}return len; //return 節(jié)點(diǎn)數(shù) }?
顯示所有節(jié)點(diǎn):
//顯示所有節(jié)點(diǎn) void CLAllNode(CLType *head) {CLType *htemp;Data nodeData;htemp = head;std::cout << "當(dāng)前鏈表共有: " << CLLength(head) << "個(gè)節(jié)點(diǎn),鏈表數(shù)據(jù)如下: "<<std::endl;while (htemp){nodeData = htemp->nodeData;std::cout << "節(jié)點(diǎn): " << nodeData.key << " " << nodeData.name << " " << nodeData.age << std::endl;htemp = htemp->nextNode;} }?
main 函數(shù):
int main() {CLType *node, *head = nullptr;Data nodeData;char key[10], findkey[10];cout << "請(qǐng)輸入鏈表中的數(shù)據(jù),格式為: 關(guān)鍵字 姓名 年齡 " << endl;do {cin >> nodeData.key;if (strcmp(nodeData.key, "0") == 0)break; //若輸入為0,則退出else{cin >> nodeData.name>>nodeData.age;head = CLAddEnd(head, nodeData);}} while (1);CLAllNode(head);cout << " 輸入插入位置的關(guān)鍵字: ";cin >> findkey;cout << "輸入插入節(jié)點(diǎn)的數(shù)據(jù)(關(guān)鍵字 姓名 年齡 ): \n";cin >> nodeData.key >> nodeData.name >> nodeData.age;head = CLinsertNode(head, findkey, nodeData);CLAllNode(head);cout << "刪除節(jié)點(diǎn),輸入要?jiǎng)h除的關(guān)鍵字: " << endl;cin >> key;CLDeleteNode(head, key);CLAllNode(head);cout << "查找關(guān)鍵字,輸入要查找的關(guān)鍵字: " << endl;cin >> key;node = CLFindNode(head, key);if (node){nodeData = node->nodeData;cout << "關(guān)鍵字" << key << " 對(duì)應(yīng)的節(jié)點(diǎn)為" << key << nodeData.key << nodeData.name << nodeData.age;}else{cout << "未找到關(guān)鍵字";}cout << endl;system("pause");return 0; }?
測(cè)試結(jié)果:
?
總結(jié)
- 上一篇: 银河麒麟(linux arm64)安装新
- 下一篇: uniapp 修改全局字体