【数据结构】线性表的顺序存储表示以及实现

本文详细介绍了线性表的基本概念,包括顺序存储特性及其实现,如初始化、插入、删除、长度获取等操作。通过C语言代码展示了如何创建线性表并演示了关键函数的使用。同时,讨论了线性表的动态扩容策略以应对元素增加需求。
摘要由CSDN通过智能技术生成

目录

代码实现

实现截图

线性结构的特点:

(1)存在唯一的而一个被称作“第一个”的数据元素;

(2)存在唯一的一个被称作“最后一个”的数据元素;

(3)除出第一个之外,集合中的每个数据元素均只有一个前驱;

(4)除最后一个之外,集合中的每个数据元素均只有一个后继;

        线性表是最常用且最简单的一种数据结构。顺序存储,随机存取。线性表的顺序表示指的是用一组地址连续的存储单元一次存储线性表的数据元素。

        假设线性表的每个元素占用L个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储位置,则线性表中第 i + 1 个数据元素的存储位置LOC(a_{i+1})和第i个数据元素的存储位置LOC(a_{i})之间满足下列关系:

LOC(a_{i+1})= LOC(a_{i}) +L


        一般来说,线性表的第i个数据元素a_{i}的存储位置为:

 LOC(a_{i}) =  LOC(a_{i}) + (i - 1)× L


   代码实现

//线性表
# include<stdio.h>
# include<stdlib.h>
# define LIST_INIT_SIZE 100 //初始化大小 
# define LISTINCREMENT 10  //增量
# define ERROR -2 
typedef struct {
	int *elem; // 存储空间基址
	int length; //当前长度 
	int listsize; //当前分配的存储容量 
}SqList;
//构造一个 空的线性表
int InitList_Sq(SqList *L){
	L->elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
	if(!L->elem) return ERROR; //存储分配失败
	L->length = 0; //空表长度为0 
	L->listsize = LIST_INIT_SIZE;  //初始存储容量
	return 1; 
}
//创建一个线性表
void createList(SqList *L,int n){
	 InitList_Sq(L);
	 int i;
	 printf("请输入元素:");
	 for(i = 0; i < n; i ++){
	 	scanf_s("%d", &L->elem[i]);
	 }
	 L->length = n - 1;
	 printf("创建成功\n");
}
//插入一个元素就是把最后一个元素向后移,挨个移到插入位置 
int InsertOneToList(SqList *L, int i, int e){
	//在第i个位置插入e元素
	if(i < 1 || i > L->length + 2) return ERROR;
	if(L->length >= L->listsize){//分配空间已满 
		int *newbase = (int *)realloc(L->elem,(L->listsize + LISTINCREMENT)*sizeof(int));
		if(!newbase) return ERROR;
		L->elem = newbase;
		L->listsize += LISTINCREMENT;
	}
	if (i == (L->length + 2)) {
		L->length++;
		L->elem[i-1] = e;
	}else{
		for (int j = L->length; j >= i - 1; j--) {
			L->elem[j + 1] = L->elem[j];
		}
		L->elem[i - 1] = e;//第i个元素变成e
		L->length++;
	}
	
}
//删除第i个元素 
int DeleteOneInList(SqList *L, int i){
	if(i < 1 || i > L->length+1) return ERROR;//删除的位置不合法
	for(int j = i-1; j < L->length; j ++){
		L->elem[j] = L->elem[j+1] ;
	} 
	L->length--;
	return 1;
} 
//求表的长度 
void ListLength(SqList *L){
	printf("长度为%d\n",(L->length+1));
}
//打印表的内容 
void printList(SqList L){
	for(int i = 0; i <= L.length; i++){
		printf("%d ", L.elem[i]);
	}
	printf("\n");
}
//销毁表
void DestoryList(SqList *L){
	if(L == NULL) return;
	printf("已成功销毁\n");
	free(L->elem);
} 
//通过下标获取元素
int GetElem(int location, SqList *L){
	if(location < 1 || location > L->length + 1){
		printf("下标错误");
		return ERROR;
	}
	printf("第%d个位置的元素是%d\n",location,L->elem[location-1]);
	return 1;
} 
//通过元素获取下标
void LocateElem(int elem, SqList *L){
	for(int i = 0; i <= L->length; i++){
		if(elem == L->elem[i]){
			printf("%d位于第%d位\n",elem,i+1);
		}
	}
		printf("没有该元素\n");
} 
//排序,不改变原表 
void sort(SqList L){
	
	int temp;
	for(int i = 0;i < L.length; i++){
		for(int j = 0; j < L.length-i; j++){
			if(L.elem[j] > L.elem[j+1]){
				temp = L.elem[j];
				L.elem[j] = L.elem[j+1];
				L.elem[j+1] = temp;
			}
		}
	}
	for(int i = 0; i <= L.length; i++){
		printf("%d ",L.elem[i]);
	}
	printf("\n");
} 
//逆置输出表 
void Inversion(SqList L) {
	int temp;
	for (int i = 0; i < (L.length + 1) / 2; i++) {
		temp = L.elem[i];
		L.elem[i] = L.elem[L.length - i];
		L.elem[L.length - i] = temp;
	}
	for (int i = 0; i <= L.length; i++) {
		printf("%d ", L.elem[i]);
	}
	printf("\n");
}

//union
//打印出排序后的SqList C
int unionSqList(SqList LA, SqList LB, SqList* LC) {
	int i = 0;
	int j = 0;
	LC->listsize = LA.listsize + LB.listsize;
	LC->elem = (int*)malloc(sizeof(int) * LC->listsize);
	LC->length = 0;
	if (!LC->elem) return ERROR;
	while (i <= LA.length) {
		LC->elem[LC->length] = LA.elem[i];
		i++;
		LC->length++;
	}
	while (j <= LB.length) {
		LC->elem[LC->length] = LB.elem[j];
		j++;
		LC->length++;
	}
	LC->length--;//上一个while循环多加了一
	sort(*LC);
}


int main(){
	SqList list,listA,listB; 
	int num;
	int location;
	int e;
	int operate = 0;
	printf("----------------------------\n");
	printf("请输入你需要的操作\n");
	printf("1---创建新表\n");
	printf("2---插入元素\n");
	printf("3---删除元素\n");
	printf("4---表的长度\n");
	printf("5---销毁表\n");
	printf("6---获取指定位置的元素\n");
	printf("7---获取指定元素的位置\n");
	printf("8---升序排序\n");
	printf("9---逆置表\n");
	printf("10---表的合并\n");
	printf("11---打印表\n");
	printf("----------------------------\n");
	while(operate != -1){
		scanf_s("%d", &operate);
		switch(operate){
			case 1: 
				printf("请输入表的长度\n");
				scanf_s("%d", &num);
				createList(&list,num);
				printf("请继续下一步操作");break;
			case 2:
				printf("请输入你要插入的元素和位置\n");
				scanf_s("%d %d",&e,&location);
				InsertOneToList(&list, location, e);
				printList(list);
				printf("请继续下一步操作");break;
			case 3:
				printf("请输入你要删除的元素的位置\n");
				scanf_s("%d", &location);
				DeleteOneInList(&list, location);
				printList(list);
				printf("请继续下一步操作");break;
			case 4:
				ListLength(&list);
				printf("请继续下一步操作");break;
			case 5:
				DestoryList(&list);
				printf("请继续下一步操作");break;
			case 6:
				printf("请输入位置\n");
				scanf_s("%d",&location); 
				GetElem(location, &list);
				printf("请继续下一步操作");break;
			case 7:
				printf("请输入元素\n");
				scanf_s("%d",&e);
				LocateElem(e, &list);
				printf("请继续下一步操作");break;
			case 8:
				sort(list);
				printf("请继续下一步操作");break;
			case 9:
				Inversion(list);
				printf("请继续下一步操作");break;
			case 10:
				InitList_Sq(&listA);
				printf("请输入表中元素的个数");
				scanf_s("%d", &num);
				createList(&listA,num);
				unionSqList(list,listA,&listB);
				printf("请继续下一步操作");break;
			case 11:
				printList(list);
				printf("请继续下一步操作");break;
		}
	}
}

实现截图

 参考:严蔚敏 吴伟民《数据结构(C语言版)》----清华大学出版社

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值