数据结构学习笔记

简单的实现静态顺序表:此种简单的顺序表结构并不灵活,因为其无法动态开辟空间。

#include <stdio.h>
#define MaxSize 10

//参数1:传递顺序表的首地址
//参数2:len表的长度
//参数3:插入元素的位置
//参数4:待插入的元素值
int InsertElem(int list[], int *len, int x, int y)
{
    if (*len == MaxSize || x < 1 || x > *len + 1)
        return 0;
    for (int z = *len - 1; z >= x - 1; z--)
        list[z + 1] = list[z];
    list[x - 1] = y;
    *len = *len + 1;
    return 1;
}
//参数1:传递顺序表的首地址
//参数2:len表的长度
//参数3:待删除元素的位置
int DeleteElem(int list[], int *len, int x)
{
    int y;
    if (x < 1 || x >len)
        return 0;
    for (y = x; y <= *len - 1; y++)
        list[y - 1] = list[y];
    *len = *len - 1;
    return 1;
}

int main()
{
    int Sqlist[MaxSize] = {1,2,3,4,5};
    int ListLen = 5;

    for (int x = 0; x < ListLen; x++)
        printf_s("%d ", Sqlist[x]);
    printf_s("\n得到当前数组长度:%d\n", MaxSize - ListLen);

    InsertElem(Sqlist, &ListLen, 3, 100);
    DeleteElem(Sqlist, ListLen, 4);

    for (int x = 0; x < ListLen; x++)
        printf_s("%d ", Sqlist[x]);
    printf_s("\n得到当前数组长度:%d\n", MaxSize - ListLen);
    getchar();
    return 0;
}

实现动态顺序表,可动态生成数据.

#include <stdio.h>
#define MaxSize 10
typedef int ElemType;

typedef struct{
    int *elem;
    int length;
    int size;
}list;

int InitList(list *mem)
{
    mem->elem = (int *)malloc(MaxSize*sizeof(ElemType));
    if (!mem->elem)exit(0);
    mem->length = 0;
    mem->size = MaxSize;
    if (mem->elem != 0)
        return 1;
}

// 参数1:mem类型的指针基地址
// 参数2:i插入元素的位置
// 参数3:item待插入的元素
void InsertElem(list *mem, int i, ElemType item)
{
    ElemType *base, *insertPtr, *p;
    if (i<1 || i>mem->length + 1)exit(0);
    if (mem->length >= mem->size)
    {
        // 说明我们的链表满了,需要追加开辟空间
        base = (ElemType*)realloc(mem->elem, (mem->size + 10)*sizeof(ElemType));
        mem->size = mem->size + 50;
    }
    insertPtr = &(mem->elem[i - 1]); // 取出第二个元素位置地址
    for (p = &(mem->elem[mem->length - 1]); p >= insertPtr; p--)
        *(p + 1) = *p;
    *insertPtr = item;
    mem->length++;
}

// 参数1:mem类型的指针基地址
// 参数2:删除元素的位置
void DeleteElem(list *mem, int i)
{
    ElemType *delItem, *p;
    if (i<1 || i>mem->length)
        exit(0);
    delItem = &(mem->elem[i - 1]);
    p = mem->elem + mem->length - 1;
    for (++delItem; delItem <= p; ++delItem)
        *(delItem - 1) = *delItem;
    mem->length--;
}

int main()
{
    list temp;
    InitList(&temp);
    for (int x = 1; x < 15; x++)
        InsertElem(&temp, x, x );             // 插入1-15
    for (int x = 0; x < temp.length; x++)     // 打印1-15 
        printf("%d ", temp.elem[x]);
    // 删除第三个位置的数值
    DeleteElem(&temp, 3);
    // 打印出删除后的结果
    for (int x = 0; x < temp.length; x++)
        printf("\n%d ", temp.elem[x]);
    getchar();
    return 0;
}

实现双向链表:

上一篇:前端内存查看的几种方式


下一篇:linux下对服务器性能监控shell脚本