C語言資料結構——連結串列
阿新 • • 發佈:2018-12-15
轉自https://www.cnblogs.com/chenxiaohei/p/6862791.html /* 連結串列節點的插入與刪除
編譯環境:VC++ 6.0 編譯系統:windows XP SP3 */ #include <stdio.h> #include <stdlib.h> #include <malloc.h> // 定義連結串列中的節點 typedef struct node { int member; // 節點中的成員 struct node *pNext; // 指向下一個節點的指標 }Node,*pNode; // 函式宣告 pNode CreateList(); // 建立連結串列函式 void TraverseList(pNode ); // 遍歷連結串列函式 bool Insert_Node(pNode ,int ,int); // 連結串列節點插入函式,第一個引數是頭節點,第二個引數是要在第幾個節點前插入,第三個引數是要插入的資料 int Del_Node(pNode,int ); // 刪除連結串列節點,第一個引數是頭節點,第二個引數是刪除第幾個節點,第三個作為 int main() { pNode pHead = NULL; // 定義初始化頭節點,等價於 struct Node *pHead == NULL int data; // 作為Insert_Node函式的第三個引數 int num; // 作為Inset_Node函式第二個引數 int choose; int return_val; pHead = CreateList(); // 建立一個非迴圈單鏈表,並將該連結串列的頭結點的地址付給pHead printf("你輸入的資料是:"); TraverseList(pHead); // 呼叫遍歷連結串列函式 printf("是否還要進行如下操作:\n"); printf("1.插入資料 2.刪除資料\n"); printf("請輸入:"); scanf("%d",&choose); switch (choose) { case 1: { printf("請輸入要在第幾個節點前插入資料:"); scanf("%d",&num); printf("請輸入要插入的資料:"); scanf("%d",&data); if(Insert_Node(pHead,num,data) == true) { printf("插入成功\n插入後的資料是:\n"); TraverseList(pHead); } else { printf("插入失敗\n"); } printf("操作完成後的資料是:"); TraverseList(pHead); break; } case 2: { printf("請輸入要刪除第幾個節點的資料:"); scanf("%d",&num); return_val = Del_Node(pHead,num); if (return_val == 0) { printf("刪除失敗。\n"); } else { printf("刪除成功。刪除的元素是:%d\n",return_val); } printf("操作完成後的資料是:"); TraverseList(pHead); } } return 0; } // 建立連結串列函式 pNode CreateList() { int i; // 用於下面迴圈 int len; // 用來存放有效節點的字數 int val; // 用於臨時存放使用者輸入的資料 pNode pHead = (pNode)malloc(sizeof(Node)); // 分配一個不存放有效資料的頭結點 pNode pTail = pHead; // 連結串列的最後一個節點 pTail->pNext = NULL; // 最後一個節點的指標置為空 printf("請輸入節點個數:"); scanf("%d",&len); for(i = 0; i < len; i++) { printf("第 %d 個節點的數值:",i+1); scanf("%d",&val); pNode pNew = (pNode)malloc(sizeof(Node)); // 為節點分配空間 pNew->member = val; //將使用者輸入的資料賦給節點的成員 pTail->pNext = pNew; //將最後一個節點的指標指向下一個新的節點 pNew->pNext = NULL; //將新節點中的指標置為空 pTail = pNew; //將新節點賦給最後的一個節點 } return pHead; //返回頭節點 } // 遍歷連結串列函式 void TraverseList(pNode pHead) { pNode p = pHead->pNext; //將頭節點的指標給予臨時節點p while(NULL != p) //節點p不為空,迴圈 { printf("%d ",p->member); p = p->pNext; } printf("\n"); return ; } // 連結串列節點插入函式 // 第一個引數是頭節點,第二個引數是要在第幾個節點前插入,第三個引數是要插入的資料 bool Insert_Node(pNode pHead, int front,int data) { int i = 0; pNode _node = pHead; pNode pSwap; // 用於交換 if ((front < 1) && (NULL != _node)) //判斷使用者輸入的資料是否大於等於1,及_node是否為空 { return false; } while (i < front - 1) //通過迴圈使指標指向要插入哪個節點前的節點。說的自己都不懂了,還是看下面的圖吧。 { _node = _node->pNext; ++i; } pNode pNew = (pNode)malloc(sizeof(Node)); pNew->member = data; // 把輸入的資料賦給要插入的節點 pSwap = _node->pNext; // 把下一個節點的地址,給用於交換的pSwap _node->pNext = pNew; // 把要插入的節點的地址,給上個節點的指標域 pNew->pNext = pSwap; // 把插入節點的下一個節點的地址,給插入節點的指標域 return true; } // 刪除連結串列節點函式 // 第一個引數是頭節點,第二個引數是要刪除第幾個節點·······和上面的插入函式是不是很像 int Del_Node(pNode pHead,int back) { int i = 0; int data; pNode _node = pHead; pNode pSwap; if ((back < 1) && (NULL == _node->pNext)) { printf("刪除失敗!\n"); return 0; } while(i < back-1) { _node = _node->pNext; ++i; } pSwap = _node->pNext; data = pSwap->member; _node->pNext = _node->pNext->pNext; free(pSwap); return data;}