数据结构——线性表的顺序存储及实现

c语言版数据结构——线性表的顺序存储及实现

线性表的特点

在日常生活中,线性表的例子比比皆是。例如,26个英文字母的字母表: (A, B, C, …,Z) 是一个线性表,表中的数据元素是单个字母。在稍复杂的线性表中, 一个数据元素可以包含若干 个数据项。例如在第1章中提到的学生基本信息表,每个学生为一个数据元素,包括学号、姓名、 性别、籍贯、 专业等数据项。
由以上示例可以看出,它们的数据元素虽然不同,但同一线性表中的元素必定具有相同的特 性,即属千同一数据对象,相邻数据元素之间存在着序偶关系。
诸如此类由n(n>=0)个数据特性相同的元素构成的有限序列称为线性表。 线性表中元素的个数n(n>=0)定义为线性表的长度,n=0时称为空表。 对千非空的线性表或线性结构,其特点是:
(1) 存在唯一的一个被称作 “第一个" 的数据元素;
(2)存在唯一的一个被称作 “最后一个" 的数据元素;
(3)除第一个之外,结构中的每个数据元素均只有一个前驱;
(4)除最后一个之外,结构中的每个数据元素均只有一个后继。

顺序表中基本主要操作实现

当线性表用顺序表表示时,因为表的长度是顺序表的一个 “属性”,所以可以通过返回length的值实现求表长的操作, 通过判断length的值是否 为0判断表是否为空,这些操作算法的时间复杂度都是0(1)。下面讨论顺序表其他几个主要操作 的实现。

  1. 初始化
    顺序表的初始化操作就是构造一个空的顺序表。
  2. 取值
    取值操作是根据指定的位置序号i, 获取顺序表中第i个数据元素的值。 由千顺序存储结构具有随机存取的特点, 可以直接通过数组下标定位得到,elem[ i-1]单元存 储第)个数据元素。
  3. 查找
    查找操作是根据指定的元素值e, 查找顺序表中第1个与e相等的元素。若查找成功,则返 回该元素在表中的位置序号;若查找失败,则返回0。
  4. 插入
    线性表的插入操作是指在表的第l个位置插入一个新的数据元素e, 使长度为n 的线性表 (a1,a2,···ai-1,ai,ai+1,···,an) 变成长度为n+l的线性(a1,a2,···ai-1,x,ai,ai+1,···,an) 数据元素ai-1和ai之间的逻辑关系发生了变化在线性表的顺序存储结构中,由于逻辑上相邻 的数据元素在物理位置上也是相邻的,因此除非 i=n+l, 否则必须移动元素才能反映这个逻辑关系的变化。
  5. 删除
    读者参考插入,我就不写了。

代码如下

#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
typedef struct  {
	int num[100];
	int length;
}SeqList;
void InitList(SeqList* T) {			//初始化线性表
	if (T != NULL) {
		T->length = 0;
	}
	else
		printf("申请失败\n");
}
void DestroyList(SeqList* T) {			//销毁线性表
	T->length = 0;	
}
void CreateList(SeqList* T) {			//创建线性表
	int j=0,n;
	printf("输入添加个数:");
	scanf("%d", &n);
	printf("输入你需要添加的元素:");
	for (j = 0;j < n;j++)
		scanf("%d", &T->num[j]);		
	T->length = n;
}
bool ListEmpty(SeqList* T) {			//判断线性表是否为空
	if (T->length == 0) 
		return true;
	else
		return false;
}
int GetElem(SeqList* T, int i,int *e) {		/*返回T中第i个数据元素的值*/
	int flag=0;
	if (i >= 1 && i <= T->length) {
		*e = T->num[i - 1];
		flag = 1;
		return flag;
	}
	else 
		return flag;
}
void LocateElem(SeqList* T, int e){			/*返回线性表中第1个与e满足关系的位置*/
	int i;
	for (i = 0;i < T->length;i++) {
		if (T->num[i] == e)
			break;
	}
	if (i < T->length)
		printf("查找到的位置为:%d\n",i+1);
	else
		printf("查找位置失败\n");
}
void ListInsert(SeqList* T, int e, int i) {			/*在线性表T的第i个位置插入新的数据元素e*/
	int j = 0;
	if (i >= 1 && i <= T->length+1&&i<=100) {
		for (j = T->length;j >= i;j--) {
			T->num[j] = T->num[j - 1];
		}
		T->num[i - 1] = e;
		T->length++;
	}
	else 
		printf("操作位置错误\n");
}
void ListDelete(SeqList* T, int i) {			/*删除线性表T的第i个元素*/
	int j;
	if (i >= 1 && i <= T->length) {
		for (j = i - 1;j < T->length;j++) {
			T->num[j] = T->num[j + 1];
		}
		T->length--;
		printf("删除成功\n");
	}
	else
		printf("操作位置错误\n");
}
int main() {
	SeqList* T;
	int e, i, selector,s;
	bool m;
	char ch;
	T = (SeqList*)malloc(sizeof(SeqList));
	InitList(T);
	do {
		printf("1.创建线性表\n");
		printf("2.判断线性表是否为空\n");
		printf("3.获取线性表第i个元素\n");
		printf("4.定位一个数值在线性表中位置\n");
		printf("5在第i个位置插入一个数\n");
		printf("6.删除第i个位置的数\n");
		printf("7.销毁该线性表\n");
		printf("0.退出\n");
		printf("请输入你的选择:");
		scanf("%d", &selector);
		switch(selector) {
			case 1:
				CreateList(T);
				break;
			case 2:
				m = ListEmpty(T);
				if (m == true)
					printf("该线性表为空\n");
				else
					printf("该线性表不为空\n");
				break;
			case  3:
				printf("输入i为:");
				scanf("%d", &i);
				s=GetElem(T,  i, &e);
				if(s!=0)
					printf("获得数值为:%d\n", e);
				else 
					printf("操纵位置错误\n");
				break;
			case 4:
				printf("输入数值s:");
				scanf("%d", &s);
			    LocateElem(T, s);
				break;
			case 5:
				printf("输入你要插入的位置和数值:");
				scanf("%d%d",&i,& s);
				ListInsert(T, s, i);
				break;
			case 6:
				printf("输入你要删除的位置i:");
				scanf("%d", &i);
				ListDelete(T, i);
				break;
			case 7:
				DestroyList(T);
				break;
			default:
				printf("选择错误\n");
		}
	} while (selector!=0);
	return 0;
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值