c语言链表总结
c語言鏈表設計:
- 概述:
- 一、鏈表的創建
- 1 創建鏈表:
- 2:頭插法:
- 3: 尾插法:
- 二、增添元素
- 1.在頭部添加
- 2.在尾部添加
- 3在任意位置增添:
- 三 :刪除
- 1在任意位置刪除:
- 四 查詢
- 按序號查詢
- 五 判空
- 六 排序
- **歸并排序**
- 七 釋放空間
- 總結
概述:
鏈表是一種常見的采用動態存儲分配方式的數據結構。數據元素隨機存儲,并通過指針表示數據之間邏輯關系的存儲結構就是鏈表。
提示:以下是本篇文章正文內容,下面案例可供參考
一、鏈表的創建
1 創建鏈表:
MyLinkedList* myLinkedListCreate() {MyLinkedList * obj =(MyLinkedList*)malloc(sizeof(MyLinkedList));obj->val = 0;obj->next = NULL;return obj; }2:頭插法:
#include<stdio.h> #include<stdlib.h> typedef struct link{int x; // 數據域struct link * next; // 指針域 }LINK; int main() {LINK* head = (LINK*)malloc(sizeof(LINK)); // 頭節點LINK *current;head->next = NULL;int number;while(scanf("%d",&number) ==1 && number != -1){current = (LINK*) malloc(sizeof(LINK));current->x = number;current->next = head->next ; // 新結點為原來結點的地址head->next = current; // 頭節點指向新結點}LINK *p;for(p = head->next ; p ; p = p->next ) // 遍歷輸出{printf("%d\t",p->x );}return 0; }3: 尾插法:
二:尾插法
#include<stdio.h> #include<stdlib.h> typedef struct link{int x; // 數據域struct link * next; // 指針域 }LINK; int main() {LINK* head = NULL; // 頭節點LINK *current ,*prev;int number;while(scanf("%d",&number) ==1 && number != -1){current = (LINK*) malloc(sizeof(LINK));current->x = number;if(head == NULL) // 判斷是否是第一個結構head = current;else prev->next = current;current->next = NULL; // 當前結點的指針指向NULL 表明是最后一個結構prev = current; }LINK *p;for(p = head ; p ; p = p->next ) // 遍歷輸出{printf("%d\t",p->x );} return 0; }二、增添元素
1.在頭部添加
代碼如下(示例):
void myLinkedListAddAtHead(MyLinkedList* obj, int val) {MyLinkedList *p =(MyLinkedList*) malloc (sizeof(MyLinkedList));p->val = val;p->next = obj->next; obj->next = p; }2.在尾部添加
代碼如下(示例):
void myLinkedListAddAtTail(MyLinkedList* obj, int val) {MyLinkedList *p = (MyLinkedList*) malloc (sizeof(MyLinkedList));p->next = NULL;p->val = val;MyLinkedList *q = obj;while(q->next){q = q->next;} q->next = p; }3在任意位置增添:
void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {MyLinkedList *p = (MyLinkedList*) malloc(sizeof(MyLinkedList));MyLinkedList *q = obj->next;p->next = NULL;p->val = val;int i = 1;if(index <= 0){myLinkedListAddAtHead(obj, val); //在頭部增添} for( ; q ; q = q->next, i++){if (i == index){if(q->next){p->next = q->next;q->next = p;}elseq->next = p; break; }} }三 :刪除
1在任意位置刪除:
void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {MyLinkedList *p = obj->next;MyLinkedList *q = obj;int i = 0;if (index < 0)return;for( ; p ; i++ ){if(i == index){if(p->next){q->next = p->next;free(p);p = NULL;break;}else {free(p);p = NULL;q->next = NULL;} break;}q = p ;p = p->next;} }四 查詢
按序號查詢
int myLinkedListGet(MyLinkedList* obj, int index) {MyLinkedList *p = obj->next ;int i = 0;for( ; p ; i++ ){if(i == index)return p->val;elsep = p->next ;}return -1; }五 判空
int isEmpty(){Node * q = head->next;int flag = 1;if(q == NULL){flag = 0; }return flag; }六 排序
歸并排序
Node* sortMerge(Node *head){if(head == NULL || head->next == NULL)return head;//分割//fast 設置為head->next 方便分割后前半部分后面設置NULL Node *fast = head->next ,*slow = head;// 找中間結點while(fast && fast->next ){fast = fast->next->next ;slow = slow->next ;}//后半部分的頭節點Node *nextHead = slow->next ;slow->next = NULL;Node* m1 = sortMerge(head);Node* m2 = sortMerge(nextHead);//排序//虛擬頭結點 Node* dummy = (Node*)malloc(sizeof(Node));Node* prev = dummy;while(m1 && m2){if(m1->stu.id <= m2->stu.id ){prev->next = m1;m1 = m1->next; }else{prev->next = m2;m2 = m2->next ;}prev = prev->next; }//接上另半段鏈表prev->next = m1 == NULL ? m2 : m1;return dummy->next; }七 釋放空間
void myLinkedListFree(MyLinkedList* obj) {while(obj){MyLinkedList *q = (MyLinkedList*) malloc(sizeof(MyLinkedList)); q = obj;obj = obj->next;free(q);} }總結
多敲代碼 多理解!
可以去leetCode 做設計鏈表問題
總結
- 上一篇: VSFTPD移植及使用
- 下一篇: PYTHON新建PPT