数据结构再学习--数组实现链表

链表一般情况下都是用指针实现的,但是某些语言根本没有提供指针操作,我们可以用数组模拟出来。如下,定义了一个结构体。包含了一个nextIdx表示在数组中下一个元素的位置,data表示存储的数据。在把这个结构体组成的数组定义为一种数据结构,数组中第0位不存数据,它的nextIdx表示下一个新的节点的索引。数组中最后一个元素也不存内容,它的nextIdx存储的是链表的头结点在数组中的索引,data表示的是当前数组中有多少个元素。下面是实现的增删改查。

github代码地址:https://github.com/xiaobai1993/XBDataStructNote


#include "XBStaticLink.h"

//------------索引从1 开始


//获取一个备用节点的下标
int XBGetNewIdx (XBStaticLinkList list)
{
    int i = list[0].nextIdx;//获取新元素的下标
    if (list[0].nextIdx<MAX_SIZE-1) {
        list[0].nextIdx = list[i].nextIdx;//更新备用节点的位置,所以必须保证list[i].next是没有用过的
    }
    return i;
}

void initXBStaticList(XBStaticLinkList sList)
{
    int i=0;
    for ( i =0; i<MAX_SIZE-1; i++) {//sList[0]不存数据。sList[0].data 表示的是新元素插入的索引位置
        
        sList[i].nextIdx=i+1;
    }
    sList[MAX_SIZE-1].nextIdx=0;//最后一个设置为0表示第一个插入的元素位置是0,也可以设置为其他的,startIdx.
    sList[MAX_SIZE-1].data=0;//保存当前的数目
    /**
     sList[MAX_SIZE-1].cur=startIdx;
     则sList[startIdx].data 用来存储下一个要插入数据的节点,但是把首尾单独操作比较方便。所以这样设置
     此时sList[i].nextIdx = 0 和 尾部指针相同,所以可以表示数据为空
     */
}

int isXBLinkStaticEmpty(XBStaticLinkList sList)
{
    return sList[MAX_SIZE-1].data==0;//表示数组里面的没有数据
}

int addItemToXBStaticLinkList(XBStaticLinkList  sList,DATATYPE obj)
{
   int newIdx = XBGetNewIdx(sList);//获取一个新的节点
   if (newIdx<MAX_SIZE-1) {//表示没有满,
        sList[newIdx].data=obj;//进行插入
        //更新末尾指针的位置
        sList[0].nextIdx=sList[newIdx].nextIdx;
        sList[MAX_SIZE-1].nextIdx= 1;//
        sList[MAX_SIZE-1].data++; //更新数目
        return SUCCESS;
    }
    return FAIL;
}

void clearXBStaticLinkList(XBStaticLinkList  sList)
{
    while (!isXBLinkStaticEmpty(sList)) {
        
        deleteItemInXBStaticLinkList(sList, sList[MAX_SIZE-1].data);
    }
}

int getItemFromXBStaticLinkListByIndex(XBStaticLinkList sList,int idx,DATATYPE * obj)
{
    if (!isXBLinkStaticEmpty(sList)) {
        
        int startIdx = sList[MAX_SIZE-1].nextIdx;;
        int i =1;
        while (i<=sList[MAX_SIZE-1].data) {
            
            if (i==idx ) {
                *obj = sList[startIdx].data;
                break;
            }
            startIdx = sList[startIdx].nextIdx;
            i++;
        }
        
    }
    return FAIL;
}

int findItemInXBStaticLinkList(XBStaticLinkList sList,DATATYPE obj)
{
    if (!isXBLinkStaticEmpty(sList)) {
        
        int startIdx = sList[MAX_SIZE-1].nextIdx;
        int endIdx = sList[0].nextIdx;
        int i =1;
        while (startIdx!=endIdx) {
            
            if (sList[startIdx].data==obj) {
                return i;
            }
            startIdx = sList[startIdx].nextIdx;
            i++;
        }
        return FAIL;
    }
    return FAIL;
}

int insertItemInXBStaticLinkList(XBStaticLinkList sList,int idx,DATATYPE obj)
{
    
    if (idx<1||idx>getLengthForXBStaticLinkList(sList)) {
        return FAIL;
    }
    if (sList[MAX_SIZE-1].nextIdx == 0) {//
        
        return FAIL;
    }
    int i = XBGetNewIdx(sList);//现在最后边找一个节点
    if (i<MAX_SIZE-1) {
       sList[i].data = obj;
        //寻找节点的位置
        int k= 1;
        int tempNext = MAX_SIZE-1;
        while (tempNext!=sList[0].nextIdx&&k<idx) {
            
            tempNext = sList[tempNext].nextIdx;
            k++;
        }
        sList[i].nextIdx = sList[tempNext].nextIdx;//把当前节点的下一个节点的位置赋值给新节点
        sList[tempNext].nextIdx = i;//更新新的位置的索引
        sList[MAX_SIZE-1].data++;//
        return SUCCESS;
    }
    return FAIL;
}

//释放一个节点
void Free_SSL (XBStaticLinkList slist,int k)
{
    slist[k].nextIdx = slist[0].nextIdx;//保留最新元素的位置
    slist[0].nextIdx = k;//把将要删除的位置留给slist[0],表示这个位置是以后有元素来了要占据这个位置
}
int deleteItemInXBStaticLinkList(XBStaticLinkList sList,int idx)
{
    int j,k=1;
    if (idx < 1 || idx> getLengthForXBStaticLinkList(sList)) {
        return FAIL;
    }
    int tempNext = MAX_SIZE-1;
    while (tempNext!=sList[0].nextIdx&&k<idx) {
        
        tempNext = sList[tempNext].nextIdx;
        k++;
    }
    j = sList[tempNext].nextIdx;//删除保留下一个元素
    sList[tempNext].nextIdx = sList[j].nextIdx;
    
    sList[MAX_SIZE-1].data--;//数目总数要减一
    Free_SSL(sList,j);
    return SUCCESS;
}

// 返回里面数据元素的个数
int getLengthForXBStaticLinkList(XBStaticLinkList sList)
{
    return sList[MAX_SIZE-1].data;
}

void printXBStaticLinkList(XBStaticLinkList sList)
{
    int startIdx = sList[MAX_SIZE-1].nextIdx;
    printf("数据:\n");
    int i = 1;
    while (i<=sList[MAX_SIZE-1].data) {
        printf("%d ",sList[startIdx].data);
        startIdx = sList[startIdx].nextIdx;
        i++;
    }
    putchar('\n');
}

int replaceXBStaticLinkList(XBStaticLinkList sList,int idx,DATATYPE obj)
{
    int startIdx = sList[MAX_SIZE-1].nextIdx;
    if (idx>sList[MAX_SIZE-1].data&&idx<1) {
        return FAIL;
    }
    int i =1;
    while (i<=sList[MAX_SIZE-1].data) {
        if (idx==i) {
            sList[startIdx].data = obj;
            return SUCCESS;
        }
        startIdx = sList[startIdx].nextIdx;
        i++;
    }
    return FAIL;
}
void testXBStaticList()
{
    
    XBStaticLinkList list;
    initXBStaticList(list);
    //插入元素
    printf("开始添加元素:\n");
    for (int i = 0; i<5; i++) {
       
        addItemToXBStaticLinkList(list, (DATATYPE)(10+i));
    }
    printXBStaticLinkList(list);
    
    printf("查找元素12所在的位置 %d \n",findItemInXBStaticLinkList(list,12));

    printf("在索引为1的位置插入元素100:\n");
    insertItemInXBStaticLinkList(list, 1, 100);
    insertItemInXBStaticLinkList(list, 1, 100);

    printXBStaticLinkList(list);
//    printf("线性表当前的长度: %d \n",get(arrayList));
    
    printf("删除索引为3的位置的元素:\n");
    deleteItemInXBStaticLinkList(list, 3);//(list, 3);
    
    printXBStaticLinkList(list);
    int x ;
    printf("获取2号位置的元素的值:\n");
    getItemFromXBStaticLinkListByIndex(list, 2, &x);
    //get(arrayList, 2, &x);
    printf("%d \n",x);
    
    printf("替换3号位置的元素为89:\n");
    replaceXBStaticLinkList(list, 3, 89);//
    printXBStaticLinkList(list);
    
    clearXBStaticLinkList(list);
    printf("清空后:\n");
    printXBStaticLinkList(list);

}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值