1. 程式人生 > 實用技巧 >資料結構-順序表

資料結構-順序表

順序表

順序表利用 一塊連續的記憶體單元 依次儲存資料元素

順序表的定義:

#define MAXLEN 10   //開闢的總的儲存空間
typedef int DataType;  //DataType相當於int的別名
typedef struct {
 DataType data[MAXLEN];  //存放順序表的資料,表示最多可以儲存10個元素
 int length;  //表示順序表已使用的長度
}SeqList; 

建立一個空的順序表:

//初始化順序表
void InitList(SeqList *L){
  L->length=0;  //已使用的長度為0,表示順序表為空
}

建立一個順序表:

//建立線性表
void CreateList(SeqList *L,int n){
   int i;
   printf("請輸入%d個整數\n",n);
   for(i=0;i<n;i++){
    scanf("%d", &L->data[i]);
	L->length++;
   }
}

例如先在順序表中新增9個整數7、8、9、10、11、12、13、14、15

此時順序表的長度應為3

判斷順序表是否為滿/是否為空:

void Full(SeqList *L){
    if(L->length>=MAXLEN){
        printf("順序表已滿");
        return -1; 
    } 
}
void empty(SeqList *L){
    if(L->length==0){
		printf("順序表為空");
		return 0; 
	}
}

順序表為滿時的狀態:

向順序表中插入資料:

向順序表中插入資料的前提是: 順序表不為滿

//插入操作 
int InsElem(SeqList *L,int i,DataType x) 
{
	if(i<1 || i>L->length){
		printf("插入的位置出錯");
		return 0;	
	}
    //代表插入位置為表尾
	if(i == L->length+1){
		L->data[i-1] = x;
		L->length++;
		return 1;
	}
    //在指定位置插入資料
	for(j=L->length-1;j>=i-1;j--){
		L->data[j+1]=L->data[j];
	}
	L->data[i-1] = x;
	L->length++;
	return 1;
}
順序表尾部插入資料:

在指定位置插入資料:

刪除指定位置元素

//刪除操作
int DelElem(SeqList *L,int i,DataType *x){
	int j;
	*x = L->data[i-1];
	for(j=i;j<L->length;j++){
		L->data[j-1] = L->data[j];
	}
	L->length--;
	return 1;
}

全部程式碼:

#include<stdio.h>
#define MAXLEN 100   //開闢的總的儲存空間
typedef int DataType;  //DataType相當於int的別名,作用範圍為本程式

//定義一個結構體
typedef struct {
 DataType data[MAXLEN];  //存放順序表的資料
 int length;  //順序表的長度
}SeqList;   //結構體的名稱

//初始化順序表
void InitList(SeqList *L){
  L->length=0;  //順序表為空
}

//建立線性表
void CreateList(SeqList *L,int n){
   int i;
   printf("請輸入%d個整數\n",n);
   for(i=0;i<n;i++){
    scanf("%d", &L->data[i]);
	L->length++;
   }
}

int GetElem(SeqList *L,int i,DataType *x){
   if(i<1||i>L->length)
	   return 0;
   else{
	   *x=L->data[i-1];
	   return 1;
   }
}

//按值查詢
int Locate(SeqList *L,DataType x){
	int i=0;
	while(i<L->length&&L->data[i]!=x)
		i++;
	if(i>=L->length)
		return 0;
	else
		return i+1;

}
//插入操作 
int InsElem(SeqList *L,int i,DataType x) 
{
	/*在順序表L中在第i位插入新元素x函式*/
	int j;
	if(L->length>=MAXLEN){
		printf("順序表已滿");
		return -1; 
	} 
	if(i<1 || i>L->length){
		printf("插入的位置出錯");
		return 0;	
	}
	if(i == L->length){
		L->data[i-1] = x;
		L->length++;
		return 1;
	}
	for(j=L->length-1;j>=i-1;j--){
		L->data[j+1]=L->data[j];
	}
	L->data[i-1] = x;
	L->length++;
	return 1;
}

//刪除操作
int DelElem(SeqList *L,int i,DataType *x){
	int j;
	if(L->length==0){
		printf("順序表為空");
		return 0; 
	}
	if(i<1 || i>L->length){
		printf("不存在第i個元素");
		return 0; 
	}
	*x = L->data[i-1];
	for(j=i;j<L->length;j++){
		L->data[j-1] = L->data[j];
	}
	L->length--;
	return 1;
} 

//輸出表中的元素操作

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

//顯示選單函式
void Menu(){
	printf("\n		順序表的各種操作");
	printf("\n===================================");
	printf("\n	1.建立順序表			"); 
	printf("\n	2.插入元素				"); 
	printf("\n	3.刪除元素				"); 
	printf("\n	4.按位置查詢元素		");
	printf("\n	5.按元素值查詢其在表中位置			");  
	printf("\n	6.求順序表的長度					"); 
	printf("\n	7.返回					");
	printf("\n===================================");
	printf("\n請輸入選單號(0-6):"); 
} 
 
void  main(){
	SeqList L;  //順序表的名稱
	DataType x;
	int n,i,loc;
	char ch1,ch2,a;
	ch1 = 'y';
	while(ch1=='y'||ch1=='Y'){
		Menu();
		scanf("%c",&ch2);
		getchar();
		switch(ch2){
			case '1':
				InitList(&L);
				printf("請輸入建立線性表的個數:"); 
				scanf("%d",&n);
				CreateList(&L,n);
				printf("建立的線性表為:");
				DispList(&L);
				break; 
			case '2':
				printf("請輸入要插入的位置:");
				scanf("%d",&i); 
				printf("請輸入要插入的元素值:");
				scanf("%d",&x);
				if(InsElem(&L,i,x)){
					printf("已成功在%d的位置上插入%d,插入後的線性表為:\n",i,x);
					DispList(&L);
				} else{
					printf("輸入插入的引數錯誤");
				}
				break;
			case '3':
				printf("請輸入要刪除的元素的位置:");
				scanf("%d",&i); 
				if(DelElem(&L,i,&x)){
					printf("已成功在第%d位置上刪除%d,刪除後的線性表為:\n",i,x);
					DispList(&L);
				}else{
					printf("\n輸入刪除的引數錯誤"); 
				}
				break;
			case '4':
				printf("請輸入要刪查看錶中元素的位置(從1開始):");
				scanf("%d",&i); 
				if(GetElem(&L,i,&x)){
					printf("已在當前線性表中的%d的元素的值為:%d\n",i,x);
				}else{
					printf("\n輸入刪除的位置錯誤"); 
				}
				break;
			case '5':
				printf("請輸入要查詢的元素為:");
				scanf("%d",&x);
				loc=Locate(&L,x);
				if(loc){
					printf("查詢元素值%d的位置為:%d",x,loc);
				}else{
					printf("該表中無此元素!");
				}
				break;
			case '6':
				printf("當前線性表的長度為:%d",L.length);
				break;
			case '0':
				ch1='n';
				break;
			default:
				printf("輸入有誤,請輸入0~6進行選擇");
		}
		if(ch2!='0'){
			printf("\n按回車健繼續,按任意鍵返回主選單\n");
			a=getchar();
			if(a!='\xA'){
				getchar();
				ch1='n';
			} 
		}
	}
}