【數據結構】線性表順序存儲結構-數組

線性表的順序存儲結構

  • C/C++中藉助數組來實現順序表
    在這裏插入圖片描述

基本操作

//線性表定義
#define MAX_SIZE 	50
#define FAILED		0
#define SUCCESS		1
typedef int 	ElemType
typedef struct 	SqList
{
	ElemType data[MAX_SIZE];
	int length;
}SqList;

//**********************建立順序表**********************//

SqList* CreateList(ElemType a[], int n)
{
	int i = 0;
	SqList* L = (SqList *)malloc(sizeof(SqList));
	while (i < n)
	{
		L->data[i] = a[i];
		i++;
	}
	L-> length = i;
	return L;
}

//**********************初始化線性表**********************//

SqList* InitList()
{
	SqList* L = (SqList*)malloc(sizeof(SqList));
	L->length = 0;
	return L;
}

//**********************銷燬線性表**********************//

void DestroyList(SqList* L)
{
	free(L);
}

//**********************判斷線性表是否爲空**********************//

int	 ListEmpty(SqList* L)
{
	return (L->length == 0);
}


//**********************求表長**********************//
int ListLength(SqList* L)
{
	return (L->length );
}

//**********************輸出信息**********************//

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

//**********************求第i個值**********************//
int LocateElem(SqList* L, ElemType e)
{
	int i = 0;
	while (i < L->length && L->data[i] != e)
		i++;
	if (i >= L->length)
		return FAILED;
	else
		return i + 1;
}

//**********************返回值爲e的索引**********************//

int LocateElem(SqList* L, ElemType e)
{
	int i = 0;
	while (i < L->length && L->data[i] != e)
		i++;
	if (i >= L->length)
		return FAILED;
	else
		return i + 1;
}

//**********************在第i位置插入**********************//

int  ListInsert(SqList* L, int i, ElemType e)
{
	if (i<1 || i>L->length)
		return FAILED;
	i--;
	for (int j = L->length; j > i; j--)
		L->data[j] = L->data[j - 1];
	L->data[i] = e;
	L->length++;
	return SUCCESS;
}

//**********************刪除第i個值返回給e**********************//

int  ListDelete(SqList* L, int i, ElemType* e)
{
	if (i<1 || i>L->length)
		return FAILED;
	i--;
	*e = L->data[i];
	for (int j = i; j < L->length -1; j++)
		L->data[j] = L->data[j + 1];
	L->length--;
	return SUCCESS;
}

應用實例

//刪除所有值爲e的元素值 時間複雜度 O(N)
void DelListElem(SqList* L,ElemType e) 
{
	int k = 0;
	for (int i = 0; i < L->length; i++)
	{
		if (L->data[i] != e)
		{
			L->data[k] = L->data[i];
			k++;
		}
	}
	L->length = k;

	/*int k = 0;
	int i = 0;
	while (i < L->length)
	{
		if (L->data[i] == e)
			k++;
		else
			L->data[i - k] = L->data[i];
		i++;
	}
	L->length -= k;*/
}  

//排序,以第一個爲哨兵,大的往後放,小的往前放
void Partition(SqList* L)   
{
	int temp = L->data[0];
	int i = 0;
	int j = L->length - 1;
	while (i < j)
	{
		while (i<j && L->data[j]>temp)
			j--;
		L->data[i] = L->data[j];
		while (i < j && L->data[i] <= temp)
			i++;
		L->data[j] = L->data[i];
	}
	L->data[i] = temp;

}  
//奇偶分開,奇數放前,偶數放後
//類比於上一個例子的排序思想
void OddToEven(SqList* L)
{
	int i = 0;
	int j = L->length - 1;
	int temp = L->data[0];
	while (i < j)
	{
		while (i < j && L->data[j] % 2 == 0)
			j--;
		L->data[i] = L->data[j];
		while (i < j && L->data[i] % 2 == 1)
			i++;
		L->data[j] = L->data[i];
	}
	L->data[i] = temp;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章