1. 程式人生 > >資料結構之線性表

資料結構之線性表

線性表的邏輯結構

在這裡插入圖片描述

線性表是由n個型別相同的資料元素組成的有限序列,記為(a1,a2,…,ai-1,ai,ai+1,…,an)。其中,這裡的資料元素可以是原子型別,也可以是結構型別。線性表的資料元素存在著序偶關係,即資料元素之間具有一定的次序。線上性表中,資料元素ai-1在ai的前面,ai又在ai+1的前面,可以把ai-1稱為ai的直接前驅元素,ai稱為ai+1的直接前驅元素。ai稱為ai-1的直接後繼元素,ai+1稱為ai的直接後繼元素。

線性表的順序儲存結構—順序表

在這裡插入圖片描述 順序表:用一段地址連續的儲存單元依次儲存線性表的資料元素。由圖可知資料元素的儲存地址是其序號的線性函式,即計算任意一個儲存結構的時間是相等的,具有這個特點的儲存結構被稱為隨機存取結構

順序表的C語言實現:

#include<stdio.h>
#include<stdlib.h>
//順序表的定義

//定義順序表的最多存放100個元素
#define MaxSize 100 
//定義順序表的元素型別為int 
typedef int DataType;

//定義順序表的結構體
typedef struct{
	//存放資料元素的陣列
	DataType data[MaxSize];
	//順序表的長度
	int length;
}SeqList;

//初始化順序表,設定長度為零

void InitList(SeqList *L){
	L->length = 0;
}

//建立順序表
int CreateList(SeqList * L , DataType a[],int n ){
	
	if (n>MaxSize){
		printf("順序表儲存空間不夠,無法建立資料表\n");
		return 0;
	}
	for (int i = 0 ; i<n ; i++){
	
		L->data[i] = a[i];
	
	}
	L->length = n;
	return 1;
}

//銷燬順序表
//由於順序表是靜態儲存分配,在順序表變數退出作用域的時候自動釋放變數所佔用的記憶體單元
//因此順序表無需銷燬


//判空操作
int Empty(SeqList * L){
	
	if(L->length == 0) return 1;
	else return 0;
	
}


//取長度操作

int Length(SeqList *L){
	return L->length;
}

//遍歷操作

void PrintList(SeqList * L){
	for(int i = 0;i<L->length;i++){
		printf("%d\t",L->data[i]);
	}
}

//按值查詢
int Locate(SeqList * L,DataType x){

	for(int i = 0 ; i < L->length ; i++){
		
		if (x == L->data[i]){
			return i+1;
		}
	}
	
	return 0;

}

//按位查詢
int Get(SeqList * L,int n,DataType * ptr){
	
	if(n>L->length || n< 1){
		printf("查詢位置非法,查詢失敗\n");
		return 0;
	}else{
		*ptr = L->data[n];
		return 1;
	}
}

//插入操作
int Insert(SeqList * L,int n ,DataType x){
	if(L->length >= MaxSize ) {
		printf("上溢錯誤,插入失敗\n");
	}
	
	if( n<1 || n>(L->length+1)) {
		printf("位置錯誤,插入失敗\n");
	}
	
	for(int j = L->length;j>=n;j--){
		
		L->data[j] = L->data[j-1];
	}
	L->data[n-1] = x;
	L->length++;
	return 1;
}

//刪除操作

int Delete(SeqList * L,int n,DataType * ptr){
	if(L->length == 0){
		printf("下溢錯誤,失敗\n");
		return 0;
	}
	if(n<1 || n > L->length ){
	
		printf("位置錯誤,刪除失敗\n");
		return 0;
	}
	
	for(int i = n; i < L->length ; i ++){
		L->data[i-1] = L->data[i];
	}
	L->length--;
	return 1;
	
	
}


//順序表的使用
int main(){
	
	 int r[5] = {1,2,3,4,5};
	 int x,i;
	 
	 SeqList L;
	 
	 printf("建立順序表");
	 CreateList(&L,r,5);
	 PrintList(&L);
	 
	 printf("執行插入\n");
	 Insert(&L,2,8);
	 printf("執行插入後的順序表\n");
	 PrintList(&L);
	 
	 printf("順序表的長度%d:\t" ,Length(&L));
	 
	 printf("請輸入查詢的值\n");
	 scanf("%d",&x);
	 i = Locate(&L,x);
	 
	 if(i == 0){
		 
		 printf("查詢失敗\n");
	 }else{
		 printf("元素%d的位置是:%d\n",x,i);
	 }
	 
	 
	 printf("請輸入要查詢第幾個元素值\n");
	 scanf("%d",&i);
	 if(Get(&L,i,&x) == 1){
		 printf("第%d個元素的值為%d\n",i,x);
	 }
	 else{
		 printf("線性表中沒有第%d個元素\n",i);
	 }
	 
	 
	 printf("請輸入要刪除第幾個元素:\n");
	 scanf("%d",&i);
	 
	 if(Delete(&L,i,&x) == 1){
		 printf("刪除第%d個元素是%d,刪除資料為:\n",i,x);
		 PrintList(&L);
	 }else{
		 printf("刪除失敗\n");
	 } 
	 return 0; 
}

在這裡插入圖片描述