常用數據結構
目錄
1.線性表
定義:
- 由n個具有相同性質的數據元素組成的有窮序列。
特點:(一對一的關係)
- 存在唯一一個稱爲”第一個“的數據元素,它沒有直接的前驅。
- 存在唯一一個稱爲“最後一個”的元素,他沒有直接後驅。
- 除第一個數據元素以外,表中的每個數據元素有且僅有一個直接前驅。
- 除第一個數據元素以外,表中的每個數據元素有且僅有一個直接後驅。
1.1順序表
定義:
- 用一組地址連續的存儲單元依次存儲線性表中每個數據元素。
特點:
- 邏輯關係相鄰的兩個元素在物理位置上也相鄰。
實現:
typedef struct { int items[LISTSIZE]; int length; } SqList;
- length:線性表當前的長度。
- LISTSIZE:初始化時,順序表中最多含有LISTSIZE個元素。
基本操作:
初始化順序表
//初始化順序表,表的長度設置爲0 void InitList(SqList *L) { L->length=0; }
求順序表中當前元素的個數
//順序表的長度 int ListLength(SqList * L) { return L->length; }
判斷順序表是否爲空
//判斷順序表是否爲空 bool ListEmpty(SqList *L) { if(L->length==0) return true; else return false; }
向順序表中插入數據元素
//向順序表中插入數據元素 bool ListInsert(SqList *L,int pos,int item) { int i; if(L->length==LISTSIZE) { printf("順序列表已滿,無法進行插入操作"); return false; } if(pos<1||pos>L->length+1) { printf("插入位置不合法"); return false; } for(i=L->length-1;i>=pos-1;i--) { L->items[i+1]=L->items[i]; } L->items[pos-1]=item; L->length++; return true; }
刪除順序表中的元素
//刪除順序表中的元素 bool ListDelete(SqList *L,int pos,int *item) { int i; if(L->length==0) { printf("順序表爲空表"); return false; } if(pos<1||pos>L->length) { printf("刪除位置無效"); } *item=L->items[pos-1]; for(int i=pos-1;i<L->length-1;i++) { L->items[i]=L->items[i+1]; } L->length--; return true; }
查找指定元素在順序表中的位置
//查找制定元素在順序表中的位置 int Find(SqList L,int item) { int pos=0; if(ListEmpty(&L)) { printf("順序表爲空表,無法進行查找操作"); return 0; } while(pos<L.length&&L.items[pos]!=item) { pos++; } if(pos<L.length) return pos+1; else return 0; }
獲取順序表中指定位置上的數據元素
//獲得順序表中指定位置上的數據元素 int GetElem(SqList *L,int pos,int *item) { if(ListEmpty(L)) return 0; if(pos<1||pos>L->length) return 0; *item=L->items[pos-1]; return 1; }
遍歷順序表
//遍歷順序表 void TravereList(SqList *L) { int pos =0; while(pos<L->length) { printf("item1: %d",L->items[pos]); pos++; } }
#include <iostream> using namespace std; #define LISTSIZE 100 typedef struct { int items[LISTSIZE]; int length; } SqList; //初始化順序表,表的長度設置爲0 void InitList(SqList *L) { L->length=0; } //順序表的長度 int ListLength(SqList * L) { return L->length; } //判斷順序表是否爲空 bool ListEmpty(SqList *L) { if(L->length==0) return true; else return false; } //向順序表中插入數據元素 bool ListInsert(SqList *L,int pos,int item) { int i; if(L->length==LISTSIZE) { printf("順序列表已滿,無法進行插入操作"); return false; } if(pos<1||pos>L->length+1) { printf("插入位置不合法"); return false; } for(i=L->length-1;i>=pos-1;i--) { L->items[i+1]=L->items[i]; } L->items[pos-1]=item; L->length++; return true; } //刪除順序表中的元素 bool ListDelete(SqList *L,int pos,int *item) { int i; if(L->length==0) { printf("順序表爲空表"); return false; } if(pos<1||pos>L->length) { printf("刪除位置無效"); } *item=L->items[pos-1]; for(int i=pos-1;i<L->length-1;i++) { L->items[i]=L->items[i+1]; } L->length--; return true; } //查找制定元素在順序表中的位置 int Find(SqList L,int item) { int pos=0; if(ListEmpty(&L)) { printf("順序表爲空表,無法進行查找操作"); return 0; } while(pos<L.length&&L.items[pos]!=item) { pos++; } if(pos<L.length) return pos+1; else return 0; } //獲得順序表中指定位置上的數據元素 int GetElem(SqList *L,int pos,int *item) { if(ListEmpty(L)) return 0; if(pos<1||pos>L->length) return 0; *item=L->items[pos-1]; return 1; } //遍歷順序表 void TravereList(SqList *L) { int pos =0; while(pos<L->length) { printf("item1: %d",L->items[pos]); pos++; } } int main() { SqList Fibonacci; cout<<"建立順序表"<<endl; InitList(&Fibonacci); for(int i=0;i<7;) { int num; cin>>num; if(ListInsert(&Fibonacci,i+1,num)) i++; } TravereList(&Fibonacci); int item; ListDelete(&Fibonacci,7,&item); TravereList(&Fibonacci); return 0; }