数据结构复习:静态链表实现

#include <stdio.h>
//静态链表
#define MaxSize 10 //静态链表最大长度
typedef struct Node { //静态链表结构类型的定义
    int data; // 存储数据元素
    int next; //下一个元素的数组下标(游标),-1表示是当前结点为最后一个元素,-2表示结点为空闲结点
}Node,SLinkList[MaxSize];//默认 SLinkList[0]为头结点不存储数据

void testSLinkList(){
    struct Node n1;
    printf("长度:%d\n",sizeof(n1));
    struct Node a[MaxSize];
    printf("长度:%d\n",sizeof(a));

    SLinkList s;
    printf("长度:%d",sizeof(s));
}
//初始化静态链表
void InitSLinkList(SLinkList &L){
    L[0].next = -1;
    for (int i = 1; i < MaxSize; ++i) {
        L[i].next = -2;
    }
}
//简单构建一个静态链表
void buildSLinkList(SLinkList &L) {

    L[0].next = 3;
    L[3].data= 1;
    L[3].next = 7;
    L[7].data= 2;
    L[7].next = 5;
    L[5].data = 3;
    L[5].next = -1;
}
//获取第 i 个 结点
int GetElem(SLinkList L,int i) {
    return 1;
}
//判空
bool Empty(SLinkList L) {
    return L[0].next == -1;
}
//判断静态链表是否满了
bool Full(SLinkList L) {
    return L[MaxSize-1].next == -1;
}

//遍历静态链表 遇到指针为-1 结束
void PrintSLinkList(SLinkList L){
    printf("遍历静态链表:\n");
    if(Empty(L)) {
        printf("静态链表为空\n");
        return;
    }
    int i = L[0].next;//头结点的next域为第一个结点
    while ( L[i].next!=-1) {
        printf("%d ",L[i].data);
        i = L[i].next;
    }
    printf("%d",L[i].data);
    printf("\n");
}
//找到一个空结点的数组下标
int GetEmptyNode(SLinkList L) {
    for (int i = MaxSize-1; i>=0; --i) {
        if(L[i].next==-2) {
            return i;
        }
    }
    return -1;
}

//静态链表长度
int Length(SLinkList L) {
    if(Empty(L)) {
        return 0;
    }
    int len = 1;
    int i = L[0].next;
    while (L[i].next!=-1) {
        i = L[i].next;
        len++;
    }
    return len;
}
//删除位序为 i 的结点
//找到前驱结点,即找到第 i-1 个结点
bool ListDelete(SLinkList &L,int i,int & e) {
    if(i<1) {
        return false;
    }
    if(Empty(L)) {
        return false;
    }

    int k = 1;//计数
    int j = L[0].next;//头结点的next域为第一个结点
    //如果删除的是第一个元素
    if(i==1) {
        e = L[j].data;
        L[j].next = -2;
        L[0].next = -1;
        return true;
    }
    while ( L[j].next!=-1 && k < i-1) {
      //  printf("%d ",L[i].data);
        j = L[i].next;
        k++;
    }
    if(k!=i-1) {
        return false;
    } else {
        //第i-1个结点就是 L[j]
        int index = L[j].next;
        L[j].next = L[index].next;
        e = L[index].data;
        L[index].next = -2;
    }
    return true;
}
//插入位序为 i 的元素 e
bool ListInsert(SLinkList &L,int i,int & e) {
    //找到一个空的位置
    int index = GetEmptyNode(L);
    if(index!=-1) {
        if(L[0].next  == -1) {
            L[0].next = index;
            L[index].data = e;
            L[index].next = -1;
            return true;
        }
        int k = 1;
        int j = L[0].next;//头结点的next域为第一个结点

        //如果插入的是第一个元素
        //如果删除的是第一个元素
        if(i==1) {
            L[0].next = index;
            L[index].data = e;
            L[index].next = j;
            return true;
        }
        while ( L[j].next!=-1 && k < i-1) {
            j = L[j].next;
            k++;
        }
        if(k==i-1){
            int next = L[j].next;
            L[j].next = index;
            L[index].data = e;
            L[index].next = next;
            return true;
        } else {
            return false;
        }
    } else {
        printf("数据已满\n");
        return false;
    }

}

int main() {
    setbuf(stdout,NULL);//解决debug时候控制台没有输出
//    testSLinkList();
    SLinkList  L;
    InitSLinkList(L);
    buildSLinkList(L);

    printf("静态链表长度:%d\n", Length(L));
//    ListInsert(L,1,1);
//    ListInsert(L,1,2);
  //  ListInsert(L,3,3);
    PrintSLinkList(L);
    int e = -1;
    int i = 3;

    if(ListDelete(L,i,e)) {
        printf("删除第%d个元素%d成功\n",i,e);
        PrintSLinkList(L);
    } else {
        printf("删除第%d个元素失败\n",i);
    }
    e = -1;
     i = 1;
    if(ListDelete(L,i,e)) {
        printf("删除第%d个元素%d成功\n",i,e);
        PrintSLinkList(L);
    } else {
        printf("删除第%d个元素失败\n",i);
    }

    i = 1, e = 2;

    InitSLinkList(L);
    if(ListInsert(L,i,e)) {
        printf("在第%d个位置插入%d成功\n",i,e);
    } else {
        printf("在第%d个位置插入%d失败",i,e);
    }

    i = 1,e = 1;
    if(ListInsert(L,i,e)) {
        printf("在第%d个位置插入%d成功\n",i,e);
    } else {
        printf("在第%d个位置插入%d失败\n",i,e);
    }

    i = 3,e = 4;
    if(ListInsert(L,i,e)) {
        printf("在第%d个位置插入%d成功\n",i,e);
    } else {
        printf("在第%d个位置插入%d失败\n",i,e);
    }
    i = 3,e = 3;
    if(ListInsert(L,i,e)) {
        printf("在第%d个位置插入%d成功\n",i,e);
    } else {
        printf("在第%d个位置插入%d失败\n",i,e);
    }
    i = 5,e = 0;
    if(ListInsert(L,i,e)) {
        printf("在第%d个位置插入%d成功\n",i,e);
    } else {
        printf("在第%d个位置插入%d失败\n",i,e);
    }
    PrintSLinkList(L);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值