数据结构-链表:对链表进行初始化、增删改查
生活随笔
收集整理的這篇文章主要介紹了
数据结构-链表:对链表进行初始化、增删改查
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
廢話少說,先上代碼:
#include <stdio.h> #include <stdlib.h>typedef struct Node {int data;struct Node* pNext; }NODE,*PNODE;PNODE create_list(void); //初始化鏈表 void traverse_list(PNODE pHead); //為鏈表添加元素 bool is_empty(PNODE pHead); //判斷是否為空鏈表 int length_list(PNODE pHead); //求鏈表的長度 void sort_list(PNODE pHead); //排序 bool insert_list(PNODE pHead, int pos, int val); //插入 bool delete_list(PNODE pHead, int val); //刪除int main(void) {int length;PNODE pHead = NULL;pHead = create_list();traverse_list(pHead);if (is_empty(pHead)){printf("鏈表是空鏈表!\n");}else{printf("鏈表不是空鏈表!\n");}length = length_list(pHead);printf("排序后鏈表為:\n");sort_list(pHead);traverse_list(pHead);insert_list(pHead, 3, 3);printf("在鏈表第三個元素前插入3之后得到的鏈表為:\n");traverse_list(pHead);delete_list(pHead, 3);printf("刪除鏈表中數字域存儲為3的值得到的鏈表為:\n");traverse_list(pHead);return 0; }PNODE create_list(void) {int length;int i;int value;PNODE pHead = (PNODE)malloc(sizeof(NODE));if (pHead == NULL){printf("內存分配失敗!");exit(1);}PNODE pTail = pHead;pTail->pNext = NULL;printf("請輸入鏈表的有效長度:\n");scanf_s("%d", &length);for (i = 0; i < length; i++){printf("請輸入第%d個元素的值:\n", i + 1);scanf_s("%d", &value);PNODE pNew = (PNODE)malloc(sizeof(NODE));if (pNew == NULL){printf("內存分配失敗!");exit(1);}pNew->data = value;pTail->pNext = pNew;pNew->pNext = NULL;pTail = pNew;}return pHead; }void traverse_list(PNODE pHead) {PNODE p = pHead->pNext;while (p != NULL){printf("%d ", p->data);p = p->pNext;}putchar('\n'); }bool is_empty(PNODE pHead) {if (pHead->pNext == NULL){return true;}else{return false;} }int length_list(PNODE pHead) {int i = 0;PNODE p = pHead;while (p->pNext != NULL){i++;p = p->pNext;}return i; }void sort_list(PNODE pHead) {int i, j, temp;int length = length_list(pHead);PNODE p, q;for(i = 0,p = pHead->pNext; i < length; i++,p = p->pNext){for(j = i + 1, q = p->pNext; j < length;j++, q = q->pNext){if (p->data > q->data){temp = p->data;p->data = q->data;q->data = temp;}}} }bool insert_list(PNODE pHead, int pos, int val) {int i = 0;PNODE p = pHead;while (p != NULL && i < pos - 1){p = p->pNext;i++;}if (i > pos - 1 || p == NULL){printf("插入失敗!\n");return false;}PNODE pNew = (PNODE)malloc(sizeof(NODE));if (pNew == NULL){printf("動態內存分配失敗!\n");exit(1);}pNew->data = val;pNew->pNext = p->pNext;p->pNext = pNew;return true; }bool delete_list(PNODE pHead, int val) {int i = 0;int length;PNODE p = pHead;PNODE q = (PNODE)malloc(sizeof(NODE));if (q == NULL){printf("內存分配失敗!\n");exit(1);}q = p->pNext;length = length_list(pHead); //鏈表被刪除一個元素后長度會減小while (i < length) //while(i<length_list(pHead))中length_list(pHead)減少一個就會相應減少,導致最后幾個元素無法被選中{if (q->data == val){PNODE del = q;q = q->pNext;p->pNext = p->pNext->pNext;free(del);}else{p = q;q = p->pNext;}i++;}return true; }注:寫完編譯器還是一直給我報一個問題,使用未初始化的內存“*q”。求大佬解答!!!
無論是初始化鏈表還是改動鏈表,都是對鏈表的數據域和指針域進行改動。
1、初始化鏈表
首先要給頭指針分配動態內存,頭指針指向的就是第一個元素,新增加元素的指針設為pNew,那么當鏈表長度為0時可以直接添加pNew,而鏈表有長度時,通過頭指針無限指向pNext(指針域)來添加就使程序變得難以理解,不如增加一個結點,把該結點(尾結點)的指針pTail指向新增結點,從而達到鏈表結點的增加。
PNODE create_list(void) {int length;int i;int value;PNODE pHead = (PNODE)malloc(sizeof(NODE));if (pHead == NULL){printf("內存分配失敗!");exit(1);}PNODE pTail = pHead;pTail->pNext = NULL;printf("請輸入鏈表的有效長度:\n");scanf_s("%d", &length);for (i = 0; i < length; i++){printf("請輸入第%d個元素的值:\n", i + 1);scanf_s("%d", &value);PNODE pNew = (PNODE)malloc(sizeof(NODE));if (pNew == NULL){printf("內存分配失敗!");exit(1);}pNew->data = value;pTail->pNext = pNew;pNew->pNext = NULL;pTail = pNew;}return pHead; }返回頭結點就能得到整個鏈表的所有結點。
2、排序(從小到大)
利用兩個循環進行比較,如果左邊的值小于右邊則進行互換。
void sort_list(PNODE pHead) {int i, j, temp;int length = length_list(pHead);PNODE p, q;for(i = 0,p = pHead->pNext; i < length; i++,p = p->pNext){for(j = i + 1, q = p->pNext; j < length; j++, q = q->pNext){ if (p->data > q->data){temp = p->data;p->data = q->data;q->data = temp;}}} }3、插入
在第pos個結點上插入一個值(數據域)為val的結點
bool insert_list(PNODE pHead, int pos, int val) {int i = 0;PNODE p = pHead;while (p != NULL && i < pos - 1){p = p->pNext;i++;}if (i > pos - 1 || p == NULL){printf("插入失敗!\n");return false;}PNODE pNew = (PNODE)malloc(sizeof(NODE));if (pNew == NULL){printf("動態內存分配失敗!\n");exit(1);}pNew->data = val;pNew->pNext = p->pNext;p->pNext = pNew;return true; }注意的是特殊情況,如果pos小于1或者大于鏈表長度+1那么無法插入。
pos結點前p的指針域指向pNew,pNew的指針域指向原來p指向的結點。
4、刪除
刪除每個值為val的結點刪除后前結點直接指向被刪除結點的后結點,并把被刪除結點內存釋放掉。
bool delete_list(PNODE pHead, int val) {int i = 0;int length;PNODE p = pHead;PNODE q = (PNODE)malloc(sizeof(NODE));if (q == NULL){printf("內存分配失敗!\n");exit(1);}q = pHead->pNext;length = length_list(pHead); //鏈表被刪除一個元素后長度會減小while (i < length) //while(i<length_list(pHead))中length_list(pHead)減少一個就會相應減少,導致最后幾個元素無法被選中{if (q->data == val){PNODE del = q;q = q->pNext;p->pNext = p->pNext->pNext;free(del);}else{p = q;q = p->pNext;}i++;}return true; }注:寫這個算法的時候偷懶直接寫while(i <length_list(pHead)),這樣寫當刪除一個元素時長度減少,循環次數減少導致無法對后面的結點進行判斷!!!應當把長度length直接求出來,進行length次循環才能找到全部的值為val的結點。
總結
以上是生活随笔為你收集整理的数据结构-链表:对链表进行初始化、增删改查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 综述2 | 基于深度学习的行人重识别
- 下一篇: [bzoj4084][Sdoi2015]