目錄
1.順序表釋放
2.順序表增加空間
3.合并順序表
4.線性表之鏈表實現
1.項目結構以及初始代碼
2.初始化鏈表(不帶頭結點)
3.鏈表尾部插入數據并顯示
4.鏈表頭部插入數據
5.初始化鏈表(帶頭結點)
6.帶頭結點的鏈表頭部插入數據并顯示
7.帶頭結點的鏈表尾部插入數據
5.提供操作界面
1.順序表釋放
main.c
SeqList.h
SeqList.c
void destroy(SeqList* list)
{free(list->base);list->base = NULL;// 防止野指針list->capacity = 0;list->size = 0;
}
2.順序表增加空間
SeqList.h
SeqList.c
int Inc(SeqList* list)
{ElemType* newbase = (ElemType*)realloc(list->base, sizeof(ElemType) * (list->capacity + INC_SIZE));if (newbase == NULL){printf("增配空間失敗,內存不足.\n");return 0;// 返回0,表示假,增配空間失敗}list->base = newbase;list->capacity += INC_SIZE;return 1;
}
應該在順序表插入的函數中判斷
3.合并順序表
注釋掉原來的main函數
重新寫一個main函數
main.c
int main(int argc, char** argv)
{SeqList mylist;SeqList youlist;SeqList list;InitSeqList(&mylist);InitSeqList(&youlist);push_back(&mylist,1);push_back(&mylist,3);push_back(&mylist,5);push_back(&mylist,7);push_back(&mylist,9);push_back(&youlist,2);push_back(&youlist,4);push_back(&youlist,6);push_back(&youlist,8);push_back(&youlist,10);merge(&list,&mylist,&youlist);show_list(&list);}
SeqList.h
SeqList.c
/*
將兩個有序的順序表合并為一個有序的順序表
*/
void merge(SeqList* lt, SeqList* la, SeqList* lb)
{
// 初始化三個指針,分別用于遍歷la、lb、lt三個順序表int ia = 0;// ia 指向順序表 la 的當前元素int ib = 0;// ib 指向順序表 lb 的當前元素int ic = 0;// ic 指向合并后的順序表 lt 的當前插入位置// 計算合并后順序表 lt 的容量(容量等于 la 和 lb 的元素總數)lt->capacity = la->size + lb->size;// 為順序表 lt 分配足夠的空間,能夠存儲合并后的所有元素lt->base = (ElemType*)malloc(sizeof(ElemType) * lt->capacity);// 檢查內存分配是否成功,如果分配失敗則終止程序assert(lt->base != NULL);// 開辟失敗了,就斷言返回// 合并兩個順序表,當 la 和 lb 都還有未處理的元素時,執行比較與插入操作while (ia < la->size && ib < lb->size){// 如果 la 當前元素小于 lb 當前元素,取出 la 當前元素放入 ltif (la->base[ia] < lb->base[ib]){// 插入元素并移動指針 ia 和 iclt->base[ic++] = la->base[ia++];}else// 否則取出 lb 當前元素放入 lt{lt->base[ic++] = lb->base[ib++];// 插入元素并移動指針 ib 和 ic}}// 如果 la 中還有未處理的元素,直接將其復制到 lt 中while (ia < la->size){// 依次插入剩余元素并移動指針lt->base[ic] = la->base[ia];ic++;ia++;}// 如果 lb 中還有未處理的元素,直接將其復制到 lt 中while (ib < lb->size){// 依次插入剩余元素并移動指針lt->base[ic] = lb->base[ib];ic++;ib++;}// 設置合并后順序表 lt 的大小,等于 la 和 lb 的元素總數lt->size = la->size + lb->size;
}
4.線性表之鏈表實現
1.項目結構以及初始代碼
在解決方案"dataStructure"新增一個項目"List"。并把項目"List"設置為啟動項目。
項目"List"初始結構
List.h
#ifndef __LIST_H__
#define __LIST_H__#define ElemType inttypedef struct ListNode
{ElemType data;struct ListNode* next;
}ListNode;typedef ListNode* List;#endif // ! __LIST_H__
List.c
#include <stdio.h>
#include <assert.h>
#include <malloc.h>#include "List.h"
main.c
#include <stdio.h>
#include "List.h"int main(int argc, char** argv)
{return 0;
}
2.初始化鏈表(不帶頭結點)
List.h
List.c
main.c
#include <stdio.h>
#include "List.h"int main(int argc, char** argv)
{List mylist;InitList(&mylist);return 0;
}
3.鏈表尾部插入數據并顯示
main.c
List.h
List.c
/// <summary>
/// 在鏈表尾插入節點
/// </summary>
/// <param name="head"></param>
void CreateList(List* head)
{*head = (ListNode*)malloc(sizeof(ListNode));assert(*head != NULL);(*head)->data = 1;(*head)->next = NULL;ListNode* p = *head;for (int i = 2; i <= 10; i++){ListNode* s = (ListNode*)malloc(sizeof(ListNode));assert(s != NULL);s->data = i;s->next = NULL;p->next = s;p = s;}
}void ShowList(List* head)
{ListNode* p = *head;while (p != NULL){printf("%d-->", p->data);p = p->next;}printf("Null.\n");
}
4.鏈表頭部插入數據
main.c
List.h
List.c
void InsertTopList(List* head)
{*head = (ListNode*)malloc(sizeof(ListNode));assert(*head != NULL);(*head)->data = 1;(*head)->next = NULL;for (int i = 2; i <= 10; i++){ListNode* s = (ListNode*)malloc(sizeof(ListNode));assert(s!= NULL);s->data = i;s->next = *head;*head = s;// head指向新的節點,也就是這個新的結點成為頭結點}
}
5.初始化鏈表(帶頭結點)
main.c
List.h
List.c
void InitListWithHead(List* head)
{*head = (ListNode*)malloc(sizeof(ListNode));assert(*head != NULL);(*head)->next = NULL;
}
6.帶頭結點的鏈表頭部插入數據并顯示
main.c
List.h
List.c
// 在帶頭結點的鏈表頭部插入數據
void CreateListTopWithHead(List* head)
{for (int i = 1; i <= 10; i++){ListNode* s = (ListNode*)malloc(sizeof(ListNode));s->data = i;s->next = (*head)->next;(*head)->next = s;}
}void ShowListWithHead(List* head)
{ListNode* p = (*head)->next;while (p != NULL){printf("%d-->", p->data);p = p->next;}printf("Null.\n");
}
main.c
List.h
List.c
// 在帶頭結點的鏈表尾部插入數據
void InsertTailListWithHead(List* head)
{ListNode* p = *head;for (int i = 1; i <= 10; i++){p = p->next = (ListNode*)malloc(sizeof(ListNode));assert(p != NULL);p->data = i;p->next = NULL;}
}
鏈表結構如下
8.1.項目初始結構
main.c
#include <stdio.h>
#include "SList.h"int main(int argc, char** argv)
{return 0;
}
SList.h
#ifndef __SLIST_H__
#define __SLIST_H__
#include <stdio.h>
#include <malloc.h>
#include <assert.h>#define ElemType inttypedef struct Node
{ElemType data;struct Node* next;
}Node,*PNode;typedef struct List
{PNode first;PNode last;size_t size;// 節點個數大小
}List;void InitList(List* list);#endif // !__SLIST_H__
SList.c
#include "SList.h"void InitList(List* list)
{list->first = list->last = (Node*)malloc(sizeof(Node));assert(list->first != NULL);list->first->next = NULL;list->size = 0;
}
5.提供操作界面
main.c
#include <stdio.h>
#include "SList.h"int main(int argc, char** argv)
{List mylist;InitList(&mylist);int select = 1;while (select){printf("*******************************************\n");printf("* [1] push_back [2] push_front *\n");printf("* [3] show_list [4] pop_back *\n");printf("* [5] pop_front [6] insert_val *\n");printf("* [7] find [8] length *\n");printf("* [9] delete_val [10] sort *\n");printf("* [11] reverse [12] clear *\n");printf("* [13] destroy [0] quit_system *\n");printf("*******************************************\n");printf("請選擇:>");scanf("%d", &select);switch (select){case 1:{break;}default:{printf("輸入的命令錯誤,請重新輸入.\n");break;}}}return 0;
}
8.3.單鏈表尾部插入元素并顯示單鏈表
- 尾部插入元素
main.c
SList.h
SList.c
void push_back(List* list, ElemType x)
{Node* s = (Node*)malloc(sizeof(Node));assert(s != NULL);s->data = x;s->next = NULL;list->last->next = s;list->last = s;list->size++;
}
- 顯示單鏈表元素
void show_list(List* list)
{Node* p = list->first->next;while (p != NULL){printf("%d--->", p->data);p = p->next;}printf("NULL.\n");
}
🔔 如果你對C語言數據庫 和其他先進技術感興趣,請別忘了點贊👍、收藏??,并關注我們! 我們將持續為大家帶來更多精彩內容,探索嵌入式C語言的無限可能!一起站在科技的前沿,邁向更美好的未來🌟。