【資料結構】線性表的鏈式儲存(四)靜態連結串列
靜態連結串列的初始化插入刪除操作
程式碼收穫
- 靜態連結串列有一個備用連結串列和資料兩條鏈在一個數組空間裡。
- 比較特別的是需要對是否空鏈進行討論,只有在空鏈時,-1遊標對應的索引的資料是無效資料。
- 用scanf記得後面要把回車吃掉。
- 插入和刪除需要考慮備用連結串列的操作。一般需要知道另一個變數操作位置的前一個數據的索引。
線性表歸檔
#include <stdio.h>
#include <stdlib.h>
//靜態連結串列,一個遊標和一個數據
#define MAXSIZE 100
typedef struct staticlist{
char data;
int cursor;
}Node,stlst[MAXSIZE];
// ap指向備用連結串列頭
void InitialList(stlst L,int* ap) {
*ap = 1;
L[0].cursor = -1;
int i;
for(i=1;i<MAXSIZE-1;i++){
L[i].cursor=i+1; //每個空閒空間指向下一個空間做成連結串列
} //注意 0位置是頭節點不是第一個元素
L[MAXSIZE-1].cursor=-1;//[ 0,1,2,3,4,5,6…………99]
// [-1,2,3,4,5,6,7…………-1]
}
//插入資料
int InsertData(stlst L,int*ap){
printf("輸入要插入的資料,'$'結束\n");
int flag =1;
char c;
while(flag){
c = getchar();
if(c!='$'){
int i;
for(i =0;L[i].cursor!=-1;i=L[i].cursor);//i就是有資料的最後個節點(除了頭節點)
int k=L[*ap].cursor;//把ap變成新節點,k是備用連結串列的首個元素
if (k==-1){
printf("連結串列已滿,無法插入\n");
return 1;
} else{
L[*ap].data=c;
L[*ap].cursor=-1;
L[i].cursor=*ap;//把最後一個節點接上新節點
*ap=k;} //把ap指向備用第一個元素
}else{
flag=0;
}
}getchar();
return 0;
}
//列印資料
void PrintLst(stlst L){
printf("連結串列為\n");
int i;
if (L[0].cursor!=-1){//判斷如果不是空鏈 ,如果不是,-1對應的data是要輸出的
for(i=0;L[i].cursor!=-1;i=L[i].cursor){
int k = L[i].cursor ;
printf("%c",L[k].data);
}
}else{
printf("空\n");
}
}
//刪除資料
int DeleteData(stlst L,int ap){
int flag = 1;
while(flag){
printf("輸入刪除第幾個元素(從1開始)\n");
int num,k,ff,pp=0;
scanf("%d",&num);
getchar();
for (k=0;k<num;k++){
ff=pp; //ff是pp前一個元素
pp=L[pp].cursor;//pp就是num處的元素
if (pp==-1&&k!=num){//走到最後一個元素時,k還不等於num,說明輸的數過大
printf("索引輸入錯誤\n");
return 1;
}
}L[ff].cursor=L[pp].cursor ; //pp前一個遊標直接指向pp下一個遊標
int ss;
for (ss=ap;L[ss].cursor!=-1;ss=L[ss].cursor);//找備用連結串列最後一個元素
L[pp].cursor=-1;//讓卸下來的變為備用最末的
L[ss].cursor=pp;//讓-1的那個遊標等於卸下來那個
PrintLst(L);
printf("是否繼續?(y/n)\n");
char sig;
sig = getchar();
if(sig=='n'){
flag=0;
}getchar();
} return 0;
}
void main(){
stlst L;
int ap;
InitialList(L,&ap);
InsertData(L,&ap);
PrintLst(L);
DeleteData(L,ap);
InsertData(L,&ap);
PrintLst(L);
}
相關推薦
【資料結構】線性表的鏈式儲存(四)靜態連結串列
靜態連結串列的初始化插入刪除操作 程式碼收穫 靜態連結串列有一個備用連結串列和資料兩條鏈在一個數組空間裡。 比較特別的是需要對是否空鏈進行討論,只有在空鏈時,-1遊標對應的索引的資料是無效資料。 用scanf記得後面要把回車吃掉。 插入和刪除需要考慮備用連結串
【資料結構】線性表的順序儲存
這段時間準備將書上的資料結構全部自己實踐一遍。 線性表是有序和有限的,分順序儲存和鏈式儲存。 本篇記錄c語言實現順序儲存程式碼。 線性表歸檔 # include <stdlib.h> # include <stdio.h> # defi
【資料結構】線性表的順序儲存完整程式
資料結構,線性表的順序儲存完整程式 #include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<iostream.h> #define L
【資料結構】單鏈表(無頭單向非迴圈連結串列)各個介面的實現
順序表存在的問題: 中間/頭部的插入刪除,時間複雜度為O(N) 增容需要申請新空間,拷貝資料,釋放舊空間。會有不小的消耗 增容一般是呈2倍的增長,勢必會有一定的空間浪費。 例如當前容量為100,滿了以後增容到200,如果再繼續插入了5個數據,後面沒有資料插入了,
【資料結構】線性表的鏈式儲存(二)迴圈連結串列
線性錶鏈式儲存的迴圈單鏈表 迴圈連結串列從任意一點出發,可以訪問全部節點。 一般為了便於操作,將連結串列的頭指標變為尾指標,指向尾節點,連結串列的頭節點則為尾指標的next。 程式碼收穫 用尾指標進行操作雖然省下迴圈,但是插入刪除等操作都需要移動尾指標導致
【資料結構】線性表的鏈式儲存連結串列的初始化、插入元素、刪除元素操作(三)
雙向連結串列的初始化插入與刪除 程式碼收穫 雙向連結串列刪除結點需要注意要刪除最後一個結點和不是最後一個結點分類討論。 插入和刪除時注意修改上一個結點裡指向下一個結點的指標與下一個結點裡指向上一個結點的指標。 #include <stdio.h>
【資料結構】線性表的鏈式儲存結構--單鏈表
1. 線性表的鏈式儲存結構 鏈式儲存:用一組任意的儲存單元儲存線性表中的資料元素。用這種方法儲存的線性表簡稱線性連結串列。 儲存連結串列中結點的一組任意的儲存單元可以是連續的,也可以是不連續的,甚至是零散分佈在記憶體中的任意位置上的。 連結串列中結點的邏輯順序和物理順序不
【資料結構】線性表的邏輯結構
基本特徵 有序(次序)集 唯一前驅唯一後繼 抽象資料型別(DSP)資料定義操作 抽象資料型別線性表定義 基本操作: 結構初始化操作 構造一個空的線性表 結構銷燬操作 結構引用型操作 知識引用 遍
【資料結構】c++ 採用鏈式結構實現關於入棧,出棧,列印棧的操作
c++標準的庫模板中,有專門的容器棧,但是為了鞏固下對棧的理解,用結構體以鏈式結構寫了個小demo,留著備用 #include #include"stdafx.h" using namespace std; struct node { int data; nod
【資料結構】線性表(陣列實現)
1、線性表 2、線性表的抽象資料型別描述 3、線性表的陣列描述 按照上述抽象描述,定義一個模板類來描述上述的抽象描述。 template<class T> class LinearList { public: LinearList(int
【資料結構】線性表的單鏈表儲存結構表示和實現
資料結構 線性表的單鏈表儲存結構表示和實現 參考程式碼如下: /* 名稱:線性表的單鏈表儲存結構表示和實現 編譯環境:VC++6.0 日期: 2014-3-27 */ #include <stdio.h> #include <malloc.h>
【資料結構】-線性表-順序表-1324: 演算法2-2:有序線性表的有序合併
1324: 演算法2-2:有序線性表的有序合併 題目描述 已知線性表 LA 和 LB 中的資料元素按值非遞減有序排列,現要求將 LA 和 LB 歸併為一個新的線性表 LC, 且 LC 中的資料元素仍然按值非遞減有序排列。例如,設LA=(3,5,8,11)
【Java】 大話資料結構(1) 線性表之順序儲存結構
本文根據《大話資料結構》一書,實現了Java版的順序儲存結構。 順序儲存結構指的是用一段地址連續的儲存單元一次儲存線性表的資料元素,一般用一維陣列來實現。 書中的線性表抽象資料型別定義如下(第45頁): 實現程式:
資料結構導論-2.4 線性表的鏈式儲存之迴圈連結串列與雙向迴圈連結串列
迴圈連結串列與雙向迴圈連結串列 一、迴圈連結串列 1.思路 對於單鏈表而言,最後一個結點的指標域是空指標,如果將該連結串列頭指標置入該指標域,則使得連結串列頭尾結點相連,就構成了單迴圈連結串列。 2.特點 無須增加儲存量,僅對錶的連結方式稍作改變,即可使得表處理更加
1、【資料結構】線性結構之單鏈表
單向連結串列 一、定義: 單向連結串列(單鏈表)時連結串列的一種,它由節點組成,每個節點都包含下一個節點的指標。 單鏈表的特點是:節點的連結方向是單向的;相對於陣列來說,單鏈表的的隨機訪問速度較慢,但是單鏈表刪除/新增資料的效率很高。 二、實現:
【資料結構之線性表總結】
前言: 這幾天在學習資料結構,引用書中的一句話:資料結構 = 程式 + 演算法;本篇部落格作為一個知識的總結,希望給大家帶來幫助. 核心 : 線性表定義 從字面意義來看,呈線性,所以說
【資料結構】鄰接表的儲存結構 建立圖的鄰接表演算法
【資料結構】鄰接矩陣及其實現 一個圖的鄰接矩陣的表示是唯一的,但其鄰接表表示不唯一,這是因為在鄰接表結構中,各便表結點的連結次序取決於建立鄰接表時的演算法以及輸入的次序。 一般而言鄰接矩陣適合儲存稠密圖,鄰接表適合儲存稀疏圖。 直接輸入: #include <s
【資料結構】單鏈表的逆序輸出
即:將一個已經建立好的單鏈表進行指標域的改變 今天突然被問到單鏈表逆序的問題,弄了好久才看出別人的程式有啥問題,就重新寫了一遍。 今天才在CSDN客戶端上看到美團的面試題是氣泡排序。 一個看似簡單的問題難倒很多人,所以簡單的不要因為他簡單就忽視它,人們在簡單的問題上越容易犯錯!
【資料結構】線性結構:儲存&運算&時間複雜度
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/shamingai/article/details/48914005 邏輯結構:表內元素的關係,共有集合、線性結構(線性表、棧、佇列、陣列)、樹形結構(樹、二叉樹、森林)、圖結構(圖)四種;
【資料結構】順序表的操作函式
SeqList.h #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include <stdio.h> #include <assert.h> #include <malloc.h> #include <window