您的位置:首页 > 理论基础 > 数据结构算法

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

2016-06-09 00:13 615 查看
链表一般情况下都是用指针实现的,但是某些语言根本没有提供指针操作,我们可以用数组模拟出来。如下,定义了一个结构体。包含了一个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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: