《妙趣横生的算法》(C语言实现)-第1章 数据结构基础

【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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值