【數據結構】線性表(一):順序列表

  線性表(linear_list)是最常用且最簡單的一種數據結構,簡言之,一個線性表是n個數據元素的有序序列。

?

例如:(a1?, ... ,?ai-1 , ai , ai+1 , ... , an):ai-1?是 ai 的直接前驅,ai+1 是 ai 的直接后驅。

并且,當 i = 1,2,... ,n-1:ai 有且只有一個直接后驅。當 i = 2,3,... ,n:ai 有且只有一個直接前驅

  

例子:已知線性表LA,LB中的數據元素按值非遞減有序排列,現將LA,LB按值非遞減排列合并為LC。其偽代碼為:

 1 void MergeList(List La, List Lb, List &Lc) {
 2         initList(Lc);  //初始化Lc
 3         i = j = 1;
 4         k = 0;
 5         La_len = ListLength(La);
 6         Lb_len = ListLength(Lb);
 7         while((i <= La_len) && (j <= Lb_len){//La與Lb均非空
 8             GetElem(La, i, ai);
 9             GetElem(Lb, j, bj);
10             if(ai <= bj) {ListInsert(Lc, ++k, ai); ++i; }
11             else{ListInsert(Lc, ++k, bi); ++j;}
12         }
13         while(i <= La_len){       //La中剩余值插入Lc
14             GetElem(La, i++, ai);
15             ListInsert(Lc, ++k, ai);
16         }
17         while(j <= Lb_len){       //Lb中剩余值插入Lc
18             GetElem(Lb, j++, bj);
19             ListInsert(Lc, ++k, bj);
20         }
21 }

  分析:GetElem 和 ListInsert 這兩個操作的執行時間和表長無關,所以該算法的事件復雜度為O(ListLength(LA) + ListLength(LB))。

?

線性表的順序表示和實現:順序表示指的是用一組地址連續的存儲單元依次存儲線性表的數據元素。

所以可以用 LOC(ai) = LOC(a1) + (i-1) * l ?來表示ai的地址(其中:l 表示每個元素所占存儲單元)

優點:輕松實現隨機存儲。

順序表的初始化、插入、刪除、合并的偽代碼如下:

?

 1 // -------------線性表的動態分配順序存儲結構--------------
 2 #define LIST_INIT_SIZE 100   //線性表存儲空間的初始化分配量
 3 #define LISTINCREMENT 10     //線性表存儲空間的分配增量
 4 typedef struct{
 5     ElemType *elem;     //存儲空間基址
 6     int length;         //當前長度
 7     int listsize;       //當前分配的存儲容量(以sizeof(ElemType)為單位)
 8 }SqList;
 9 
10 //-----------初始化順序表--------------
11 Status InitList_Sq(SqList &L){
12     //構造一個空的線性表
13     L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
14     if(! L.elem)  eixt(OVERFLOW);       //存儲分配失敗
15     L.length = 0;                       //空表長度為0
16     L.listsize = LIST_INIT_SIZE;        //初始存儲容量
17     return OK;
18 }
19 
20 //------------順序表的插入算法-------------時間復雜度為O(n)
21 Status ListInsert_Sq(SqList &L, int i, ElemType e) {
22     //在順序線性表L中第i個位置之前插入新的元素e
23     //i的合法值為1<=i<=ListLength_Sq(L)+1
24     if((i<1) || (i>L.length+1))  return ERROR;        //i值不合法
25     if(L.length >= L.listsize){           //當前存儲空間已滿,增加分配
26         newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT)*sizeof(ElemTpye));
27         if(!newbase) exit(OVERFLOW);        //存儲分配失敗
28         L.elem = newbase;               //新基址
29         L.listsize += LISTINCREMENT;        //增加存儲容量
30     }
31     q = &(L.elem[i-1]);         //q為插入位置
32     for(p = &(L.elem[L.length-1]); p >= q; --p) 
33         *(p+1) = *p;            //插入位置及之后的元素右移
34         *q = e;             //插入e
35         ++L.length;         //表長增一
36         return OK;
37 }
38 
39 //-------------順序表的刪除操作--------------時間復雜度為O(n)
40 Status ListDelete_Sq(SqList &L, int i, ElemType &e){
41     //在順序線性表L中刪除第i個元素,并用e返回其值。
42     if((i<1) || (i>L.length)) return ERROR;     //i值不合法
43     p = &(L.elem[i-1]);             //p為被刪除元素的位置
44     e = *p;         //被刪除元素的值賦給e
45     q = L.elem + L.length-1;        //表尾元素的位置
46     for(++p; p <= q; ++p){
47         *(p-1) = *p;    //被刪除元素之后的元素左移
48     }
49     --L.length;         //表長減1
50     return OK;
51 }
52 
53 //-----------查找制定元素的位序---------------事件復雜度為O(n)
54 int LocateElem_Sq(SqList L, ElemType e, Status (* compare)(ElemType, ElemType)){
55     //在順序線性表L中查找第1個值與e滿足compare()的元素的位序
56     //若找到,則返回其在L中的位序,否則返回0
57     i = 1;              //i的初值為第一個元素的位序
58     p = L.elem;         //p的初值為第一個元素的存儲位置
59     while(i <= L.length && !(* compare)(*p++, e)) ++i;
60     if(i<L.length) return i;
61     else return 0;
62 }
63 
64 //------------對于順序表的合并------------------時間復雜度為O(La.length + Lb.length)
65 void MergeList_Sq(SqList La, SqList Lb, SqList &Lc) {
66     pa = La.elem;
67     pb = Lb.elem;
68     Lc.listsize = Lc.length = La.length + Lb.length;
69     pc = Lc.elem = (ElemType *) malloc (Lc.listsize*sizeof(ElemType));
70     if(!Lc.elem) exit(OVERFLOW);        //存儲分配失敗
71     pa_last = La.elem + La.length -1;
72     pb_last = Lb.elem + Lb.length -1;
73     while(pa <= pa_last && pb <= pb_last){  //歸并
74         if(*pa <= *pb) *pc++ = *pa++;
75         else *pc++ = *pb++;
76     }
77     while(pa <= pa_last) *pc++ = *pa++;
78     while(pb <= pb_last) *pc++ = *pa++;
79 }?

?

  C語言代碼實現:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 
  5 #define LIST_INIT_SIZE 100      //線性表存儲空間初始分配量
  6 #define LISTINCREMENT 10        //線性表存儲空間的分配增量
  7 
  8 typedef struct {
  9     int *elem;      //存儲空間基址
 10     int length;     //當前長度
 11     int listsize;   //當前分配的存儲空間容量(以sizeof(int)為單位
 12 }SqList;
 13 
 14 //初始化一個新表
 15 void InitList_Sq(SqList *L){
 16     //構造一個空的線性表L
 17     (*L).elem = (int *) malloc(LIST_INIT_SIZE*sizeof(int));
 18     if(!(*L).elem) exit(-1);     //存儲分配失敗
 19     (*L).length = 0;
 20     (*L).listsize = LIST_INIT_SIZE;
 21 }
 22 
 23 //向表中第i個位置出插入一個數e
 24 void ListInsert_Sq(SqList *L, int i, int e){
 25     if(i<1 || i>(*L).length+1) {
 26         printf("插入時i值不合法...\n");
 27         exit(-1);
 28     }
 29     if((*L).length > (*L).listsize) {     //當前存儲空間已滿,增加分配
 30         int *newbase = (int *)realloc((*L).elem, ((*L).length+LISTINCREMENT)*sizeof(int));
 31         if(!newbase) exit(-1);
 32         (*L).elem = newbase;
 33         (*L).listsize += LISTINCREMENT;
 34     }
 35     int *q = &(*L).elem[i-1];
 36     for(int *p=&(*L).elem[(*L).length -1];p>=q;--p){
 37         *(p+1) = *p;
 38     }
 39     *q = e;
 40     ++(*L).length;
 41 }
 42 
 43 //刪除表中第i個位置的數并返回到e中
 44 void ListDelete_Sq(SqList *L, int i, int *e){
 45     if(i<1 || i>(*L).length){
 46         printf("刪除時i值不合法...\n");
 47         exit(-1);
 48     }
 49     int *p = &(*L).elem[i-1];       //要刪除的元素
 50     *e = *p;                        //被刪除的元素賦值給e
 51     int *q = &(*L).elem[(*L).length-1];     //表尾元素
 52     for(++p;p<=q;p++){          //被刪除元素之后的元素左移
 53         *(p-1) = *p;            
 54     }
 55     --(*L).length;
 56 }
 57 
 58 void MergeList_Sq(SqList La, SqList Lb, SqList *Lc){
 59     //已知順序表La,Lb的元素按值非遞減排列
 60     //歸并La,Lb得到新的順序列表Lc,Lc的元素也按值非遞減排列
 61     int *pa = La.elem;
 62     int *pb = Lb.elem;
 63     (*Lc).listsize = (*Lc).length = La.length + Lb.length;
 64     int *pc = (*Lc).elem = (int *)malloc((*Lc).listsize * sizeof(int));
 65     if(!(*Lc).elem){
 66         printf("內存分配失敗...\n");
 67         exit(-1);
 68     }
 69     int *pa_last = La.elem + La.length -1;      //La的表尾元素地址
 70     int *pb_last = Lb.elem + Lb.length -1;      //Lb的表尾元素地址
 71     while(pa<=pa_last && pb<=pb_last){
 72         if(*pa <= *pb){
 73             *pc++ = *pa++;
 74         }else{
 75             *pc++ = *pb++;
 76         }
 77     }
 78     while(pa<=pa_last){         //插入La剩余的元素
 79         *pc++ = *pa++;          //插入Lb剩余的元素
 80     }
 81     while(pb <= pb_last){
 82         *pc++ = *pb++;
 83     }
 84 }
 85 
 86 //查看順序表中第一個的滿足compare()的元素的位序
 87 int LocateElem_Sq(SqList L, int e, int (* compare)(int x, int y)){
 88     int i = 1;
 89     int *p = L.elem;
 90     while(i <= L.length && !(*compare)(*p++, e)){
 91         ++i;
 92     }
 93     if(i <= L.length){
 94         return i;
 95     }else{
 96         return 0;
 97     }
 98 }
 99 
100 int cmp(int x, int y){
101     if(x == y){
102         //printf("x=y\n");
103         return 1;
104     }else{
105         //printf("x!=y\n");
106         return 0;
107     }
108 }
109 int main(){
110     SqList La;
111     SqList Lb;
112     SqList Lc;
113     int N,e;
114     InitList_Sq(&La);
115     printf("輸入La元素的個數N:");
116     scanf("%d",&N);
117     printf("輸入La的元素:");
118     while(N--){
119         scanf("%d",&e);
120         int i =La.length+1;
121         ListInsert_Sq(&La,i,e);
122     }
123     InitList_Sq(&Lb);
124     printf("輸入Lb元素的個數N:");
125     scanf("%d",&N);
126     printf("輸入Lb的元素:");
127     while(N--){
128         scanf("%d",&e);
129         int i =Lb.length+1;
130         ListInsert_Sq(&Lb,i,e);
131     }
132     printf("此時La中的元素順序表的值為:");
133     for(int i=0;i<La.length;i++){
134         printf("%d ",La.elem[i]);
135     }
136     printf("\nLa.length = %d\tLa.listsize = %d\n",La.length,La.listsize);
137     printf("此時Lb中的元素順序表的值為:");
138     for(int i=0;i<Lb.length;i++){
139         printf("%d ",Lb.elem[i]);
140     }
141     printf("\nLb.length = %d\tLb.listsize = %d\n",Lb.length,Lb.listsize);
142     ListDelete_Sq(&La,4,&e);
143     printf("刪除第四個元素后La的元素順序表的值為:");
144     for(int i=0;i<La.length;i++){
145         printf("%d ",La.elem[i]);
146     }
147     printf("\nLa.length = %d\tLa.listsize = %d\te = %d\n",La.length,La.listsize,e);
148     MergeList_Sq(La, Lb, &Lc);
149     printf("La和Lb合并后得到Lc,其Lc的信息為:\n");
150     printf("Lc的元素順序表為:");
151     for(int i=0;i<Lc.length;i++){
152         printf("%d ",Lc.elem[i]);
153     }
154     printf("\nLc.length = %d\tLc.listsize = %d\n",Lc.length,Lc.listsize);
155     printf("輸入你要在Lc中查找的元素e:");
156     scanf("%d",&e);
157     printf("該元素e在Lc的位序位:%d\n",LocateElem_Sq(Lc, e, cmp));
158   free(La.elem);free(Lb.elem);free(Lc.elem);return 0;
159 }

  結果為:

  

?

轉載于:https://www.cnblogs.com/TsnTse/p/9070013.html

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

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

相關文章

Python_XlrdXlwt

1 import xlrd 2 # \U 開始的字符被編譯器認為是八進制 解決方法 r 3 objWB xlrd.open_workbook(rC:\Users\IBM\Desktop\S1\7月下旬入庫表.xlsx) 4 # 索引號 objTable objWB.sheet_by_index(0) 5 objTable objWB.sheet_by_name(7月下旬入庫表) 6 # 單元格3種讀取方式 7 print…

校招需要看的書 鞏固的知識

前言 感謝教練&#xff0c;學長們&#xff0c;隊友&#xff0c;lollipop&#xff0c;貓哥&#xff0c;李哥&#xff0c;表哥&#xff0c;雞哥&#xff0c;樣樣&#xff0c;咸糖&#xff0c;茗記&#xff0c;明沙&#xff0c;嘻&#xff0c;樹佬(排名不分先后)等等太多太多的人的…

新的Teams API權限控制

這篇繼續介紹BUILD大會里的內容&#xff1a;新的Teams API權限。這些新的權限讓開發者可以更加細粒度的設置權限。 之前有些開發人員有問過我&#xff0c;為什么Graph API的權限這么多&#xff0c;為什么不針對Teams弄一個總的權限&#xff0c;這樣不是更加簡單嗎&#xff1f;…

物料主數據(MM03)跳轉函數

CP_08_MATERIAL_SHOW 使用感覺能使自己的代碼顯得更改高端些。 其中參數MTSTA_IMP的選值參照表T132。轉載于:https://www.cnblogs.com/tangcy1110/p/9081380.html

二叉樹的蛇形遍歷 leetcode 103

給定一個二叉樹&#xff0c;返回其節點值的鋸齒形層次遍歷。&#xff08;即先從左往右&#xff0c;再從右往左進行下一層遍歷&#xff0c;以此類推&#xff0c;層與層之間交替進行&#xff09;。 例如&#xff1a;給定二叉樹 [3,9,20,null,null,15,7], 3/ \9 20/ \15 7返回…

Teams Tab的Single Sign-On

在我寫這篇文章的時候&#xff0c;這個SSO機制還是在 Developer Preview 階段&#xff0c;可能在發布前還會有一些改進。不過我覺得這個功能很好&#xff0c;所以先和大家分享一下。 如果大家之前已經開發過Teams的tab應用&#xff0c;可能會發現如果你需要一個當前用戶的toke…

vim編輯器的使用--轉自MJ學長

一、引言 1. vim是一款功能強大的文本編輯器&#xff0c;如果使用熟練&#xff0c;將會有效幫助我們提高編輯文本、程序的效率。vim編輯器的上手使用門檻比較高&#xff0c;很多人怯于要記很多命令&#xff0c;往往在學習的初期階段就望而卻步。 2. vim的學習需要不斷的練習、使…

算法引入

算法的概念&#xff1a; 解決問題的思路。 時間復雜度&#xff1a; 定義&#xff1a; 基本運算的執行數量。是算法效率的衡量的量。 計算準則&#xff1a; 基本操作&#xff1a;即只有常數項。復雜度認為1順序&#xff0c;按照加法計算循環&#xff0c;按照乘法計算條件。按照最…

如何開發Teams Bot

很多朋友問我如何開發一個成功的Teams Bot&#xff0c;他們說Bot Framework SDK看起來簡單&#xff0c;但是真要的去開發一款成熟的bot&#xff0c;很多地方還是不知道如何使用。我從最早的bot framework還在beta的時候開始用&#xff0c;后來framework經歷了多次大的改動&…

[CF903G]Yet Another Maxflow Problem

[CF903G]Yet Another Maxflow Problem 題目大意&#xff1a; 有\(A\)類點和\(B\)類點各\(n(n\le2\times10^5)\)個&#xff0c;所有\(A_i\)到\(A_{i1}\)有一條權值為\(a_i\)的有向邊&#xff0c;所有\(B_i\)到\(B_{i1}\)有一條權值為\(b_i\)的有向邊&#xff0c;另有\(m(m\le2\t…

P1579哥德巴赫猜想

寫來自己學習用~ 題目內容&#xff1a; 1742年6月7日哥德巴赫寫信給當時的大數學家歐拉&#xff0c;正式提出了以下的猜想&#xff1a;任何一個大于9的奇數都可以表示成3個質數之和。質數是指除了1和本身之外沒有其他約數的數&#xff0c;如2和11都是質數&#xff0c;而6不是質…

在VSCode Remote環境下開發Teams Bot

我使用VS Code開發已經有蠻長一段時間了&#xff0c;時間長了&#xff0c;越來越喜歡VS Code&#xff0c;雖然有些時候會沒有傳統的VS方便&#xff0c;比如開發Azure Function時你需要編寫一下launch.json&#xff0c;而且你需要手動啟動StorageEmulator&#xff0c;但是也正是…

查看安卓APK源碼破解

原文:查看安卓APK源碼破解工具準備&#xff1a; <1>.android4me的AXMLPrinter2工具 <2>dex2jar <3>jd-gui 工具下載&#xff1a;http://download.csdn.net/detail/catshitone/8491347 開始&#xff1a; 第一步&#xff1a; 首先用解壓軟件&#xff08;如好…

實驗六:類的封裝

一、實驗代碼如下&#xff1a; 1 package 實驗6;2 3 import java.util.Scanner;4 5 6 public class Account {7 8 public int id;9 public String name;10 public long number;11 public long time;12 public int money;13 14 //方法Account()…

Teams Bot開發系列:初識Bot

上次我們講了Teams Bot開發的概述&#xff0c;講了Azure Bot Service&#xff0c;Bot Framework SDK和我們自己的bot服務的概念&#xff0c;這篇文章就帶大家看看Azure Bot Service和我們的bot是如何發生關系的。 我們自己開發的bot服務實際上就是一個api service&#xff0c;…

[環境搭建]SDN網絡感知服務與最短路徑應用

1.安裝python模塊networkxpip install networkx2.給Network_Awareness.py加修改權限chmod 777 Network_Awareness.py3.下載安裝ryugit clone git://github.com/osrg/ryu.gitcd ryu sudo python ./setup.py install#若已安裝ryu,刪了再裝&#xff0c; pip uninstall ryu4.修改“…

我需要別人承認才快樂嗎?

關于生命的感悟兩個故事第一個故事&#xff0c;一個尖子生考上了麻省理工學院&#xff0c;在那里所有同學都很優秀&#xff0c;競爭非常強烈&#xff0c;她發現再也不能出類拔萃&#xff0c;在各方面贏過別人&#xff0c;于是覺得生活看不到希望&#xff0c;郁郁寡歡&#xff0…

Teams Bot開發系列:Activity和Turn

這篇文章我們來說一下Activity和Turn這兩個bot framework中最重要的兩個概念&#xff0c;同時也介紹一下TurnContext和BotAdapter Activity 一個activity是聊天雙方的一個信息載體&#xff0c;它可以是一條消息&#xff0c;也可以是一個動作。比如用戶給bot發送一條文字消息&…

ubuntu16.04下安裝opencv出現libgtk2.0-dev配置失敗問題解決方法

第一次在ubuntu下安裝opencv&#xff0c;遇到很多問題&#xff0c;特別是libgtk2.0-dev總是配置失敗的問題&#xff0c;在網上也看到一些解決方法&#xff0c;自己也遇到一些比較奇葩的問題&#xff0c;故整理于此。 網上大部分的解決方案就是更改下載源&#xff0c;我看到一些…

03|模型I/O:輸入提示、調用模型、解析輸出

03&#xff5c;模型I/O&#xff1a;輸入提示、調用模型、解析輸出 從這節課開始&#xff0c;我們將對 LangChain 中的六大核心組件一一進行詳細的剖析。 模型&#xff0c;位于 LangChain 框架的最底層&#xff0c;它是基于語言模型構建的應用的核心元素&#xff0c;因為所謂 …