1:這里分為兩種插入情況:一種是 插入位置在中間,另一種是插入位置在末尾。兩種情況有一點不同:插入位置在中間時需要把p的原后繼節點的前驅指針指向新插入的節點。

// ConsoleApplication24.cpp : 定義控制台應用程序的入口點。 // #include "stdafx.h" #include<malloc.h> #include <iostream> #include <assert.h> using namespace std; typedef struct DbNode //雙向鏈表結構體 { int data;//節點數據 DbNode *left;//前驅節點指針 DbNode *right;//后繼節點指針 }DbNode; DbNode *CreateNode(int data)//創建一個節點,返回新創建的節點 { DbNode *pnode = (DbNode*)malloc(sizeof(DbNode)); pnode->data = data; pnode->left = pnode->right = pnode;//初始化的節點的前驅和后繼都等於本身的地址 return pnode; } DbNode *CreateList(int head)//創建一個鏈表頭,參數給出表頭節點數據,表頭節點不作為存放有意義數據的節點 { DbNode *pnode= (DbNode*)malloc(sizeof(DbNode)); pnode->data = head; pnode->left = pnode; pnode->right = NULL; return pnode; } /*插入新節點,總是在表尾插入;返回表頭節點*/ DbNode *AppendNode(DbNode *head, int data)//參數1是鏈表的表頭節點,參數2是要插入的節點,其數據為data { DbNode *node = CreateNode(data);//創建數據為data的新節點 DbNode *p = head, *q=NULL; while (p != NULL)//循環結束后,最后一個節點是q,p是q的right { q = p; p = p->right; } /*---在雙向鏈表尾部插入新節點的方法---*/ q->right = node; node->left = q; node->right = NULL; /*---*/ return head; } void PrintList(DbNode *head)//打印整個鏈表 { DbNode *pnode = NULL; if (head == NULL)//鏈表為空 { return; } pnode = head; while (pnode != NULL) { printf("%d", pnode->data); pnode = pnode->right; } printf("\n"); } int GetLength(DbNode *head)//雙向鏈表的測長,參數為鏈表頭節點 { int count = 1; DbNode *pnode = NULL; if (head==NULL)//head為NULL表示鏈表空 { return 0; } pnode = head->right; while (pnode != NULL) { pnode = pnode->right;//使用right指針遍歷 count++; } return count; } /*查找節點,成功返回滿足條件的節點指針,否則返回NULL*/ DbNode *FindNode(DbNode *head, int data)//參數1是鏈表的頭結點,參數2是要查找的節點,其數據為data { DbNode *pnode = head; if (head == NULL)//head為NULL表示鏈表空 { return NULL; } /*找到數據或者到達鏈表末尾,推出while循環*/ while (pnode->right != NULL && pnode->data != data) { pnode = pnode->right;//使用right指針遍歷 } //沒有找到數據為data的節點,返回NULL if (pnode->right == NULL) { return NULL; } return pnode; } /*在node節點之后插入新節點*/ void InserNode(DbNode *node, int data) { DbNode *newnode = CreateNode(data); DbNode *p = NULL; if (node == NULL)//node為NULL時返回NULL { return ; } if (node->right == NULL)//node為最后一個節點 { node->right = newnode; newnode->left = node; } else//node為中間節點 { newnode->right = node->right; node->right->left = newnode; node->right = newnode; newnode->left = node; } } int main() { /*---生成從0-9含有10個節點的循環鏈表---*/ DbNode *head = CreateList(0);//生成鏈表頭 for (int i = 1; i < 10; i++) { head = AppendNode(head, i);//添加9個節點,數據為從1到9 } PrintList(head); cout << "找到數據為2的節點,地址為:" << FindNode(head, 2) << endl; cout << "數據為:" << FindNode(head, 2)->data << endl; InserNode(FindNode(head, 2), 666); cout << "在數據為2的節點后插入666:" << endl; PrintList(head); return 0; }
運行結果: