线性表的顺序存储结构(数据结构篇)
筆記:數據結構篇
線性表
順序表
知識點
1:線性表(linear list)是具有相同特征的數據元素的一個有限序列。
2:線性表用二元組(D,R)
D={ai|1<=i<=n,ai為ElemType類型} R={r} r={<a,ai+1>|1<=i<=n-1}3:線性表具有以下特征
(1)有窮性:一個線性表中的元素個數是有限的
(2)一致性:一個線性表所有的元素的性質具有相同的
(3)序列性:一個系線性表中所有的元素之間相對位置是線性的,
各元素的位置只取決于它們的序號,所以一個線性表中可以存在兩個相同的值
以下為順序表基本運算
void initList(linearList * &L); // 初始化一個空的線性表
void createList(linearList * &L, ElemType data[], int n) // 自動確定長度的初始化方法
void destroyList(linearList * &L); // 銷毀線性表并釋放其所存儲的空間
bool insertElem(linearList * &L, int i, ElemType el); // 在第 i 個位置插入 el 元素,i 不正確或空間不足返回false.
// bool insertElem(linearList * &L, int i, ElemType * el); // insertElem 方法的重載
bool deleteElem(linearList * &L, int i, ElemType &el); // 刪除第 i 個元素,并用 el 返回其值
// deleteElem(linearList * &L, int i); // deleteElem 方法的重載
// 以下方法只讀取數據無需改實參值的引用傳遞
bool listEmpty(linearList * L); // @return [Bool] 線性表是否為空
int listLength(linearList * L); // 返回線性表(數據的)的長度
void printList(linearList * L); // (控制臺)打印線性表
bool getElem(linearList * L, int index, ElemType &el); // 獲取線性表中引索為 index 的元素的值,引用賦值到傳入el的實參上,越界時返回false
// void getElem(linearList * L, int index, ElemType * el); // getElem 方法的重載,指針賦值給 ElemType 的數據類型(理論更省空間)
int locateElem(linearList * L, ElemType el); // 順序查找第一個線性表數據中第一個和 el 相等的數據的引索,沒有找到則返回-1
// void locateElem(linearList * L, ElemType * el); // locateElem 方法的重載,指針操作 ElemType 的數據類型(理論更省空間)
| void InitList(SqList *&L) | 初始化線性表 |
| DestroyList(SqList *&L) | 銷毀線性表 |
| bool ListEmpty(SqList *L) | 判段是否是空表 |
| int ListLength(Sqlist *L) | 求線性表長度 |
| void DispList(SqList *L) | 輸出線性表 |
| bool GetElem(L,i,ElemType&e) | 求線性表中的某個數據元素值 |
| bool LocateElem(SqList *L.ElemType e) | 按元素值查找 |
| bool ListInsert(SqList *&L,int i,ElemType e) | 插入數據元素 |
| bool ListDelete(&L,i,&e) | 刪除數據元素 |
以下為我的代碼實現
#include <stdio.h> #include <stdlib.h> #define MaxSize 20 /* void CreateList(SqList*&L,ELemType a[],int n) //建立由n個元素組成順序表void InitList(SqList *&L) //初始化線性表 DestroyList(SqList *&L) // 銷毀線性表 bool ListEmpty(SqList *L) // 判段是否是空表 int ListLength(Sqlist *L) // 求線性表長度 void DispList(SqList *L) //輸出線性表 bool GetElem(L,i,ElemType&e) // 求線性表中的某個數據元素值 bool LocateElem(SqList *L.ElemType e) // 按元素值查找 bool ListInsert(SqList *&L,int i,ElemType e) // 插入數據元素 bool ListDelete(&L,i,&e) //刪除數據元素 */ typedef int ElemType; typedef struct {ElemType data[MaxSize];ElemType *elem;//存放線性表中的元素int length; //存放線性表的長度 } SqList; //順序表的類型void InitList(SqList * &L) {L = (SqList * )malloc(sizeof(SqList));//分配存放線性表的空間L->length = 0; //置空線性表的長度為0 }void CreateList(SqList *&L,ElemType a[],int n) {int i = 0,k=0; //k表示L中元素的個數L = (SqList * )malloc(sizeof(SqList)); //分配存放線性表的空間while(i<n) //掃描數組a中的元素,并且將a[i]中的元素存放到L中{L->data[k] = a[i];k++;i++;}L->length = k; //設置L的長度為k }void DestoryList(SqList * &L) {free(L); }bool ListEmpty(SqList * L) {return (L ->length==0);}int ListLength(SqList * L) {return(L->length); }void DispList(SqList * L) {for(int i=0;i<L -> length;i++)printf("%d",L->data[i]);printf("\n"); }bool GetElem(SqList * L,int i,ElemType &e) {if(i<1||i>L->length)return false;e = L->data[i];return true; }int LocateElem(SqList *L,ElemType e) {int i = 0;while(i<L->length &&L->data[i]!=e)i++;if(i>=L->length)return 0;elsereturn i+1; }bool ListInsert(SqList *&L,int i,ElemType e) {/*int j;if(i<1|| i>L->length +1||L->length ==MaxSize)return false;i--;for(j=L->length;j>i;j--)L->data[j]=L->data[j-1];L ->data[i] = e;L ->length++;return true;*///1.檢查插入的位置是否合法int j=0;if (L->length>=MaxSize) {printf("移除\n");return 0;}else if (i<1||i>L->length+1) {printf("插入位置不正確\n");return 0;} else {for (j=L->length-1; j>=i-1; j--)//2.插入位置以后的所有元素依次后移L->data[j+1]=L->data[j];//3.將元素x置入到下標i-1的位置L->data[i-1]=e;//4.將表的長度加1L->length=L->length+1;return 1; } }bool ListDelete(SqList *&L,int i,ElemType &e) {int j;if(i<1 || i>L->length)return false;i--;e=L->data[i];for(j=i;j<L->length-1;j++)L->data[i] = L ->data[j+1];L->length--;return true; }/* //重建法:合并A,B中元素,先將A中的元素放入C中,再將B中與A不同的元素放入C中 void Union1(SqList *A,SqList *B,SqList *&C)//有序順序表表示集合,求集合的并 {int i,lena;ElemType e;for(i=1;i<=ListLength(A);i++){GetElem(A,i,e);ListInsert(C,i,e);}lena=ListLength(A);for(i=1;i<=ListLength(B);i++){GetElem(B,i,e);if(!LocateElem(A,e))ListInsert(C,++lena,e);} }*/ void DispalyElem(SqList *l){for(int i=0;i<l->length;i++)printf("%d ",l->elem[i]);printf("\n");}/*void Union(SqList *A,SqList *B,SqList *&C){printf("求線性表的并集\n");int i=0,j=0,k=0;int a,b;while((i<=A->length-1)&&(j<=B->length-1)){GetElem(A,i,a);GetElem(B,j,b);if(a<=b)//給元素排序,并且存到C中{C->elem[k++]=A->elem[i++];}else{C->elem[k++]=B->elem[j++];}}while(i<=A->length-1){GetElem(A,i,a);C->elem[k++]=A->elem[i++];}while(j<=B->length-1){GetElem(B,j,b);C->elem[k++]=B->elem[j++];}C->length=k;}*/int main() {SqList *L;int a[]={0,2,3,4,5,6,7,8,9,0};CreateList(L,a,10);DispList(L);int sucess = ListInsert(L,10,10);if(sucess){printf("插入成功\n");}else{printf("插入失敗\n");}DispList(L);DestoryList(L);system("pause");/* SqList *A,*B,*C;InitList(A);//初始化線性表A;InitList(B);//初始化線性表B;printf("輸入線性表A元素個數:\n");scanf("%d",&A->length);printf("輸入線性表A中的元素:\n");for(int j=0;j<A->length;j++){scanf("%d",&A->data[j]);}printf("輸入線性表B元素個數:\n");scanf("%d",&B->length);printf("輸入線性表B中的元素:\n");for(int j=0;j<B->length;j++){scanf("%d",&B->data[j]);}Union(A,B,C);DispalyElem(C);return 0;*/}總結:幾次運行失敗的原因,
1:沒有理解線性表的結構
2:沒有理解里面參數的實際意義如*,&
3:運行使用的數據范圍,要在邊界范圍內
鏈表
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
1:單鏈表的優點不要連續空間,改變容量方便,不可以隨機存儲,耗費一定空間指針
2:強調這是一個單鏈表用Linklist
? 強調這是一個節點用LNode*
總結
以上是生活随笔為你收集整理的线性表的顺序存储结构(数据结构篇)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年度618品牌营销分析报告
- 下一篇: this的用法(java篇)