線性表僅僅是邏輯上的定義而已,即具有相同特性資料元素的有限序列,(比如一個字元陣列或者一個整型陣列 再或者連結串列 )並不是說,線性表就一定是連結串列或者順序表(連結串列和順序表都滿足線性表的定義,只是實現方式不一樣,順序表採用順序儲存方式,記憶體中開闢的地址是連續的,而連結串列採用鏈式儲存的方式,地址是可以不連續的)兩者儲存方式各有優缺點,看情況而定。下面是資料結構中對於線性表的一段定義與操作程式碼來源
線性表--順序表的定義與操作示例
#include <stdio.h>#include <stdlib.h>#include <time.h>#define MAXSIZE 20 /* 儲存空間初始分配量 */typedef int ElemType; /* ElemType型別根據實際情況而定,這裡假設為int */typedef struct{ElemType data[MAXSIZE]; /* 陣列,儲存資料元素,最大值為MAXSIZE */int length; /* 線性表當前長度 */}SqList;//順序表的初始化SqList Init(){ //構造一個空的線性表L,時間複雜度O(1)SqList L; //定義一個順序表L.length = 0; //順序表的長度為0return L; //返回空順序表}//順序表的建立SqList Create(SqList L){int i;srand((unsigned)time(NULL));for(i=0; i < 10; i++){L.data[i] = rand()%100;L.length++;}return L;}/* 初始條件:順序線性表L已存在,1≤i≤ListLength(L) *//* 操作結果:用e返回L中第i個數據元素的值,注意i是指位置,第1個位置的陣列是從0開始 */ElemType GetElem(SqList L,int i){//if(i < 1 || i > L.length){printf("查詢位置錯誤!\n");//檢查查詢位置是否合法return 0;}elsereturn L.data[i-1];}//順序表的插入SqList SqListInsert(SqList L, int i, ElemType x){ //在順序表中的第i個位置插入元素xif(L.length == MAXSIZE)printf("表已經滿了\n");//插入時,必須檢查表是否已經滿了。否則會出現溢位錯誤else if(i < 1 || i > L.length)printf("插入位置錯誤\n");//判斷插入位置的有效性int j;for(j = L.length-1; j >= i - 1; j--)//第i個位置元素逐個後移L.data[j+1] = L.data[j];L.data[i-1] = x; //插入元素xL.length++; //順序表長度增1return L;}SqList SqListDelete(SqList L,int i){//刪除順序表中的第i個位置的元素if(i < 1 || i > L.length)printf("刪除位置錯誤\n"); //檢查刪除位置是否合法int j;for(j = i-1; j < L.length; j++)L.data[j] = L.data[j+1]; //將第i個位置之後的元素前移L.length--; //順序表長度-1return L;}int main(){SqList nmList;nmList = Init();nmList = Create(nmList);int find;int found;int pos;ElemType value;char opp;int i;printf("順序表初始化為:");for(i=0; i < nmList.length; i++){printf("%d ", nmList.data[i]);}printf("\n1.檢視順序表 \n2.查詢 \n3.插入 \n4.刪除 \n0.退出 \n請選擇你的操作:\n");while(opp != "0"){scanf("%c",&opp);//printf("\n 1.查詢 \n 2.插入 \n 3.排序 \n 0.退出 \n 請選擇你的操作:\n");switch(opp){case "1":printf("\n檢視順序表:");for(i=0; i < nmList.length; i++){printf("%d ", nmList.data[i]);}printf("\n");break;case "2":printf("\n進入查詢功能,請問需要查詢第幾個元素:");scanf("%d",&find);printf("%d",find);found = GetElem(nmList, find);printf("第%d個值為%d ", find, found);printf("\n");break;case "3":printf("進入插入功能,請輸入插入元素位置:");scanf("%d",&pos);printf("請輸入插入元素的值:");scanf("%d",&value);nmList = SqListInsert(nmList,pos,value);printf("\n插入元素後順序表為:");for(i=0; i < nmList.length; i++){printf("%d ", nmList.data[i]);}printf("\n");break;case "4":printf("進入刪除功能,請輸入刪除元素位置:");scanf("%d",&pos);nmList = SqListDelete(nmList,pos);printf("\n刪除元素後順序表為:");for(i=0; i < nmList.length; i++){printf("%d ", nmList.data[i]);}printf("\n");break;case "0":exit(0);}}}
線性表僅僅是邏輯上的定義而已,即具有相同特性資料元素的有限序列,(比如一個字元陣列或者一個整型陣列 再或者連結串列 )並不是說,線性表就一定是連結串列或者順序表(連結串列和順序表都滿足線性表的定義,只是實現方式不一樣,順序表採用順序儲存方式,記憶體中開闢的地址是連續的,而連結串列採用鏈式儲存的方式,地址是可以不連續的)兩者儲存方式各有優缺點,看情況而定。下面是資料結構中對於線性表的一段定義與操作程式碼來源
線性表--順序表的定義與操作示例
#include <stdio.h>#include <stdlib.h>#include <time.h>#define MAXSIZE 20 /* 儲存空間初始分配量 */typedef int ElemType; /* ElemType型別根據實際情況而定,這裡假設為int */typedef struct{ElemType data[MAXSIZE]; /* 陣列,儲存資料元素,最大值為MAXSIZE */int length; /* 線性表當前長度 */}SqList;//順序表的初始化SqList Init(){ //構造一個空的線性表L,時間複雜度O(1)SqList L; //定義一個順序表L.length = 0; //順序表的長度為0return L; //返回空順序表}//順序表的建立SqList Create(SqList L){int i;srand((unsigned)time(NULL));for(i=0; i < 10; i++){L.data[i] = rand()%100;L.length++;}return L;}/* 初始條件:順序線性表L已存在,1≤i≤ListLength(L) *//* 操作結果:用e返回L中第i個數據元素的值,注意i是指位置,第1個位置的陣列是從0開始 */ElemType GetElem(SqList L,int i){//if(i < 1 || i > L.length){printf("查詢位置錯誤!\n");//檢查查詢位置是否合法return 0;}elsereturn L.data[i-1];}//順序表的插入SqList SqListInsert(SqList L, int i, ElemType x){ //在順序表中的第i個位置插入元素xif(L.length == MAXSIZE)printf("表已經滿了\n");//插入時,必須檢查表是否已經滿了。否則會出現溢位錯誤else if(i < 1 || i > L.length)printf("插入位置錯誤\n");//判斷插入位置的有效性int j;for(j = L.length-1; j >= i - 1; j--)//第i個位置元素逐個後移L.data[j+1] = L.data[j];L.data[i-1] = x; //插入元素xL.length++; //順序表長度增1return L;}SqList SqListDelete(SqList L,int i){//刪除順序表中的第i個位置的元素if(i < 1 || i > L.length)printf("刪除位置錯誤\n"); //檢查刪除位置是否合法int j;for(j = i-1; j < L.length; j++)L.data[j] = L.data[j+1]; //將第i個位置之後的元素前移L.length--; //順序表長度-1return L;}int main(){SqList nmList;nmList = Init();nmList = Create(nmList);int find;int found;int pos;ElemType value;char opp;int i;printf("順序表初始化為:");for(i=0; i < nmList.length; i++){printf("%d ", nmList.data[i]);}printf("\n1.檢視順序表 \n2.查詢 \n3.插入 \n4.刪除 \n0.退出 \n請選擇你的操作:\n");while(opp != "0"){scanf("%c",&opp);//printf("\n 1.查詢 \n 2.插入 \n 3.排序 \n 0.退出 \n 請選擇你的操作:\n");switch(opp){case "1":printf("\n檢視順序表:");for(i=0; i < nmList.length; i++){printf("%d ", nmList.data[i]);}printf("\n");break;case "2":printf("\n進入查詢功能,請問需要查詢第幾個元素:");scanf("%d",&find);printf("%d",find);found = GetElem(nmList, find);printf("第%d個值為%d ", find, found);printf("\n");break;case "3":printf("進入插入功能,請輸入插入元素位置:");scanf("%d",&pos);printf("請輸入插入元素的值:");scanf("%d",&value);nmList = SqListInsert(nmList,pos,value);printf("\n插入元素後順序表為:");for(i=0; i < nmList.length; i++){printf("%d ", nmList.data[i]);}printf("\n");break;case "4":printf("進入刪除功能,請輸入刪除元素位置:");scanf("%d",&pos);nmList = SqListDelete(nmList,pos);printf("\n刪除元素後順序表為:");for(i=0; i < nmList.length; i++){printf("%d ", nmList.data[i]);}printf("\n");break;case "0":exit(0);}}}