【1-1】创建一个静态的顺序表存放整数,大小为10,完成以下的操作。
// 实例1-1 2023年12月21日15点59分-16点31分
# include <stdio.h>
# define MaxSize 10
// 静态顺序表的各种操作
// 向顺序表插入元素,Sqlist表首地址,*len表的长度,pos插入元素的位置,x待插入的元素值
void insertElem(int Sqlist[], int * len, int pos, int x)
{
if (pos < 1 || pos > *len+1 || *len==MaxSize) {
// 非法插入
printf("This insert is illegal\n");
return ;
}
for (int i = *len-1; i >= pos-1; --i) // 将第pos个位置及以后的元素顺序后移一个元素的位置
Sqlist[i+1] = Sqlist[i];
Sqlist[pos-1] = x; // 在第pos个位置上插入元素x
(*len)++; // 表长加1
}
// 从顺序表中删除元素,Sqlist表首地址,*len表的长度,pos删除元素的位置
void deleteElem(int Sqlist[], int *len, int pos)
{
if (pos < 1 || pos > *len) {
// 非法删除
printf("This delete is illegal\n");
return ;
}
for (int i = pos; i < *len; ++i) // 将第pos个位置及以后的元素一次前移
Sqlist[i-1] = Sqlist[i];
(*len)--; // 表长减1
}
int main()
{
int Sqlist[MaxSize]; // 定义一个静态顺序表
int len = 0;
for (int i = 0; i < 6; ++i) {
// 从键盘输入6个整数
int num;
printf("Please input %dth number:", i+1);
scanf("%d", & num);
insertElem(Sqlist, & len, i+1, num);
}
printf("Print the result:"); // 输出顺序表的所有整数
for (int i = 0; i < len; ++i)
printf("%d ", Sqlist[i]);
printf("\nThe spare length is %d\n", MaxSize - len); // 显示表中的剩余空间
insertElem(Sqlist, & len, 3, 0); // 在表中第3个位置插入整数0
printf("Print the result:"); // 输出顺序表的所有整数
for (int i = 0; i < len; ++i)
printf("%d ", Sqlist[i]);
printf("\nThe spare length is %d\n", MaxSize - len); // 显示表中的剩余空间
insertElem(Sqlist, & len, 11, 0); // 在表中第11个位置插入整数0
deleteElem(Sqlist, & len, 6); // 删除表中第6个位置元素
printf("Print the result:"); // 输出顺序表的所有整数
for (int i = 0; i < len; ++i)
printf("%d ", Sqlist[i]);
printf("\nThe spare length is %d\n", MaxSize - len); // 显示表中的剩余空间
deleteElem(Sqlist, & len, 16); // 删除表中第16个位置元素
return 0;
}
总结:静态顺序表的插入和删除元素,一方面需要判断是否非法操作,另一方面相应移动元素,表长也相应改变!
【1-2】编写程序,动态地创建一个顺序表。
// 1-2 2023年12月21日16点42分-17点13分
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
# define MaxSize 10
typedef int ElemType; // 将int定义为ElemType
typedef struct {
int *elem; // 顺序表的首地址
int length; // 顺序表中表的长度
int listsize; // 顺序表的存储空间容量
}Sqlist;
// 初始化一个顺序表,Sqlist类型的指针
void initSqlist(Sqlist *L)
{
L->elem = (int*)malloc(MaxSize * sizeof(ElemType));
if (!L->elem)
exit(0);
L->length = 0;
L->listsize = MaxSize;
}
// 向顺序表中插入元素,Sqlist类型的指针,pos插入元素的位置,x插入的元素
void insertElem(Sqlist *L, int pos, ElemType x)
{
if (pos < 1 || pos > L->length + 1) {
// 非法插入
printf("\nThis insert is illegal");
// exit(0);
return ;
}
if (L->length >= L->listsize) {
ElemType * base = (ElemType *)realloc(L->elem, (L->listsize+10) * sizeof(ElemType));
L->elem = base; // 更新内存基址
L->listsize += 100; // 存储空间增大100个单元
}
for (ElemType * p = &(L->elem[L->length-1]); p >= &(L->elem[pos-1]); --p) // 将第pos个位置及以后的元素后移
*(p+1