数据结构---c语言实现线性表(静态+动态)全部操作(附完整代码)

本文档展示了静态线性和动态线性表的数据结构实现,包括初始化、插入、删除、修改和查找等基本操作。静态线性表使用固定大小数组实现,动态线性表则采用动态内存分配。通过代码示例演示了两种线性表在主函数中的应用,如插入元素、删除元素和修改元素等,并给出了相应的运行结果。
摘要由CSDN通过智能技术生成

看完别忘点赞噢hhh
有问题请评论或私聊

静态线性表

创、销(无)、增、删、改、查

运行结果

//静态顺序存储线性表
//创、销(无)、增、删、改、查

#include<stdio.h>
#define MAXSIZE 50
#define ElemType	int
#define	Status		int
#define OK			1
#define ERROR		0

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

Status InitList(Sqlist *L);//初始化表
Status ListInsert(Sqlist &L, int i, Status e);//插入
Status isEmpty(Sqlist &L);//判空
Status ListDeleteLocate(Sqlist &L, int i);//按位删除
//LocateElem(L, e);// 按值查找
Status GetElem(Sqlist &L,int i);//按位查找
void PrintList(Sqlist L);//输出

Status ListModify(Sqlist &L, int i, ElemType e);//修改
//DestroyList(&L);//销毁

int main(){
	Sqlist L;
	InitList(&L);
	ListInsert(L, 0, 1);
	ListInsert(L, 1, 2);
	ListInsert(L, 2, 3);
	PrintList(L);
	ListDeleteLocate(L, 1);
	PrintList(L);
	GetElem(L, 1);
	ListModify(L, 0, 3);
	PrintList(L);
	return 0;
}

//初始化
Status InitList(Sqlist *L){
	L->length = 0;
	printf("线性表初始化完成\n");
	return OK;
}

//输出
void PrintList(Sqlist L){
	printf("data中\n");
	for (int i = 0; i < L.length; i++)
		printf("data[%d] = %d ", i, L.data[i]);	
	printf("\n线性表的长度为 %d \n", L.length);
	return;
}

//按位修改
Status ListModify(Sqlist & L, int i, ElemType e)
{
	//0. 判断修改位置存在
	if (isEmpty(L)) {
		printf("线性表为空,修改失败\n");
		return ERROR;
	}
	else if (i >= L.length || i < 0) {
		printf("修改位置不存在\n");
		return ERROR;
	}
	//1.修改
	L.data[i] = e;
	printf("第%d位修改成功,改为%d\n", i,e);
	return OK;
}

//插入
//i: 插入的位置(默认为数组对应位置,从0开始)
//e: 插入的元素
Status ListInsert(Sqlist &L, int i, Status e){
	//0. 判断是否超出线性表长度
	if (L.length > MAXSIZE){
		printf("线性表已达最大长度,插入失败\n");
		return ERROR;
	}
	//1. 将i后面元素依次后移一个位置
	for (int j = L.length; j > i; j--){
		L.data[j] = L.data[j - 1];
	}
	//2. 将对应位置补入e
	L.data[i] = e;
	//3. length++
	L.length++;

	printf("%d 插入成功!\n", e);
	return OK;
}

// 判空
// 空为  1
// 非空为0
Status isEmpty(Sqlist & L)
{
	if (L.length == 0)
		return OK;
	else
		return ERROR;
}

//按位删除
Status ListDeleteLocate(Sqlist &L, int i)
{
	//0. 判断是否超出线性表长度
	if (isEmpty(L)) {
		printf("线性表为空,删除失败\n");
		return ERROR;
	}
	else if (i >= L.length || i < 0) {
		printf("删除位置不存在");
		return ERROR;
	}
	int e = L.data[i];
	//1. 将i后面元素依次前移一个位置
	for (int j = i; j < L.length-1; j++) {
		L.data[j] = L.data[j + 1];
	}
	//2. length--
	L.length--;

	printf("第%d位 %d 删除成功!\n", i+1,e);
	return OK;
}

//按位查找
//i  :位置
Status GetElem(Sqlist &L, int i)
{
	//0. 判断是否超出线性表长度
	if (isEmpty(L)) {
		printf("线性表为空,查找失败\n");
		return ERROR;
	}
	else if (i >= L.length || i < 0) {
		printf("查找位置不存在\n");
		return ERROR;
	}
	printf("查找的值为:第%d位: %d\n", i + 1, L.data[i]);
	return OK;
}

运行结果

在这里插入图片描述

动态线性表

代码

// 动态线性表
// 2021.5.14  
// 20:31
// 创、销(无)、增、删、改(无)、查(无)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define Status int
#define OVERFLOW -1
#define OK 1
#define ERROR 0
#define ElemType int

typedef struct{
	ElemType * elem;//指示动态分配数组的指针
	int length;		//当前长度
	int listsize;	//顺序表的最大容量
}SqList;

Status InitList(SqList *L);	//初始化
Status ListInsert(SqList *L, int i, ElemType e); //插入
Status ListDelete(SqList *L, int i);	//删除
void printTable(SqList L);	//打印


Status InitList(SqList *L) {
	L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));	//申请100空间
	if (!L->elem)	//申请失败
		return ERROR;
	L->length = 0;	//长度0
	L->listsize = LIST_INIT_SIZE;	//容量100
	return OK;	//申请成功
}

Status ListInsert(SqList *L, int i, ElemType e) {
	int j;
	ElemType *newbase;
	if (i<1 || i>L->length + 1)
		return ERROR;	//非法输入

	if (L->length >= L->length) {	//已存满,需更大空间
		newbase = (ElemType*)realloc(L->elem, (L->listsize + LISTINCREMENT) * sizeof(ElemType));//大10的空间
		
		if (!newbase)	//申请失败
			return ERROR;

		L->elem = newbase;	//指针的连接
		L->listsize += LISTINCREMENT;	//新容量
	}

	for (j = L->length; j > i - 1; j--)	//复制之前的值到新的线性表中
		L->elem[j] = L->elem[j - 1];

	L->elem[i - 1] = e;	//插入操作
	printf("第%d个 %d 插入成功\n", i, L->elem[i - 1]);

	L->length++;
	return OK;
}

Status ListDelete(SqList * L, int i)
{
	int j;
	if (i<1|| i>L->length)	//	非法输入
		return ERROR;
	for (j = i - 1; j <= L->length; j++)	//将删除值后的线性表值前移
		L->elem[j] = L->elem[j + 1];
	(L->length)--;
	return OK;
}

void printTable(SqList L) {
	printf("\n");
	for (int i = 0; i < L.length; i++) {
		printf("i=%d\t", i);
		printf("%d \n", L.elem[i]);
	}
	printf("\n\n");
}

int main(){
	SqList L;
	int i;
	ElemType e;
	ElemType data[9] = { 1,2,3,4,5,6,7,8,-99 };
	InitList(&L);
	
	for (i = 1; i <= 9; i++) {
		ListInsert(&L, i, data[i-1]);
	}
	printTable(L);

	ListDelete(&L, 2);

	printTable(L);

	return 0;
}

运行结果

在这里插入图片描述

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值