【數據結構複習】(2)線性表(一)

線性表的定義

  線性表是最簡單的數據結構,一個線性表是由n個數據元素的有限序列。具有下列特點:

    (1)存在唯一一個被稱爲“第一個”的數據元素;

    (2)存在唯一一個被稱爲“最後一個”的數據元素;

    (3)除了第一個之外,集合中的每一個數據元素均只有一個前驅;

    (4)除最後一個之外,集合中的每一個數據元素均只有一個後繼。

線性表的實現

  下面在Visual Stduio C++ 6.0環境下對線性表的實現進行描述。由於線性表中的數據元素可以爲許多類型(int、float、char等等),爲了方便起見,只介紹int型作爲線性表的數據元素的類型的線性表。並且在《數據結構(C語言版)》中,線性表中元素的腳碼是從1開始,而在C語言中,腳碼均是從0開始。因此,在下面的介紹中,a0爲第一個元素,a1爲第二個元素,以此類推。

線性實現

  線性表的順序實現指的是用一組地址連續的存儲單元依次存儲線性表的數據元素。由於每個數據元素的大小均確定,根據數據元素的腳碼與線性表第一個數據元素的存儲位置(即基地址),即可確定任一數據元素的位置。所以線性表的順序存儲結構是一種隨機存取的存儲結構。

  高級語言中一般使用數據來描述數據結構中順序存儲結構,因爲它們具有比較相似的特性。

需要的一些共有信息

1 #include <stdlib.h>
2 #include <stdio.h>
3 #define Status int
4 #define OK 0
5 #define ERROR -1

線性表的結構

1 #define LIST_INIT_SIZE 100        //線性表的初始分配量
2 #define LISTINCREMENT 10 //線性表的分配增量
3 typedef struct
4 {
5 int *elem; //線性表的基址
6 int length; //當前長度
7 int listsize; //當前分配的存儲容量(最大長度)
8 }SqList,*pSqList;

線性表的初始化函數InitList_Sq

1 Status InitList_Sq(pSqList L)
2 {
3 //構造一個空的線性表L
4 L=(pSqList)malloc(sizeof(SqList)); //爲線性表分配空間
5 L->elem=(int*)malloc(sizeof(int)*LIST_INIT_SIZE);
6 L->length=0; //當前長度爲0
7 L->listsize=LIST_INIT_SIZE; //最大長度爲初始分配量
8 return OK;
9 }

 

 線性表的插入函數ListInsert_Sq

 

 1 Status ListInsert_Sq(pSqList L,int i,int e)
2 {
3 //在順序線性表L中第i個位置之前插入新的元素e
4 //i的合法性爲0<=i<=ListLength_Sq(L)
5 if(i<0||i>L->length) //i值不合法
6 return ERROR;
7 if(L->length>=L->listsize) //當前存儲空間已滿
8 {
9 int* newbase=(int*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(int)); //分配新的空間
10 if(!newbase) //分配失敗
11 exit(ERROR);
12 L->elem=newbase; //新基址
13 L->listsize+=LISTINCREMENT; //新的最大長度
14 }
15
16
17 for(int j=L->length;j>i;j--)
18 {
19 //i爲新元素在順序表中的位置,數組中第i個以及第i個之後的所有元素都要右移
20 L->elem[j]=L->elem[j-1];
21 }
22 L->elem[i]=e; //插入e
23 L->length++; //表長增1
24 return OK;
25 }

線性表的刪除函數ListDelete_Sq

 1 Status ListDelete_Sq(pSqList L,int i,int* e)
2 {
3 //在線性表L中刪除第i個元素,並用e返回其值
4 if(i<0||i>=L->length) //i值不合法
5 return ERROR;
6 *e=L->elem[i]; //被刪除元素賦予*e
7 for(int j=i;j<L->length;j++)
8 {
9 //被刪除元素之後的元素左移
10 L->elem[j]=L->elem[j+1];
11 }
12 L->length--;
13 return OK;
14 }

線性表查找函數LocateElem_Sq

 1 int LocateElem_Sq(pSqList L,int e,Status (*compare)(int ,int ))
2 {
3 //在順序線性表L中查找第1個值與e滿足compare()的元素的位序
4 //若找到,則返回其在L中的位序,否則返回-1
5 for(int i=0;i<L->length;i++)
6 {
7 if(!compare(e,L->elem[i])) //不滿足compare則繼續查找
8 continue;
9 else //滿足compare則退出循環
10 break;
11 }
12 if(i==L->length) //沒有找到與e比較後相等的元素
13 return -1;
14 else //返回相應的元素位序
15 return i;
16 }

 

線性表的合併函數MergeList_Sq

 1 void MergeList_Sq(pSqList La,pSqList Lb,pSqList Lc)
2 {
3 //已知順序線性表La和Lb的元素按值非遞減排列
4 //歸併La和Lb得到新的順序線性表Lc,Lc的元素也按值非遞減排列
5
6 Lc=(pSqList)malloc(sizeof(SqList)); //爲Lc分配空間
7 Lc->listsize=La->length+Lb->length; //Lc的已使用長度
8 Lc->length=La->length+Lb->length; //Lc的最大長度
9
10 Lc->elem=(int *)malloc(sizeof(int)*Lc->listsize); //分配線性表的存儲空間
11 if(!Lc) //分配失敗
12 {
13 free(Lc);
14 exit(ERROR);
15 }
16
17 //開始歸併
18 int pa=0; //指向La表的首元
19 int pb=0; //指向Lb表的首元
20 int pc=0; //指向Lc表的首元
21 while(pa<La->length&&pb<Lb->length)
22 {
23 if(La->elem[pa]<Lb->elem[pb])
24 {
25 Lc->elem[pc]=La->elem[pa];
26 pa++;
27 pc++;
28 }
29 else
30 {
31 Lc->elem[pc]=Lb->elem[pb];
32 pb++;
33 pc++;
34 }
35 }
36
37 //插入剩餘元素
38 while(pa<La->length)
39 {
40 Lc->elem[pc]=La->elem[pa];
41 pa++;
42 pc++;
43 }
44 while(pb<Lb->length)
45 {
46 Lc->elem[pc]=Lb->elem[pb];
47 pb++;
48 pc++;
49 }
50 }

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章