困擾了很久的數據結構重新拾起來,參考博客大牛的文章,思考出一點自己的理解,希望給在學習數據結構這條路上的兄弟姐妹有所幫助,也為自己家能夠理清思路。廢話不多說,直接上代碼。
所需頭文件如下並且屏蔽安全警告:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<malloc.h>
首先聲明鏈表的數據類型,習慣方法如下:
typedef struct ListNode { int data; // 數據域,存放數據 struct ListNode* Next; // 指向下一個鏈表節點 }Node, *PNode;
這里有兩點需要注意一下:1、如果是cpp文件,結構體中的struct ListNode * Next可寫為ListNode* Next;2、這里使用了宏typedef關鍵字,則Node和PNode為新聲明的數據類型名稱,類似於已有的int,char,double等。Node是結構體類型,PNode是結構體指針類型,如需了解結構體移步另外一篇文章。
接下來看鏈表創建函數定義
PNode CreateList(void) { int len; // 用於定義鏈表長度 int val; // 用於存放節點數值 PNode PHead = (PNode)malloc(sizeof(Node)); // 創建分配一個頭節點內存空間 //頭節點相當於鏈表的哨兵,不存放數據,指向首節點(第一個節點) if (PHead == NULL) // 判斷是否分配成功 { printf("空間分配失敗 \n"); exit(-1); } //指向鏈表尾部的指針,個人認為PTail是在棧空間上的,是一個輔助指針,用於連接新的節點 PNode PTail = PHead; // 鏈表的末尾節點,初始指向頭節點 PTail->Next = NULL; // 最后一個節點指針置為空 printf("請輸入節點個數:"); scanf("%d", &len); // 輸入節點個數 for (int i = 0; i < len; i++) { PNode pNew = (PNode)malloc(sizeof(Node)); // 分配一個新節點 if (pNew == NULL) { printf("分配新節點失敗\n"); exit(-1); } printf("請輸入第 %d 個節點的數據:", i + 1); scanf_s("%d", &val); // 輸入鏈表節點的數據 pNew->Element = val; // 把數據賦值給節點數據域 PTail->Next = pNew; // 末尾節點指針指向下一個新節點,連接新的節點 pNew->Next = NULL; // 新節點指針指向為空 PTail = pNew; // 將新節點復制給末尾節點 ,將PTail指向尾節點 } printf("創建鏈表成功\n" ); return PHead; // 返回頭節點 }
最后看主函數
int main() { PNode List = CreateList(); //創建一個指針,使其指向新創建的鏈表的頭指針 return 0; }