資料結構之順序儲存結構線性表
阿新 • • 發佈:2018-12-04
順序儲存結構:元素按順序連續儲存。
一般它的定義儲存格式為:
//定義資料格式
typedef struct {
ElemType data[MAXSIZE]; //陣列儲存元素
int length; //線性表的長度
}SqList;
在讀取順序表的元素,不管哪個位置它的演算法時間複雜度都為O(1),當插入或刪除一個元素的時候,它的時間複雜度為O(n).
以下為C語言程式碼的簡單實現:
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <math.h>
#include <time.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef int Status; /* Status是函式的型別,其值是函式結果狀態程式碼,如OK等 */
typedef int ElemType; /* ElemType型別根據實際情況而定,這裡假設為int */
//定義資料格式
typedef struct {
ElemType data[MAXSIZE];
int length;
}SqList;
//初始化順序線性表
Status InitList(SqList *L){
L->length=0;
return OK;
}
//判斷線性表是否為空
Status ListisEmpty(SqList L){
if(L.length==0){
return TRUE;
}else{
return FALSE;
}
}
//重置清空
Status ClearList(SqList *L){
L->length =0;
return OK;
}
//查詢第i個元素,並將元素返回給*e
Status GetEle(SqList L,int i,ElemType *e){
if(L.length==0 || i<1 || i>L.length){
return ERROR;
}
*e = L.data[i-1];
return OK;
}
//查詢元素的所在的位置
int LocationEle(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;
}
printf("元素%d在第%d個位置\n",e,i+1);
return 1;
}
int isLocate( SqList L,ElemType e){
int isLocate = 0;
int i;
for(i=0;i<L.length;i++){
if(L.data[i]==e){
isLocate = 1;
}
}
return isLocate;
}
//插入元素操作
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--){ //在i之後的元素全部向後移動一位
L->data[k+1] = L->data[k];
}
}
//將新元素插入
L->data[i-1] = e;
//長度加1
L->length++;
return OK;
}
//刪除元素操作
Status ListDelete(SqList *L,int i,ElemType *e){
int k;
if(L->length==0){
return ERROR;
}
if(i<1 || i>L->length+1){
return ERROR;
}
*e = L->data[i-1];
printf("被刪除的元素為:%d\n",*e);
if(i<=L->length){
for(k=i;k<L->length;k++){
L->data[k-1] = L->data[k]; //刪除的元素後面所有元素向前移動
}
}
L->length--;
return OK;
}
//遍歷線性表操作
int ListVisit(SqList *L){
int i;
if(L->length==0){
printf("該線性表為空\n");
}
for(i=0;i<L->length;i++){
printf("%d ",L->data[i]);
}
printf("\n");
return OK;
}
//兩個順序線性表的合併操作
void unionL(SqList La,SqList Lb){
int la_len,lb_len,i;
ElemType e;
la_len = La.length;
lb_len = Lb.length;
for(i=1;i<=lb_len;i++){
GetEle(Lb,i,&e);
if(!isLocate(La,e)){
ListInsert(&La,++la_len,e);
}
}
//合併後的線性表為
printf("合併後的線性表:\n");
ListVisit(&La);
}
int main(){
SqList L;
SqList Lb;
ElemType e;
Status i;
int j,k;
i = InitList(&L);
printf("初始化的L的長度為L.length = %d\n",L.length);
//插入
for(j=1;j<=5;j++){
ListInsert(&L,1,j);
}
printf("在表頭插入的資料L.data為:\n");
//遍歷插入的資料
ListVisit(&L);
printf("\n");
//讀取一個元素
GetEle(L,2,&e);
printf("你要查詢的第二個元素為 %d\n",e);
//插入一個元素,第二個位置插入6
ListInsert(&L,2,6);
printf("插入後的線性表為:\n");
ListVisit(&L);
//查詢元素的位置
LocationEle(L,6);
//刪除一個元素
ListDelete(&L,2,&e);
printf("刪除元素後的線性表為:\n");
ListVisit(&L);
//初始化Lb
InitList(&Lb);
//給Lb賦值,建立一個新的線性表
for(j=6;j<=15;j++){
ListInsert(&Lb,1,j);
}
//遍歷
printf("Lb的資料為Lb.data:\n");
ListVisit(&Lb);
//合併兩個線性表,將第二個線性表 合併到第一個線性表
unionL(L,Lb);
//清空重置線性表
ClearList(&L);
ClearList(&Lb);
ListVisit(&L);
ListVisit(&Lb);
}