【考研】數據結構(更新到循環鏈表)

聲明:所有代碼都可以運行,可以直接粘貼運行(只有庫函數沒有聲明)

線性表的定義和基本操作

基本操作

  1. 定義
    靜態:
#include<stdio.h>
#include<stdlib.h>#define MaxSize 10//靜態 
typedef struct{int data[MaxSize];int length;
}SqList;void InitList(SqList &L)//初始化 
{for(int i=0;i<MaxSize;i++){L.data[i]=0;}L.length=0;
}int main(void)
{SqList L;InitList(L);for(int i=0;i<L.length;i++){printf("the data %d is %d",i,L.data[i]);}return 0;
}

動態:

#include<stdio.h>
#include<stdlib.h>#define InitSize 10typedef struct{int *data;int MaxSize;//最大容量 int length;//當前長度 
}SeqList;void Init(SeqList &L)
{L.data=(int *)malloc(InitSize*sizeof(int));L.length=0;L.MaxSize=InitSize;
}int main(void){return 0;
}
  1. 插入
    靜態:
//插入操作,bool用于判斷操作是否成功 (處理異常情況) 
bool ListInsert(SqList &L,int i,int e){if(i<1 || i>L.length+1) return false;//條件判斷 if(L.length >= MaxSize) return false;for(int j=L.length;j>=i;i--){L.data[j]=L.data[j-1];}L.data[i-1]=e;L.length++;
}

在這里插入圖片描述
動態:


  1. 刪除
    靜態:
bool ListDelete(SqList &L,int i,int &e){if(i<1||i>L.length) return false;e=L.data[i-1];for(int j=i;j<L.length;j++){L.data[j-1]=L.data[j];}L.length--;return true;
}

動態順序表以及各個操作

#include<stdio.h>
#include<stdlib.h>
#define InitSize 10typedef struct{int *data;int MaxSize;int length;
}SqList;void debug(SqList L){printf("當前順序表的數據為length=%d maxsize=%d\n",L.length,L.MaxSize);
}
//初始化
void InitList(SqList &L){L.data=(int *)malloc(InitSize*sizeof(int));L.length=0;L.MaxSize=InitSize;
}//增加動態數組的長度
void IncreaseSize(SqList &L,int len){int *p=L.data;L.data=(int *)malloc((L.MaxSize+len)*sizeof(int));for(int i=0;i<L.length;i++){L.data[i]=p[i];//將數據復制到新區域 }L.MaxSize=L.MaxSize+len;//順序表最大長度增加len free(p);//釋放空間		
} //插入操作
bool ListInsert(SqList &L,int i,int e){//范圍判斷 if(i<1 || i>L.length+1)return false;if(L.length>L.MaxSize)return false;for(int j=L.length;j>=i;j--){L.data[j]=L.data[j-1];}L.data[i-1]=e;L.length++;return true;
} 刪除操作,刪除第i個數據并且返回被刪除的數據 
bool ListDelete(SqList &L,int i,int &e)
{//范圍判斷if(i<1 || i>L.length+1) return false;else{//保存刪除元素e=L.data[i]; for(int j=i;j<L.length;j++){L.data[j]=L.data[j+1];}L.length--;} return true;} //按位查找
int getElemBybit(SqList L,int i){//Check if the line has been crossedif(i<1 || i>L.length){printf("Cross the border!");return 0;}return L.data[i-1];
} //按值查找
int getElemByValue(SqList L,int value){for(int i=0;i<L.length;i++){if(L.data[i] == value){return i-1;}}printf("Can`t find the elem!");return 0;
} //打印操作
void print(SqList L){for(int i=0;i<L.length;i++){printf("%d ",L.data[i]);}printf("\n");
} //測試函數 
int main(void){SqList L;debug(L);InitList(L);debug(L);for(int i=0;i<L.MaxSize;i++){L.data[i]=i;L.length++;}IncreaseSize(L,5);debug(L);print(L);if(ListInsert(L,2,5)){printf("插入成功,插入后數值");print(L);}else printf("插入失敗");int e=0;if(ListDelete(L,3,e)){print(L);printf("被刪除元素為:%d",e);}int value,position;printf("\nPlease input the value and the position:");  scanf("%d %d", &value, &position);  printf("\nget the emlem by value :the elem position is%d\n",getElemByValue(L,value));printf("\nget the emlem by positon:the value is%d\n",getElemBybit(L,position));return 0;
}

鏈表基本

鏈表結構:
單鏈表:

//定義單鏈表
typedef struct LNode {int data;           // 數據域 struct LNode* next; // 指針域 
} LNode, * LinkList;

雙鏈表:

//定義結構
typedef struct DNode{int data;//數據域 struct DNode *prior,*next;//指針域 
}DNode,*DLinkList;

單鏈表

操作:

// 初始化一個鏈表,帶頭結點
bool InitList(LinkList* L);// 按照位序插入
bool ListInsert(LinkList* L, int i, int e);// 指定結點的后插操作
bool InsertNextNode(LNode* p, int e);// 指定結點的前插操作
bool InsertPriorNode(LNode* p, int e);// 按位序刪除結點
bool ListDelete(LinkList* L, int i, int* e);// 創建方式 - 頭插法創建
LinkList List_HeadInsert(LinkList* L);//創建方法 - 尾插法創建
LinkList List_TailInsert(LinkList* L);//指定結點的刪除
bool DeleteNode(LNode *p);//按位查找
LNode *GetElem(LinkList L,int i);//按值查找
LNode *LocateElem(LinkeList L,int e); //求單鏈表的長度
int length(LinkList L);//鏈表逆置
LNode *Inverse(LNode *L); // 打印鏈表
void print(LinkList L); 

操作實現:

// 打印鏈表
void print(LinkList L) {LinkList E = L->next;while (E != NULL) {printf("%d ", E->data);E = E->next;}printf("\n");
}// 初始化一個鏈表,帶頭結點
bool InitList(LinkList* L) {*L = (LNode*)malloc(sizeof(LNode));if (*L == NULL) return false;(*L)->next = NULL;printf("Initialization of the linked list succeeded!\n");return true;
}// 按照位序插入
bool ListInsert(LinkList* L, int i, int e) {if (i < 1) return false; // 判斷操作合法LNode* p = *L;int j = 0;while (p != NULL && j < i - 1) {p = p->next;j++;}int choice =0;printf("Prior or next?(1/2)");scanf("%d",&choice);if(choice == 2)return InsertNextNode(p, e);if(choice == 1)return InsertPriorNode(p,e);elsereturn false;
}// 指定結點的后插操作 
bool InsertNextNode(LNode* p, int e) {if (p == NULL) return false; // 判斷合法 LNode* s = (LNode*)malloc(sizeof(LNode));if (s == NULL) return false; // 內存分配失敗 s->data = e;s->next = p->next;p->next = s;return true;
}// 指定結點的前插操作
bool InsertPriorNode(LNode* p, int e) {if (p == NULL) return false;LNode* s = (LNode*)malloc(sizeof(LNode));if (s == NULL) return false;s->next = p->next;p->next = s;s->data = p->data; // 交換數值從而實現前插操作,方法還是后插的方法 p->data = e;return true;
}// 按位序刪除結點并返回刪除數據 
bool ListDelete(LinkList* L, int i, int* e) {if (i < 1) return false; // 判斷操作合法LNode* p = *L;int j = 0;while (p != NULL && j < i - 1) {p = p->next;j++;} // 定位到刪除結點if (p == NULL) return false;if (p->next == NULL) return false;LNode* q = p->next;*e = q->data;p->next = q->next;free(q);return true;
}// 創建方式
// 1. 頭插法創建 O(n)
LinkList List_HeadInsert(LinkList* L) {*L = (LinkList)malloc(sizeof(LNode)); // 建立頭結點(*L)->next = NULL;                    // 初始為空鏈表,這步不能少!int x;LNode* s;printf("input the x:");scanf("%d", &x);while (x != 9999) {s = (LNode*)malloc(sizeof(LNode));s->data = x;s->next = (*L)->next;(*L)->next = s;printf("Continue input the x:");scanf("%d", &x);}return *L;
}//指定結點的刪除(重點理解) 
bool DeleteNode(LNode *p){if(p == NULL) return false;LNode *q=p->next;p->data=p->next->data;p->next=q->next;free(q);return true;
}//按位查找
LNode *GetElem(LinkList L,int i){if(i<1) return false;LNode *p=L->next;int j;while(p!=NULL && j<i-1){p=p->next;j++;}return p;
}//按值查找
LNode *LocateElem(LinkList L,int e){if(L == NULL) return false;LNode *p=L->next;while(p != NULL && p->data!=e){p=p->next;		}return p;
}//求單鏈表的長度
int length(LinkList L){int len=0;LNode *p=L;while(p->next!=NULL){p=p->next;len++;}return len;
} //創建方法 - 尾插法創建
//創建方法 - 尾插法創建
LinkList List_TailInsert(LinkList* L){int x;*L=(LinkList)malloc(sizeof(LNode));LNode *s,*r=*L;printf("輸入插入的結點的值:");scanf("%d",&x);while(x != 9999){s=(LNode *)malloc(sizeof(LNode));s->data=x;r->next=s;r=s;scanf("%d",&x);}r->next=NULL;return *L;
}//鏈表逆置(重點理解) 
LNode *Inverse(LNode *L){LNode *p,*q;p=L->next;L->next=NULL;while(p!=NULL){q=p;p=p->next;q->next=L->next;L->next=q;}return L;
}

測試代碼

int main(void) {LinkList L = NULL;LNode *elem = NULL;int e=0;List_HeadInsert(&L);print(L);printf("Insert:\n");ListInsert(&L,2,3);	print(L);ListDelete(&L,3,&e);print(L);printf("Deleted elem:%d\n",e);printf("Delete the elem by Node\n");DeleteNode(L->next->next);print(L);printf("Search by position\n");elem=GetElem(L,3);printf("the elem is:%d\n",elem->data);printf("Inverse the Link\n");L=Inverse(L);print(L);return 0;
}

雙鏈表

操作:

//打印 
void print(DLinkList L);
//鏈表的初始化 ,
bool InitLinkList(DLinkList *L);
//判空
bool isEmpty(DLinkList L); 
//后插操作,將s插入p之后 
bool InsertNextNode(DNode *p,DNode *s); 
//前插操作
bool InsertPriorNode(DNode *p,DNode *s); 

定義:

bool InitLinkList(DLinkList *L){*L = (DNode *)malloc(sizeof(DNode));if(L == NULL) return false;(*L)->next=NULL;(*L)->prior=NULL;return true; 
}bool isEmpty(DLinkList L){if(L->next==NULL) return true;elsereturn false;
}bool InsertNextNode(DNode *p,DNode *s){if(p==NULL || s==NULL){printf("非法\n");return false;}s->next=p->next;s->prior=p;p->next=s;printf("Insert next node success!\n");return true;
}bool InsertPriorNode(DNode *p,DNode *s){if(p==NULL || s==NULL || p->prior==NULL){printf("非法\n");return false;}s->prior=p->prior;s->next=p;p->prior=s;printf("Insert prior node success!\n");return true;
}void print(DLinkList L){L=L->next;//因為有頭結點 while(L!=NULL){printf("%d ",L->data);L=L->next;}
}

測試:

//測試 
int main(void){DLinkList L;DNode *node;int data,x;if(InitLinkList(&L)){printf("初始化成功!");	}printf("開始插入(9999停止)\n");scanf("%d",&x);while(x !=9999){node=(DNode *)malloc(sizeof(DNode));node->data=x;InsertNextNode(L,node);scanf(" %d",&x);}print(L);return 0;
}

單循環鏈表.

//循環鏈表
#include<stdio.h>
#include<stdlib.h>//循環單鏈表 
typedef struct LNode{int data;struct LNode *next;
}DNode,*LinkList;//打印
void print(LinkList L); 
//初始化一個循環單鏈表
bool InitList(LinkList *L); 
//判空
bool isEmpty(LinkList L); 
//判斷結點是否為表尾指針
bool ifTail(LinkList L,LNode *p); 
//插入結點
bool InsertNextNode(LNode *p,LNode *q);int main(void)
{LinkList L;LNode *node;int x;if(InitList(&L)) printf("初始化成功!\n");printf("輸入9999結束!\n");scanf("%d",&x);while(x != 9999){node=(LNode *)malloc(sizeof(LNode));node->data=x;InsertNextNode(L,node);scanf(" %d",&x);}print(L);return 0;} bool InitList(LinkList *L){*L=(LNode *)malloc(sizeof(LNode));if(*L==NULL) return false;(*L)->next = *L;return true;
}bool isEmpty(LinkList L){if(L->next == L)return true;elsereturn false;
}void print(LinkList L){LinkList head=L->next;while(head != L){printf("%d ",head->data);head=head->next;}
}bool ifTail(LinkList L,LNode *p){if(p->next == L)return true;elsereturn false;
}bool InsertNextNode(LNode *p,LNode *q){if(p==NULL || q==NULL) return false;q->next=p->next;p->next=q;return true;
}

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

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

相關文章

【追求卓越02】數據結構--鏈表

引導 今天我們進入鏈表的學習&#xff0c;我相信大家對鏈表都很熟悉。鏈表和數組一樣&#xff0c;作為最基礎的數據結構。在我們的工作中常常會使用到。但是我們真的了解到數組和鏈表的區別嗎&#xff1f;什么時候使用數組&#xff0c;什么時候使用鏈表&#xff0c;能夠正確的選…

監控員工上網有什么軟件

監控員工上網的軟件主要用于監控員工在工作時間內的網絡行為&#xff0c;包括瀏覽網頁、使用社交媒體、發送郵件等。通過監控員工上網行為&#xff0c;企業管理者可以更好地了解員工的工作狀態和行為&#xff0c;規范員工的上網行為&#xff0c;提高工作效率&#xff0c;同時也…

SSL證書對網站的作用及影響?

SSL證書作為當下互聯網的重要安全件&#xff0c;包括搜索引擎的收錄、網站是否具備信任的條件以及HTTP2.0傳輸協議的相互作用等&#xff0c;尤其是瀏覽器對古老的http協議警告提示不安全將直接影響到用戶的信任度以及品牌形象&#xff0c;對于網站來說可謂是必不可少。 SSL證書…

Webstorm 插件文件目錄顏色分析——白藍綠紅黃灰

Webstorm 插件文件目錄【白色、藍色、綠色、紅色、黃色、灰色】對應當前文件發生什么了&#xff0c;即文件夾當前狀態。 WebStrom配置好git或SVN后文件顏色代表的含義&#xff1a; 白色&#xff1a;本地無修改內容 藍色&#xff1a;文件內容有修改&#xff0c;暫未提交到git…

python命令行 引導用戶填寫可用的ip地址和端口號

字多不看&#xff0c;直接體驗 待補充 演示代碼 # -*- coding:UTF-8 -*- """ author: dyy contact: douyaoyuan126.com time: 2023/11/23 10:29 file: 引導用戶填寫可用的ip地址和端口號.py desc: xxxxxx """# region 引入必要的依賴 import …

C語言-判斷上三角矩陣

上三角矩陣指主對角線以下的元素都為0的矩陣&#xff1b;主對角線為從矩陣的左上角至右下角的連線。 本題要求編寫程序&#xff0c;判斷一個給定的方陣是否上三角矩陣。 輸入格式&#xff1a; 輸入第一行給出一個正整數T&#xff0c;為待測矩陣的個數。接下來給出T個矩陣的信…

【LeetCode:2304. 網格中的最小路徑代價 | dijkstra(迪杰斯特拉)】

&#x1f680; 算法題 &#x1f680; &#x1f332; 算法刷題專欄 | 面試必備算法 | 面試高頻算法 &#x1f340; &#x1f332; 越難的東西,越要努力堅持&#xff0c;因為它具有很高的價值&#xff0c;算法就是這樣? &#x1f332; 作者簡介&#xff1a;碩風和煒&#xff0c;…

Vue中使用Echarts實現數據可視化

文章目錄 引言一、安裝Echarts二、引入Echarts三、創建圖表容器四、初始化Echarts實例五、配置圖表選項和數據六、實現圖表更新七、Vue實例代碼結語我是將軍&#xff0c;我一直都在&#xff0c;。&#xff01; 引言 接著上一篇內容&#xff0c;我將繼續分享有關數據可視化的相…

Bellman-Ford算法

初步了解 Bellman-Ford算法是一種用于尋找帶有負權邊的圖中的單源最短路徑的算法。它可以處理一般的圖&#xff0c;包括存在負權邊和負權環的情況。 以下是Bellman-Ford算法的基本思想和步驟&#xff1a; 初始化&#xff1a;將源節點的距離設置為0&#xff0c;將所有其他節點…

Hook+jsdom 解決cookie逆向

前言 記錄下如何破cookie逆向 目標 目標網址:https://q.10jqka.com.cn/ 目標接口:http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/2/ajax/1/ 對抗:cookie反爬蟲處理,關鍵字v,如圖 解決步驟 1、JS中關鍵字查找 如上,我們找到了關鍵字 v,…

為何設計師都在用這個原型樣機資源網站?

談論原型樣機素材模板&#xff0c;這個話題對設計師來說如同老朋友一般熟悉。設計師們在創作完畢后&#xff0c;為了更淋漓盡致地展示他們的設計成果&#xff0c;通常會將其放置在真實的樣機素材模板中。這種原型樣機素材可以讓設計作品迅速且清晰地呈現在真實環境中。找到一個…

(5秒解決)ImportError: attempted relative import with no known parent package

尋找了很多方法&#xff0c;發現大家把事情講的復雜了。我這里用最簡單的辦法來解決父包引用找不到的問題。 報錯提示&#xff1a;ImportError: attempted relative import with no known parent package 先給大家看看我的目錄結構&#xff0c;model.py和test目錄在同一級。tra…

前端數組方法匯總集錦

前言 數組主要使用場景有&#xff1a; 存儲和處理數據&#xff1a;數組是一種有序的數據結構&#xff0c;可以用來存儲和處理多個相關的數據。在前端開發中&#xff0c;我們經常使用數組來存儲和處理列表、表格、選項等數據。 循環和遍歷&#xff1a;數組提供了循環和遍歷的功能…

Android12:內置第三方應用,權限控制器已停止運行,應用app已停止運行

1.設備先安裝我提供的app【EasyControler】 2.設備--設置--關于手機--版本號(滑動到最下方)---連續點擊六下打開 開發者模式 3.設置--系統--開發者模式--開發者選項 --打開usb調試 4.設置--安全設備管理應用--easycontrol的開關打開 5.將設備連接電腦 打開cmd命令框 輸入指令…

smartsofthelp 7.0 最簡單的代碼生成器

這是一款值得開發人員認真研究的軟件 https://pan.baidu.com/s/1xjDL5QypcRJ5neulUPFmWQ?pwdgedx 1.查詢數據庫死鎖相關信息 2.查看數據庫的鏈接情況 3.當前實例上的所有用戶 4.創建數據庫獨立密碼 5.查看數據庫使用的端口號 6.當前數據庫設置的最大連接數 7.當前數據庫最大的…

C語言運算符優先級表

C語言運算符優先級表 運算符優先級與結合性 優先級運算符描述結合性1&#xff0c;--后綴自增&#xff0c;自減從左往右()函數調用[]數組下標.結構體與聯合體訪問成員->結構體與聯合體通過指針訪問成員(type){list}復合字面量(C99)2&#xff0c;--前綴自增&#xff0c;自減從…

淡入淡出transition: right 1s

transition: right 1s; //重點直接改變right值 操作過快 這里用該方法實現1s內淡入淡出 達到效果目標

JS PromiseLike 的判定與使用

目錄 一. $.ajax()返回值遇到的問題二. Promise A 規范三. 判斷是否為PromiseLike3.1 判斷ES6的new Promise()3.2 判斷包含then方法的對象3.3 判斷$.ajax()返回的對象 一. $.ajax()返回值遇到的問題 當我們執行如下js代碼時&#xff0c;可以看到$.ajax()執行后&#xff0c;得到…

Linux python安裝 虛擬環境 virtualenv

根目錄創建 venvs 文件夾 sudo mkdir /venvs 進入 /venvs 目錄 cd /venvsp 創建虛擬環境&#xff0c;前提要按照 python3 安裝 的 命令 sudo apt install python3 sudo python3 -m venv 虛擬環境名 激活虛擬環境 sourcepippip /venvs/zen-venv/bin/activatepinpi 安裝flask pip…

【C語言】深入解開指針(四)

&#x1f308;write in front :&#x1f50d;個人主頁 &#xff1a; 啊森要自信的主頁 ??真正相信奇跡的家伙&#xff0c;本身和奇跡一樣了不起啊&#xff01; 歡迎大家關注&#x1f50d;點贊&#x1f44d;收藏??留言&#x1f4dd;>希望看完我的文章對你有小小的幫助&am…