1. 程式人生 > >線性表的順序表示與實現

線性表的順序表示與實現

 
/*	線性表是有N個元素的非空有限序列
	存在惟一的一個被稱作“第一個”資料的元素
	存在惟一的一個被稱作“第後一個”資料的元素
	除第一個與最後一個之外,其它元素都存在唯一的一個前驅和唯一的一個後續
	複雜的線性表中的元素可以由多個數據項組成
	同一個線性表中的元素型別必須相同
	線性表的順序表,是用一組地址連續的儲存單元依次儲存線性表的資料元素 
	演算法複雜度:取表長與訪問表中的的元素為O(1),插入與刪除的時間複雜度為O(n)
	順序表適用於頻繁訪問,只有較少(或不進行)“插入刪除操作” */

#ifndef SQLIST_H
#define SQLIST_H
#define MAXSIZE  100 //順序表的最大儲存容量
#define INFINITY 65535 //設定為β
typedef int ElemType;  //順序表的資料型別,自定義
typedef struct {
	ElemType data[MAXSIZE]; //定義一個順序表,大小為MAXSIZE
	int len;				//順序表的當前長度
}SqList;
void InitList(SqList *q); //初始化順序表
void GetElem(SqList *q,int i,ElemType *e); //返回元素,將第i個位置的元素存入*e
void GetListLength(SqList *q,int *len); //返回順序表的長度,將長度存入*len
void InsertList(SqList *q,int i,ElemType e); //在第i個位置插入e,最壞的情況下i為第一個位置,時間複雜度為O(n)
void DeleteList(SqList *q,int i,ElemType *e); //刪除第i個位置的元素,將刪除的元素存入*e,最壞情況i為第一個位置
											  //時間複雜度為O(n)
int LocateElem(SqList *q,ElemType e); //在順序表中查詢元素e是否存在,不存在返回-1,否則返回所在的位置
#endif //SQLIST_H

#include "SqList.h"
#include <stdio.h>
#include <string.h>
void InitList(SqList *q) //初始化順序表
{
	memset(q->data,0,sizeof(ElemType) * MAXSIZE); //初始化順序表的元素為0
	q->len = 0; //初始化順序表的當前大小為0
}
void GetElem(SqList *q,int i,ElemType *e) //獲取第i個位置的元素(下標值從零開始,i個位置的元素在表中位置為i-1)
{
	if(i > 0 && i <= q->len) //如果i存在於順序表中
		*e = q->data[i - 1]; //返回第i個位置的元素
	else
		*e = INFINITY; //返回β值
}
void InsertList(SqList *q,int i,ElemType e) //在順序表的第i個位置插入元素e
{
	if(i > MAXSIZE || i <= 0)
	{
		printf("超出範圍,元素插入失敗\n");
		return;
	}
	for(int j = q->len - 1;j >= i - 1;--j)//將i個位置與i之後的所有元素向後移一位(下標值從零開始i - 1)
		q->data[j + 1] = q->data[j];
	q->data[i - 1] = e; //將元素插入到順序表中,下標值從零開始
	++q->len; //增加當前順序表的長度值
}
void DeleteList(SqList *q,int i,ElemType *e) //將順序表中第i個位置的元素刪除,將刪除的元素存入*e
{
	if(i <= 0 && i > q->len)
	{
		printf("超出範圍,元素刪除失敗\n");
		*e = INFINITY; //返回β值
		return;
	}
	*e = q->data[i - 1];
	for(int j = i - 1;j < q->len - 1;++j) //第i個位置之後的所有元素向後移
		q->data[j] = q->data[j + 1];
	--q->len; //當前的順序表長度減1
}
int LocateElem(SqList *q,ElemType e) //在順序表中查詢元素e,如果找到返回位置,否則返回-1
{
	for(int i = 0;i < q->len;++i)
	{
		if(q->data[i] == e)
			return i + 1; //下標從0開始,所以要加上1
	}
	return -1;
}
#include "SqList.h"
#include <stdio.h>
int main()
{
	SqList q;
	InitList(&q); //初始化順序表
	int element;
	int i = 1; //插入的位置
	printf("請輸入要插入順序表中的內容:(CTRL + Z)結束\n");
	while((scanf("%d",&element)) != EOF)
	{
		InsertList(&q,i,element);
		++i;
	}

	i = 2; //第順序表的第2個位置插入元素
	fflush(stdin); //清空緩衝區,確保輸入正確
	printf("請輸入要在第2個位置插入的元素\n");
	scanf("%d",&element);
	InsertList(&q,i,element);

	printf("順序表的內容為:\n");
	for(int j = 0;j < q.len;++j)
		printf("%d ",q.data[j]);
	printf("\n");

	int e; //用於存入被刪除的元素
	printf("請輸入要刪除的元素的位置\n");
	fflush(stdin);
	scanf("%d",&i);
	DeleteList(&q,i,&e);
	printf("被刪除的元素為:%d\n",e);

	printf("順序表的內容為:\n");
	for(int j = 0;j < q.len;++j)
		printf("%d ",q.data[j]);
	printf("\n");

	printf("請輸入要在表中查詢的元素:\n");
	fflush(stdin);
	scanf("%d",&element);
	if((i = LocateElem(&q,element)) == -1)
		printf("順序表中不存在元素:%d\n",element);
	else
		printf("在順序表的第%d個位置找到元素:%d\n",i,element);
	return 0;
}