1. 程式人生 > >c語言資料結構之順序表

c語言資料結構之順序表

c語言資料結構之順序表:

    順序表的結構跟陣列比起來還是很像的,相比於連結串列,資料表的優勢主要體現在他的查詢速度上,而連結串列的優勢相反,查詢速度慢,但對於插入一個數據來說還是比較快的

下面我們就來建立一個順序表

1:定義資料型別,我定義的是一個學生的結構體型別,首先先巨集定義一個sizemax的不變數,代表順序表的最大長度,typedef也是一個巨集定義,定義好後就可以用ElemType代替STU了,當然也可以是別的變數,

#define Size_max 100
typedef  ElemType;
struct STU student{
	int s_id;
	char s_name[10];
}STU;
typedef struct{
	ElemType data[Size_max];
	int length;
}SqList;

2:下面我們先初始化這個順序表,將這個順序表的length變為0就可以了

//初始化線性表
void InitList(SqList *L){
	L->length = 0;
}

3:求得順序表的長度

//線性表長度
int GetLength(SqList *L){
	return L->length;
}

4:我們可以求的得到順序表的第i個元素,如果i不在順序表的範圍內,就返回0,否則就賦值,並返回1;

//線性表的i個元素
int GetElem(SqList *L,int i,ElemType *e){
	if(i < 1||i>L->length){
		return 0;
	}
	else{
		*e = L->data[i-1];
		return 1;
	}
}

4:在順序表中我們可以通過一個定值來得到其順序表中的位置從而得到具體的資料,比如通過一個學生的id,得到同學的具體資訊

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

5:對了忘記講插入演算法了,插入一個元素也是比較簡單的

//插入元素
int InsertElem(SqList *L,int i,ElemType x){
	if(i < 1||i > L->length+1){
		return 0;
	}
	for(int j = L->length;j > i;j--){
		L->data[j] = L->data[j-1];

	}
	L->data[i-1] = x;
	L->length++;
	return 1;
}

6:除了上一種插入方法,我還寫了在尾部新增元素的方法

//新增元素
int addElem(SqList *L,ElemType x){
	if(L->length == Size_max)
		return 0;
	L->data[L->length] = x;
	return 1;
} 
7:順序表中刪除元素也是比較簡單的,只需要用被刪除的元素後面的元素將其覆蓋就好了
//刪除元素
int DeleteElem(SqList *L,int i){
	if(i < 1|| i>L->length){
		return 0;
	}
	for(int j = i;j < L->length;j++){
		L->data[j-1] = L->data[j];
	}
	L->length--;
	return 1;
}

8:最後只需要輸出所有的元素即可

//輸出元素
void Output(SqList *L){
	for(int i = 0;i<L->length; i++){
		printf("%5d%5s",L->data[i]->s_id,L->data[i]->s_name);
		
	}
}

最後

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"Sqlist.h"
STU e;
void showFunction(){
	printf("0.初始化\n");
	printf("1.新增學生\n"); 
	printf("2.刪除學生\n");
	printf("3.根據id查詢\n");
	printf("4.插入學生\n");
	printf("5.列印名單\n");
	printf("6.退出");
}
void selectFunction(int x,SqList *L){
	select:
	switch(x){
		case 0:
			InitList(L);
			break;
		case 1:
			{
				printf("id name\n");
				printf("輸入-1停止");
				while(1){
					int s_id;
					char s_name[10];
					scanf("%d %s",&s_id,&s_name);
					if(s_id == -1)
						break;
					e.s_id = s_id;
					strcpy(e.s_name,s_name);
					addElem(L,e);
				}
			
			}
			break;
		case 5:
			Output(L);
			break;
		
	}
}
int main(){
	int i;
	
	SqList *L = (SqList *)malloc(sizeof(SqList));
	while(1){
		showFunction();
		scanf("%d",&i);
		selectFunction(i,L);
		
	}
	



}