建立完整的單向鏈表
#include<stdio.h> #include<stdlib.h> typedef struct node { int data;//數據部分 struct node *next;//指針部分 }Node; typedef Node List; //初始化鏈表 List* initList(); //銷毀鏈表 void destoryList(List *list); //插入數據 void insertData(List *list,int Data); //刪除數據 void removeData(List *list,int Data); //查找數據 Node* findData(List *list,int Data); //打印鏈表內容 void printList(List *list); int main() { //初始化鏈表 List *list = initList(); //插入數據 for(int i=0; i<10; i++) { insertData(list,i); } printList(list); //查找數據 printf("5的地址:%p\n",findData(list,5)); printf("10的地址:%p\n",findData(list,10)); //刪除數據 removeData(list,0); printList(list); //銷毀鏈表 destoryList(list); return 0; } //初始鏈表 List* initList() { List *list = (List*)malloc(sizeof(Node)); list->data = 0; list->next = NULL; return list; } //銷毀鏈表 void destoryList(List *list) { Node *pHead = list;//用來記錄初始化的鏈表頭結點 while(list != NULL) { //先移到下一個結點 list = list->next; //釋放頭結點 free(pHead); //記錄新的頭結點 pHead = list; } } //插入數據(一般都在表尾插入數據) void insertData(List *list,int Data) { //先分配一個新的結點 Node *pNode = (Node*)malloc(sizeof(Node)); pNode->data = Data; pNode->next = NULL; //將新結點鏈接到到尾部 while(list->next != NULL) { list = list->next;//先找到鏈表的尾結點 } list->next = pNode;//將新結點鏈接到尾結點 } //刪除數據(頭結點不可刪除,不然后面的結點就無法再進行遍歷了) void removeData(List *list,int Data) { //1.查找結點,並記錄上一個結點 //Node *pPre = NULL; Node *pPre = list; list = list->next;//跳過頭結點 while(list!= NULL) { if(list->data == Data) { break; } pPre = list; list = list->next; } if(list!=NULL) { //2.找到后,將上一個結點和當前結點的下一個結點鏈接 pPre->next = list->next; //3.刪除當前結點 free(list); } } //查找數據 Node* findData(List *list,int Data) { while(list!= NULL) { if(list->data == Data) { break; } list = list->next; } return list; } //打印鏈表內容 void printList(List *list) { list = list->next;//跳過頭結點 while(list!= NULL) { printf("%5d",list->data); list = list->next; } printf("\n"); }