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

【1-1】创建一个静态的顺序表存放整数,大小为10,完成以下的操作。

// 实例1-1 2023年12月21日15点59分-16点31分
# include 
# 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 
# include 
# include 
# 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) = *p;
    L->elem[pos - 1] = x; // 在第pos个位置上插入元素x 
    ++L->length; // 表长加1 
}
// 从顺序表删除元素,Sqlist类型的指针,pos删除元素的位置 
void deleteElem(Sqlist *L, int pos)
{
    if (pos < 1 || pos > L->length) {// 非法删除 
        printf("\nThis Delete is illegal");
        exit(0);
    }
    for (ElemType * p = &(L->elem[pos-1]); p <= L->elem+L->length-1; ++p)
        *(p-1) = *p;
    --L->length; // 表长减1 
}
int main()
{
    Sqlist l;
    initSqlist(&l); // 初始化一个顺序表
    for (int i = 0; i < 15; ++i) // 插入元素 
        insertElem(&l, i+1, i+1);
    printf("\nThe content of the list is\n");
    for (int i = 0; i < l.length; ++i) // 打印元素 
        printf("%d ", l.elem[i]);
    deleteElem(&l, 5); // 删除第5个元素
    printf("\nDelete the fifth element\n"); 
    for (int i = 0; i < l.length; ++i)
        printf("%d ", l.elem[i]);
    insertElem(&l, -1, 12);
    deleteElem(&l, -1);
    return 0;
} 

总结:动态顺序表的插入和删除元素,一方面需要判断是否非法操作,另一方面相应移动元素,表长也相应改变!另外,注意动态内存的使用。
【1-3】编写程序实现对链表的操作。

你可能感兴趣的:(算法,c语言,数据结构)