數據結構實戰之線性表(三)

目錄

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.單鏈表尾部插入元素并顯示單鏈表

  1. 尾部插入元素

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++;
}
  1. 顯示單鏈表元素

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語言的無限可能!一起站在科技的前沿,邁向更美好的未來🌟。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/894770.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/894770.shtml
英文地址,請注明出處:http://en.pswp.cn/news/894770.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker使用指南(一)——鏡像相關操作詳解(實戰案例教學,適合小白跟學)

目錄 1.鏡像名的組成 2.鏡像操作相關命令 鏡像常用命令總結&#xff1a; 1. docker images 2. docker rmi 3. docker pull 4. docker push 5. docker save 6. docker load 7. docker tag 8. docker build 9. docker history 10. docker inspect 11. docker prune…

C++基礎day1

前言&#xff1a;謝謝阿秀&#xff0c;指路阿秀的學習筆記 一、基礎語法 1.構造和析構: 類的構造函數是一種特殊的函數&#xff0c;在創建一個新的對象時調用。類的析構函數也是一種特殊的函數&#xff0c;在刪除所創建的對象時調用。 構造順序&#xff1a;父類->子類 析…

嘗試ai生成figma設計

當聽到用ai 自動生成figma設計時&#xff0c;不免好奇這個是如何實現的。在查閱了不少資料后&#xff0c;有了一些想法。參考了&#xff1a;在figma上使用腳本自動生成色譜 這篇文章提供的主要思路是&#xff1a;可以通過腳本的方式構建figma設計。如果我們使用ai 生成figma腳本…

iOS 老項目適配 #Preview 預覽功能

前言 iOS 開發者 最憋屈的就是UI 布局慢,一直以來沒有實時預覽功能,雖然swiftUI 早就支持了,但是目前主流還是使用UIKit在布局,iOS 17 蘋果推出了 #Preview 可以支持UIKit 實時預覽,但是僅僅是 iOS 17,老項目怎么辦呢?于是就有了這篇 老項目適配 #Preview 預覽 的文章,…

【分布式架構理論2】分布式架構要處理的問題及解決方案

文章目錄 1. 應用服務拆分2. 分布式調用3. 分布式協同4. 分布式計算5. 分布式存儲6. 分布式資源管理與調度7. 高性能與可用性優化8. 指標與監控 將分布式架構需要解決的問題按照順序列舉為如下幾步 問題分類具體內容應用服務拆分分布式是用分散的服務和資源代替集中的服務和資…

【PyQt】pyqt小案例實現簡易文本編輯器

pyqt小案例實現簡易文本編輯器 分析 實現了一個簡單的文本編輯器&#xff0c;使用PyQt5框架構建。以下是代碼的主要功能和特點&#xff1a; 主窗口類 (MyWindow): 繼承自 QWidget 類。使用 .ui 文件加載用戶界面布局。設置窗口標題、狀態欄消息等。創建菜單欄及其子菜單項&…

Unity中的虛擬相機(Cinemachine)

Unity Cinemachine詳解 什么是Cinemachine Cinemachine是Unity官方推出的智能相機系統&#xff0c;它提供了一套完整的工具來創建復雜的相機運動和行為&#xff0c;而無需編寫大量代碼。它能夠大大簡化相機管理&#xff0c;提高游戲開發效率。 Cinemachine的主要組件 1. Vi…

【PyQt】getattr動態訪問對象的屬性

問題 使用qtdesigner設計好大體的軟件結構&#xff0c;需要使用代碼進行批量修改控件樣式,self.ui.x 會被解釋為訪問 self.ui 中名為 x 的屬性&#xff0c;而不是將 x 作為變量名來解析&#xff0c;此時需要通過字符串動態訪問 self.ui 中的按鈕對象 for i in range(20):x f…

【電腦系統】電腦突然(藍屏)卡死發出刺耳聲音

文章目錄 前言問題描述軟件解決方案嘗試硬件解決方案嘗試參考文獻 前言 在 更換硬盤 時遇到的問題&#xff0c;有時候只有卡死沒有藍屏 問題描述 更換硬盤后&#xff0c;電腦用一會就卡死&#xff0c;藍屏&#xff0c;顯示藍屏代碼 UNEXPECTED_STORE_EXCEPTION 軟件解決方案…

DEEPSEKK GPT等AI體的出現如何重構工廠數字化架構:從設備控制到ERP MES系統的全面優化

隨著深度學習&#xff08;DeepSeek&#xff09;、GPT等先進AI技術的出現&#xff0c;工廠的數字化架構正在經歷前所未有的變革。AI的強大處理能力、預測能力和自動化決策支持&#xff0c;將大幅度提升生產效率、設備管理、資源調度以及產品質量管理。本文將探討AI體&#xff08…

【大模型LLM面試合集】大語言模型架構_Transformer架構細節

Transformer架構細節 1.Transformer各個模塊的作用 &#xff08;1&#xff09;Encoder模塊 經典的Transformer架構中的Encoder模塊包含6個Encoder Block. 每個Encoder Block包含兩個?模塊, 分別是多頭?注意?層, 和前饋全連接層. 多頭?注意?層采?的是?種Scaled Dot-Pr…

【華為OD-E卷 - 113 跳格子2 100分(python、java、c++、js、c)】

【華為OD-E卷 - 跳格子2 100分&#xff08;python、java、c、js、c&#xff09;】 題目 小明和朋友玩跳格子游戲&#xff0c;有 n 個連續格子組成的圓圈&#xff0c;每個格子有不同的分數&#xff0c;小朋友可以選擇以任意格子起跳&#xff0c;但是不能跳連續的格子&#xff…

訂單狀態監控實戰:基于 SQL 的狀態機分析與異常檢測

目錄 1. 背景與問題 2. 數據準備 2.1 表結構設計 3. 場景分析與實現 3.1 場景 1:檢測非法狀態轉換

說一下JVM管理的常見參數

Java虛擬機&#xff08;JVM&#xff09;有許多常見參數&#xff0c;用于控制其行為和性能。以下是一些常見的JVM參數及其說明&#xff1a; 1. 內存管理參數 -Xms<size> START 設置初始堆內存大小。例如&#xff0c;-Xms512m表示初始堆大小為512MB。 -Xmx<size>…

驗證工具:GVIM和VIM

一、定義與關系 gVim&#xff1a;gVim是Vim的圖形界面版本&#xff0c;提供了更多的圖形化功能&#xff0c;如菜單欄、工具欄和鼠標支持。它使得Vim的使用更加直觀和方便&#xff0c;尤其對于不習慣命令行界面的用戶來說。Vim&#xff1a;Vim是一個在命令行界面下運行的文本編…

4 HBase 的高級 shell 管理命令

4 HBase 的高級 shell 管理命令 1.status 例如&#xff1a;顯示服務器狀態 hbase(main):058:0> status node012.whoami 顯示 HBase 當前用戶&#xff0c;例如&#xff1a; hbase> whoami3.list 顯示當前所有的表 hbase> list4.count 統計指定表的記錄數&#xff0c…

Web - CSS3基礎語法與盒模型

概述 這篇文章是關于 Web 前端 CSS3 的基礎語法與盒模型的講解。包括 CSS3 層疊性及處理沖突規則、偽元素和新增偽類元素、屬性選擇器等。還介紹了文本與字體屬性&#xff0c;如段落和行相關屬性、字體文本屬性。最后闡述了盒子模型&#xff0c;如元素隱藏、行內與塊元素轉換、…

國防科大:雙目標優化防止LLM災難性遺忘

&#x1f4d6;標題&#xff1a;How to Complete Domain Tuning while Keeping General Ability in LLM: Adaptive Layer-wise and Element-wise Regularization &#x1f310;來源&#xff1a;arXiv, 2501.13669 &#x1f31f;摘要 &#x1f538;大型語言模型&#xff08;LLM…

Verilog基礎(一):基礎元素

verilog基礎 我先說,看了肯定會忘,但是重要的是這個過程,我們知道了概念,知道了以后在哪里查詢。語法都是術,通用的概念是術。所以如果你有相關的軟件編程經驗,那么其實開啟這個學習之旅,你會感受到熟悉,也會感受到別致。 入門 - 如何開始 歡迎來到二進制的世界,數字…

一次線程數超限導致的hive寫入hbase作業失敗分析

1.集群配置 操作系統:SuSe操作系統 集群節點:100臺相同配置的服務器 單臺:核心112Core,內存396G 2.問題現象 現象1:跑單個入庫任務報錯,批量提交任務后出現OOM異常 執行12個hivesql,將數據寫入hbase.hbase入庫有近一半的任務報錯。 每次報錯的任務不是同一個,hivesql…