线性表的线性输入,插入,删除中间元素示例

线性表是由n个数据元素的有序序列

下面是关于线性表的基本操作

(由于是使用VS编译,scanf 表示为scanf_s)

#include<stdio.h>
#include<stdlib.h>
#define LISTSIZE 20
#define LISTCREMENT 10
#define Error 0
#define OK 1

//线性表的动态分配顺序储存结构
typedef int Elemtype;
typedef int status;
typedef struct{
	int Length;
	Elemtype *elem;
	int listsize;
}SqList;  

status InitList(SqList& L) {
	L.elem = (Elemtype*)malloc(LISTSIZE * sizeof(Elemtype));
	if (!L.elem)   //存储分配失败
		return Error;
	L.Length = 0;   //定义空表初始长度
	L.listsize = LISTSIZE;//初始储存容量
	return OK;
}
//向线性表中输入数据
status CreatList(SqList& L,int n) {
	Elemtype* p;
	for (p = L.elem; p < L.elem +n; p++) {
		L.Length++;
		scanf_s("%d", p);
	}
	return OK;
}

//将线性表中第i个元素赋值给e;
status GerElem(SqList L, int i, Elemtype* e) {
	if (i<1 || i>L.Length || L.Length == 0)//当i不符合数组长度或者数组长度为0,寻找错误
		return Error;
	else
		*e=L.elem[i - 1];
	printf("%d", *e);
	return OK;
}
//插入一个新元素
status ListInsert(SqList &L, int i, Elemtype e) {
	Elemtype *newbase;//定义新基地址
	Elemtype *p;
	if (i<1 || i>L.Length + 1)
		return Error;
	if (L.Length >= L.listsize) {
		newbase = (Elemtype*)realloc(L.elem, (L.listsize + LISTCREMENT) * sizeof(Elemtype));//增加分配
		if (!newbase)
			return Error;//分配错误
		L.elem = newbase;//新的基地址
		L.listsize += LISTCREMENT;//增加储存容量
	}
		p = &(L.elem[i - 1]);
		for (Elemtype* q = &L.elem[L.Length - 1]; q >= p; --q) {
			*(q + 1) = *q;//将i-1元素后移
		}
		*p = e;
		++L.Length;//表长加一
		return OK;
}
//删除线性表中的第i个元素,并用e返回其值
status ListDelete(SqList& L, int i, Elemtype&e) {
	Elemtype *p,*q;
	if (i<1 || i>L.Length)
		return Error;
	p = &L.elem[i - 1];
	e = *p;
	p++;
	for (q = L.elem + L.Length - 1; p<= q; p++)
		*(p - 1) = *p;
	--L.Length;
	return OK;
}
//输出线性表中的数据;
status PrintfList(SqList L) {
	Elemtype* p;
	for (p = L.elem; p <= L.elem + L.Length - 1; p++) {
		printf("%d", *p);
	}
	return OK;
}
int main() {
	SqList L;
	int n;
	Elemtype e;
	scanf_s("%d", &n);
	InitList(L);
	CreatList(L, n);
	ListInsert(L, 2, 5);
	ListDelete(L, 3, e);
	PrintfList(L);

	return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值