1.数据结构C语言-静态顺序表

1.1线性表(Linear List)

特点:

        同一性。由同类数据元素组成。

        有穷性。

        有序性。相邻数据元素之间存在序偶关系。

1.2线性表的顺序存储

即物理结构和逻辑结构一致的线性表。

代码实现:

/*头文件与顺序表的存储结构及各种操作的声明*/
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0

typedef int ElemType;
typedef struct seqlist {
	ElemType elem[MAXSIZE];
	int last;                       /*last为顺序表最后一个有效数据元素的下标*/
}SeqList;

void InitList(SeqList* L);                      /*初始化顺序表*/
void PrintList(SeqList* L);
int Locate(SeqList* L, ElemType e);             /*按内容查找顺序表并返回其元素序号*/
ElemType GetElem(SeqList* L, int i);                 /*查找顺序表中第i个数据元素并返回其值*/
int InsList(SeqList* L, int i, ElemType e);     /*在顺序表中第i个元素前插入元素e*/
int DelList(SeqList* l, int i, ElemType* e);    /*删除顺序表中第i个数据元素并用指针参数e返回其值*/
void MergeList(SeqList* LA, SeqList* LB, SeqList* LC);     /*合并顺序表LA和LB*/

/*各种操作的定义*/
void InitList(SeqList* L)        /*初始化顺序表*/
{
	int i;
	L->last = 0;
	for (i = 0; i <= MAXSIZE; i++)
	{
		L->elem[i] = 0;
	}
}

void PrintList(SeqList* L)       /*打印顺序表*/
{
	int i = 0;
	while (i <= L->last)              /*从0下标打印到最后一个元素的下标*/
	{
		printf("%d ", L->elem[i]);
		if ((i + 1) % 4 == 0)
		{
			printf("\n");
		}
		i++;                         /*每5个一换行*/
	}
	printf("\n\n");
}

int Locate(SeqList* L, ElemType e)   /*按内容查找顺序表并返回其元素序号*/
{
	int i = 0;   /*计数*/
	while ((i <= L->last) && (L->elem[i] != e))    /*遍历顺序表直至其中有元素与查找内容相同*/
	{
		i++;
	}
	if (i <= L->last)                   
	{
		return i+1;                             /*如果在遍历完成之前找到,则返回其下标+1即它的序号*/
	}
	else
	{
		printf("查无此元素!\n\n");           /*如果不存在,则打印提示*/
		return ERROR;
	}
}

ElemType GetElem(SeqList* L, int i)
{
	return L->elem[i];                            /*时间复杂度为O(1)的查找正是顺序表的优势*/
}

int InsList(SeqList* L, int i, ElemType e)     /*在顺序表中第i个元素前插入元素e*/
{
	int j = 0;
	if (i < 1 || i > L->last + 2)                     /*注意合法插入位置在1到有效数据个数+1(Last + 2)*/
	{
		printf("插入位置不合法!\n\n");
		return ERROR;
	}
	if (L->last >= MAXSIZE - 1)                /*注意判断条件为大于等于而不是等于*/
	{
		printf("表已满,无法插入!\n\n");
		return ERROR;
	}
	for (j = L->last + 1; j >= i; j--)          /*把从插入位置起之后的所有有效数据往后挪一位*/
	{
		L->elem[j] = L->elem[j - 1];
	}
	L->elem[i - 1] = e;                  /*在插入位置上写入数据*/
	L->last++;                            /*注意最后一个有效数据元素下标+1*/
	return OK;
}

int DelList(SeqList* L, int i, ElemType* e)    /*删除顺序表中第i个数据元素并用指针参数e返回其值*/
{
	int j = 0;
	if (i < 1 || i > L->last + 1)               /*删除的合法位置是从1到有效数据元素的个数(Last + 1)*/
	{
		printf("删除位置不合法!");
		return ERROR;
	} 
	*e = L->elem[i - 1];                          /*用指针变量e带出被删除的数据元素*/
	for (j = i - 1; j < L->last - 1; j++)
	{
		L->elem[j] = L->elem[j + 1];               /*把被删元素之后的所有有效数据元素往前挪1位*/
	}
	L->last--;                       
	return OK;
}

void MergeList(SeqList* LA, SeqList* LB, SeqList* LC)     /*合并有序非降序顺序表LA和LB*/
{
	int i = 0, j = 0, k = 0;
	while (i <= LA->last && j <= LB->last)          /*将顺序表LA和LB中的数据元素由小到大插入 
                                              到顺序表LC的末尾,直至其中任意一个表遍历完成*/
	{
		if (LA->elem[i] <= LB->elem[j])
		{
			LC->elem[k] = LA->elem[i];
			k++;
			i++;
		}
		else
		{
			LC->elem[k] = LB->elem[j];
			k++;
			j++;
		}
	}         /*while */
	while (j <= LB->last)
	{
		LC->elem[k] = LB->elem[j];
		j++;
		k++;
	}      /*while */
	while (i <= LA->last)
	{
		LC->elem[k] = LA->elem[i];
		i++;
		k++;
	}      /*while */
	LC->last = LA->last + LB->last + 1;  /*将还有余量的顺序表全部依次插入到表LC中,并将LC- 
                                            >Last设置为LA->last + LB->last + 1*/
}

/*主函数及测试函数*/
void SeqListTest()
{
	                /*自定义语句,用于测试各种操作*/
}
int main()
{
	SeqListTest();     /*调用测试函数*/
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值