动态内存分配 顺序表

#include <iostream>
#include <stdlib.h>

using namespace std;

//通过数组实现线性表的顺序存储结构
//每次完成操作之后都会调用ShowList()

typedef struct
{
	//定义一个顺序表的结构体,便于储存控件地址,长度和内存容量
	int *data;
	int length = 0;
	int listsize = 0; //当前存储容量(以sizeof(ElemType)为单位
} List;

void ShowList(List &L)
{
	//实验展示顺序表的方法,便于随时查看顺序表中的元素
	printf("目前表中元素为:[");
	for (int i = 0; i < L.length; i++)
	{
		printf("%d", L.data[i]);
		if (i != L.length - 1)
			printf(",");
	}
	printf("]\n");
}

void CreateList(List &L)
{
	//构造构造一个顺序表
	int n;
	printf("请输入要创建的顺序表的长度:");
	scanf("%d", &n);
	L.data = (int *)malloc(n * sizeof(int));
	printf("请输入表中各元素的值,以空格分开:");
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &L.data[i]);
	}
	L.length = n;
	L.listsize = n;
	ShowList(L);
}

void ListInsert(List &L)
{
	//在顺序线性表 L 中第 i 个位置之前插入新元素 e
	int i = 0, e;
	do
	{
		printf("请输入要插入的位置:");
		scanf("%d", &i);
		if (i < 1 || i > L.length + 1)
			printf("输入的位置不合法!\n");
	} while (i < 1 || i > L.length + 1); // i的值要合法
	printf("请输入要插入的元素:");
	scanf("%d", &e);
	if (L.length >= L.listsize)
	{ //当前存储控件已满,增加分配
		L.data = (int *)realloc(L.data, (L.listsize + 1) * sizeof(int));
		L.listsize += 1; //增加内存容量
	}
	int *q = &(L.data[i - 1]); // q 为插入位置
	for (int *p = &(L.data[L.length - 1]); p >= q; --p)
	{
		*(p + 1) = *p; //插入位置及之后的元素右移
	}
	*q = e;		//插入e
	++L.length; //表长增 1
	ShowList(L);
}

int ListDelete(List &L)
{
	//删除顺序表中的第 i 个元素的值,并返回这个值
	int i, e;
	do
	{
		printf("请输入要删除的元素在表中的位置:");
		scanf("%d", &i);
		if (i < 1 || i > L.length)
			printf("输入的位置不合法!\n");
	} while (i < 1 || i > L.length); // i的值不合法
	e = (L.data[i - 1]);
	for (int *p = &(L.data[i - 1]); p <= &(L.data[L.length - 2]); p++)
	{
		*p = *(p + 1); // i以后的元素位置整体左移
	}
	printf("删除的元素为%d\n", e);
	L.length--;
	if (L.length < L.listsize)
	{
		L.data = (int *)realloc(L.data, (L.listsize - 1) * sizeof(int));
		L.listsize -= 1; //减少内存分配
	}
	ShowList(L);
	return e;
}

int main()
{
	int e;
	List L;
	CreateList(L);
	ListInsert(L);
	e = ListDelete(L);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值