2021-10-12 数据结构第一次上机实验

要求如下:

 我的代码如下:(参考课本及老师所讲进行了完善)

#include<stdio.h>
#include<malloc.h>

#define List_Init_Size 100
#define LISTINCREMENT 10
#define FAILURE 0
#define SUCCESS 1


typedef int Status;

struct SqList {
	int* elem;
	int length;
	int ListSize;
};

//主要函数的声明
Status Initialize_table(SqList &L);
Status ListDelete(SqList&L, int i, int &e);
Status ListInsert(SqList&L, int i, int e);
Status ExistIn(SqList L, int e);
Status MergeList(SqList &L1, SqList L2);
Status PrintSqList(SqList L);

//主函数
Status main() {
	SqList La, Lb;
	int result;
	int insertid,deleteid,insertelem;

	Initialize_table(La);
	Initialize_table(Lb);

	printf("Please input the NO. of element to delete element in the first list:");
	scanf("%d", &deleteid);
	ListDelete(La, deleteid, result);

	printf("Please input the NO. of element and the element to insert element:");
	scanf("%d%d", &insertid, &insertelem);
	ListInsert(Lb, insertid, insertelem);

	MergeList(La, Lb);

	PrintSqList(La);

	free(La.elem);
	free(Lb.elem);
	return SUCCESS;
}

//主要函数的定义
Status Initialize_table(SqList &L) {
	//初始化线性表
	int n, data;
	L.elem = (int*)malloc(List_Init_Size*sizeof(int));
	if (!L.elem) {
		printf("Overflow");
		return FAILURE;
	}
	L.ListSize = List_Init_Size;
	L.length = 0;

	printf("Please input the size of linear table(<=%d):", List_Init_Size);
	scanf("%d", &n);
	for (int i = 0;i < n;i++) {
		printf("Please input the NO.%d element:", i + 1);
		scanf("%d", &data);
		*(L.elem + i) = data;
		L.length++;
	}
	return SUCCESS;
}

Status ListDelete(SqList&L, int i, int &e) {
	//从线性表中删除第i个元素,用e返回
	int *p, *q;
	if ((i < 1) || (i > L.length)) {
		return FAILURE;
	}

	p = L.elem + i - 1;
	e = *p;
	q = L.elem + L.length - 1;
	for (++p;p <= q;++p)
		*(p - 1) = *p;
	L.length--;
	//printf("After deleting,the elements in list are:");
	//PrintSqList(L);
	return SUCCESS;
}

Status ListInsert(SqList&L, int i, int e) {
	//在线性表第i个位置插入元素e
	int *p, *q;
	if ((i < 0) || (i > L.length)) {
		return FAILURE;
	}
	if (L.length <= L.ListSize) {
		p = (int*)realloc(L.elem, (L.ListSize + LISTINCREMENT)*sizeof(int));
		if (p == NULL)
			return FAILURE;
		L.elem = p;
		L.ListSize += LISTINCREMENT;
	}

	q = L.elem + i;
	for (p = L.elem + L.length - 1;p >= q;--p)
		*(p + 1) = *p;
	*q = e;
	L.length++;
	//printf("After inserting,the elements in list are:");
	//PrintSqList(L);
	return SUCCESS;
}

Status ExistIn(SqList L, int e) {
	//检查线性表是否包含元素e
	if (L.length == 0)
		return FAILURE;
	for (int i = 0;i < L.length;i++) {
		if (*(L.elem + i) == e) {
			return SUCCESS;
		}
	}
	return SUCCESS;
}

Status MergeList(SqList &L1, SqList L2) {
	//合并两个线性表
	int len = L1.length;
	for (int i = 0;i < L2.length;i++) {
		if (ExistIn(L1, *(L2.elem + i)))
			ListInsert(L1, len++, *(L2.elem + i));
	}
	return SUCCESS;
}

Status PrintSqList(SqList L) {
	//打印线性表
	for (int i = 0;i < L.length;i++) {
		printf("%d ", *(L.elem + i));
	}
	printf("\n");
	return SUCCESS;
}

运行效果如下:

 

我的小发现:

(1)函数的传入参数若是需要被加工改动的,则添加符号&,不改动的则不添加

(2)这个程序真是理解指针的好工具(对于我这种指针没学好的来说哈哈)

下次见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值