(數據結構)順序存儲的線性表
阿新 • • 發佈:2018-05-20
計算機 ear func 可行性 cat 特性 一對一 輸出 code
---恢復內容開始---
推薦一本學習書籍:程傑的《大話數據結構》。
既然是數據結構,那什麽是數據結構呢?這裏補充一些基本術語和概念。
數據結構: 是一門研究非數值計算的程序設計問題中的操作對象,以及它們之間的關系和操作等相關問題的學科。
- 數據: 是描述客觀事物的符號,是計算機中可以操作的對象,是能被計算機識別,並輸入給計算機處理的符號總集。
- 數據元素: 是組成數據、有一定意義的基本單位,在計算機中通常作為整體處理。也成為記錄。
- 數據項: 一個數據元素可以由若幹個數據項組成。數據項是數據不可分割的最小單位。
- 數據對象: 是性質相同的數據元素的集合,是數據的子集。
- 數據結構:是相互之間存在一種或多種特定關系的數據元素的集合。
- 邏輯結構:是指數據對象中數據元素之間的相互關系。
- 集合結構:集合結構中的數據元素除了屬於同一個集合外,它們之間沒有其他關系。
- 線性結構:線性結構中的數據元素之間是一對一的關系。
- 樹形結構:樹形結構中的數據元素之間存在一種一對多的層次關系。
- 圖形結構:圖形結構的數據元素是多對多的關系。
- 物理結構:是指數據的邏輯結構在計算機中的存儲形式
- 順序存儲結構:是把數據元素存放在地址連續的存儲單元裏,其數據將的邏輯關系和物理關系是一致的。
- 鏈式存儲結構:是把數據元素存放在任意的存儲單元裏,這組存儲單元可以是連續的,也可以是不連續的。
- 數據類型:是指一組性質相同的值的集合及定義在此集合上的一些操作的總稱。
- 抽象數據類型:是指一個數學模型及定義在該模型上的一組操作。
- 算法:是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示一個或多個操作。
- 算法的5個基本特性:輸入,輸出,有窮性,確定性和可行性。
本篇學習線性表,線性表是什麽?
- 線性表(List):零個或多個數據元素的有限序列。
頭部定義(seq_header.h)
#include<stdio.h> #include<stdlib.h> #define maxsize 100 #define ok 1 #define error 0 #define true 1 #define false 0 typedef int status; typedefint elemType; typedef struct{ elemType data[maxsize]; int length;//current length of Sqlist }SqList;
線性表操作函數(seq_func.h)
/*輸出指定數據*/ status visit(elemType e){ printf("%d ", e); return ok; } /*判斷線性表是否為空*/ status listEmpty(SqList L){ if(L.length == 0) return true; else return false; } /*清除線性表*/ status clearList(SqList *L){ L->length = 0; return ok; } /*返回線性表數據元素個數*/ int listLength(SqList L){ return L.length; } /*初始條件: 順序線性表L已存在,1 <= i <= listLength(L)*/ /*操作結果: 刪除L的第i個數據元素,並用e返回其值,L得長度減1*/ status listDelete(SqList *L, int i, elemType *e){ int k; if(L->length == 0) return error; if(i < 1 || i>L->length) return error; *e=L->data[i-1]; if(i < L->length){ for(k = i; k<L->length; k++) L->data[k-1] = L->data[k]; } L->length--; return ok; } /** Status: if ok return OK(=1) Condition: SqList already exists, 1 <= i <= ListLength(SqList) Result: use e to return the index of i value in SqList */ status getElem(SqList L, int i, elemType *e){ if(L.length == 0 || i < 1 || i > L.length) return error; *e = L.data[i-1]; return ok; } /*初始化順序線性表*/ status initList(SqList *L){ L->length = 0; return ok; } /*初始條件: 順序線性表L已存在,1 <= i<= ListLength(L)*/ /*操作結果:在L中第i個位置之前插入新的數據元素e, L的長度加1*/ status listInsert(SqList *L, int i, elemType e){ int k; if(L->length == maxsize)/*順序表已經滿了*/ return error; if(i < 1 || i > L->length+1)/*插入的位置超過範圍*/ return error; if(i <= L->length){/*插入的位置不在表尾*/ for(k = L->length - 1; k >= i-1; k--) L->data[k+1] = L->data[k]; } L->data[i-1] =e; L->length++; return ok; } /*初始條件:順序線性表L已存在*/ /*操作結果:依次對L的每個數據元素輸出*/ status listTrave(SqList L){ int i; for(i = 0; i<L.length; i++) visit(L.data[i]); printf("\n"); return ok; } /*初始條件: 順序線性表L已存在*/ /*操作結果: 返回L中第1個與e滿足關系的位序*/ /*若這樣的數據元素不存在,則返回0*/ int locateElem(SqList L, elemType e){ int i; if(L.length == 0) return 0; for(i = 0; i < L.length; i++){ if(L.data[i] == e) break; } if(i >= L.length) return 0; return i+1; } /*將後一個線性表合並到前一個線性表上*/ void unionL(SqList *La, SqList Lb){ int La_len, Lb_len, i; elemType e; La_len = listLength(*La); Lb_len = listLength(Lb); for(i = 1; i<=Lb_len; i++){ getElem(Lb, i, &e); if(!locateElem(*La, e)) listInsert(La, ++La_len, e); } }
主函數測試(main.cpp)
#include "seq_header.h" #include "seq_func.h" int main(){ SqList L;//定義一個順序線性表 elemType e; status i; int j, k; i = initList(&L);//初始化一個順序線性表 printf("初始化後L:L.length = %d\n", L.length); for(j = 1; j <= 5; j++) i = listInsert(&L, j, j); printf("在L的表頭依次插入1~5後: L.data = "); listTrave(L); printf("L.length = %d \n", L.length); i = listEmpty(L); printf("L是否為空:i=%d(1:是 0:否)\n", i); i = clearList(&L); printf("清空L後:L.length = %d\n", L.length); i = listEmpty(L); printf("L是否為空:i=%d(1:是 0:否)\n", i); for(j = 1; j <= 10; j++) listInsert(&L, 1, j); printf("在L的表尾依次插入1~10後:L.data="); listTrave(L); printf("L.length = %d \n", L.length); getElem(L, 5, &e); printf("第5個元素為:%d\n", e); for(j = 3; j <= 4; j++){ k = locateElem(L, j); if(k) printf("第%d個元素的值為%d\n", k, j); else printf("沒有值為%d的元素\n",j); } j = 5; listDelete(&L, j ,&e); printf("刪除第%d個元素值為:%d\n", j, e); printf("依次輸出L的元素:"); listTrave(L); //構造一個有10個數的Lb SqList Lb; i = initList(&Lb); for(j=6; j<= 15; j++){ i = listInsert(&Lb, 1, j); } unionL(&L, Lb); printf("依次輸出了合並了Lb的L的元素:"); listTrave(L); return 0; }
(數據結構)順序存儲的線性表