要求如下:
我的代码如下:(参考课本及老师所讲进行了完善)
#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)这个程序真是理解指针的好工具(对于我这种指针没学好的来说哈哈)
下次见!