數據結構 ----- 線性表中的順序結構(附代碼)

第一種:線性表

由0個或多個元素組成的有限序列;

就比如排隊一樣,只要記住自己前面的一個人和後面的一個人,就知道了自己的位置;

要實現的操作有如下:

InitList(*L):初始化操作,建立一個空的線性表L;

ListEmpty(L):判斷線性表是否爲空表,若線性表爲空,返回true,否則返回false;

ClearList(*L):將線性表清空;

GetElem(L,i,*e):將線性表L中的第i個位置元素值返回給e;

LocateElem(L,e):在線性表L中查找與給定值e相等的元素,如果查找成功,返回該元素在表中的序號,否則返回0; 

ListInsert(*L,i,e):在線性表L中第i個位置插入新元素e;

ListDelete(*L,i,*e):刪除線性表L中第i個位置元素,並用e返回其值;

ListLength(L):返回線性表L的元素個數。

線性表的物理存儲方式有:順序存儲和鏈式存儲

順序存儲:一段連續的地址單元存儲數據元素;

鏈式存儲:有一個指針一個數據,指針指出下一個位置地址;

#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20

typedef int Status;
typedef int ElemType;

typedef struct
{
	ElemType data[MAXSIZE];
	int length;
}SqList;

//說明
//數據表的下標是從0開始的,但所說的位置的話就是正常的,比如刪除第1個,不會說刪除第0個元素

void InitList(SqList* L);    //初始化操作     初始化和清空數據表一樣
Status ListInsert(SqList* L, int i, ElemType e);    //插入
Status ListUpdate(SqList* L, int i, ElemType e);    //修改
Status ListGetelem(SqList* L, int i, ElemType *e);   //獲取第i個位置的數據
Status ListDelete(SqList* L, int i, ElemType* e);   //刪除
void ShowList(SqList* L);                          //查看順序表



int main()
{
	int e;
	SqList *pList = (SqList*)malloc(sizeof(SqList));
	InitList(pList);
	
	ListInsert(pList, 0, 1);  //插入  空表就得從第0個位置開始
	ListInsert(pList, 1, 2);
	ListInsert(pList, 2, 3);
	ListInsert(pList, 3, 4);

	//都是從下標0開始

	ShowList(pList);

	ListDelete(pList, 3, &e);
	printf("這是e的值:%d\n", e);
	ShowList(pList);

	ListUpdate(pList, 2, 7);
	ShowList(pList);

	ListGetelem(pList, 3, &e);
	printf("這是獲取位置上的值%d", e);

	return 0;
}

void InitList(SqList *L)   //初始化順序表操作
{
	for (int i = 0; i < MAXSIZE; i++)
		L->data[i] = 0;   //將表都執爲0
	L->length = 0;       //將表設爲空
}




//在指定的i個位置插入一個數據e  從下標0開始
Status ListInsert(SqList *L, int i, ElemType e)
{
	int k;
	if(L->length>=20)   //順序表已經滿了
	{
		return ERROR;
	}
	if (i<0 || i>L->length)   //當i不在範圍內時
	{
		return ERROR;
	}
	if (i <= L->length)   //插入數據爲正常情況
	{
		//需要將i後面的數據向後移動一位
		for (k = L->length; k > i; k--)
		{
			L->data[k] = L->data[k-1];
		}
	}
	L->data[i] = e;   //將新元素插入
	L->length++;

	return OK;
}

//修改指定位置的數據
Status ListUpdate(SqList *L, int i, ElemType e)
{
	int k;
	if (L->length <= 0)
	{
		return ERROR;
	}
	if (i<1 || i>L->length)
	{
		return ERROR;
	}
	if (i <= L->length)
	{
		printf("%d , %d", L->length,e);
		L->data[i - 1] = e;
	}
	return OK;
}

//獲取第i個位置的數據
Status ListGetelem(SqList* L, int i, ElemType *e)
{
	if (L->length <= 0)
	{
		return ERROR;
	}
	if (i<1 || i>L->length)
	{
		return ERROR;
	}
	if (i <= L->length)
	{
		*e = L->data[i - 1];
	}
	return OK;
}

//刪除指定i位置的元素,並用e返回其值,L的長度減一
Status ListDelete(SqList *L, int i, ElemType *e)
{
	int k;
	if (L->length<=0)   //表空
	{
		return ERROR;
	}
	if (i<1 || i>L->length)  //i的範圍超出
	{
		return ERROR;
	}
	*e = L->data[i - 1];
	if (i <= L->length)
	{
		//刪除i的後方需要向前移動一位
		for (k = i; k <= L->length-1; k++)
		{
			L->data[k-1] = L->data[k];
		}
	}
	L->length--;

	return OK;
}

//展示順序表內容
void ShowList(SqList *L)
{
	if (L->length == 0)
	{
		printf("順序表爲空\n");
	}
	printf("=====================遍歷順序表如下============\n");
	for (int i = 0; i < L->length; i++)
	{
		printf("\t data[%d] = %d  \n", i, L->data[i]);
	}
	printf("==================順序表一共有/t%d/t個元素=======\n", L->length);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章