静态链表



/*
静态链表

要点:
mylist[]中第一个和最后一个不使用(即是不用来储存数据),mylist[0]储存备用链表第一个元素
mylist[maxsize-1]储存备用链表第一个储存数据得结点,即是首结点
然后静态表表最后一个结点的cur等于0
*/
#include<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
#include<stdlib.h>
#include<cmath>
#define OK 1
#define ERROR 0
#define maxsize 1000
bool flag=true;
using namespace std;

typedef int status;
typedef int ElemType;
typedef struct List
{
    ElemType data;//储存数据
    int cur;//储存游标(cursor)
} Conponent,mylist[maxsize];
status initList(mylist &L)
{
    int i;
    for(i=0; i<maxsize-1; i++)
        L[i].cur=i+1;//这样是使链表空间连起来,方彪以后的插入和删除
    L[maxsize-1].cur=0;//首结点下标为0说明链表为空
    return OK;
}
int getlength(mylist L)
{
    int i=0,j,k;
    k=L[maxsize-1].cur;
    while(k)
    {
        i++;
        k=L[k].cur;
    }
    return i;
}
status insertList(mylist &L,int x,ElemType e)
{
    int i,j,k;
    k=L[maxsize-1].cur;
    //这里flag是全局变量,因为第一次插入该链表时,情况有点特殊,所以用flag来判断是否是首次插入
    if(flag) {
        L[maxsize-1].cur=1;
        L[1].cur=0;//首次插入结点为下标1的结点,将其cur赋为0
        L[1].data=e;
        L[0].cur=2;
        flag=false;
        return OK;
    }
    else
    {
        if(x<1||x>getlength(L)+1)//这里很重要,因为我们插入规定插到第x个位置前,所以x的值可能比getlength(L)大
            return ERROR;

        j=L[0].cur;
        L[0].cur=L[j].cur;
        L[j].data=e;//以上这三句是在设置保存插入值e的空间

        i=1;
        while(i<=getlength(L)&&i<x-1)
        {
            k=L[k].cur;
            i++;
        }
        if(i>getlength(L))return ERROR;//以下是将保存了e的空间与链表关联起来     
           L[j].cur=L[k].cur;
        L[k].cur=j;
    }
    return OK;
}

status deleteList(mylist &L,int x)
{
    int i,j,k;
    k=L[maxsize-1].cur;
    if(x<1||x>getlength(L))//对比以上插入操作,这里x最大为getlength(L)
        return ERROR;
    if(x==1)//删除首结点情况特殊需要单独判断
    {
        j=L[maxsize-1].cur;
        L[maxsize-1].cur=L[j].cur;

        L[j].cur=L[0].cur;
        L[0].cur=j;
        return OK;
    }
   else {
           i=1;
    while(i<=getlength(L)&&i<x-1)
    {
        k=L[k].cur;
        i++;
    }
    if(i>getlength(L))return ERROR;
    j=L[k].cur;
    L[k].cur=L[j].cur;

    L[j].cur=L[0].cur;
    L[0].cur=j;
    return OK;
    }
}
status traverseList(mylist L){
 int i=0,j,k;
    k=L[maxsize-1].cur;
    while(k)
    {
     printf("%d ",L[k].data);
        k=L[k].cur;

    }
    printf("\n");
    return OK;
}


int main()
{
int i,j,k;
mylist L;
initList(L);
for(i=1;i<10;i++)
    insertList(L,i,i);
traverseList(L);

deleteList(L,1);
traverseList(L);

deleteList(L,2);
traverseList(L);

deleteList(L,3);
traverseList(L);

insertList(L,3,100);

deleteList(L,2);
traverseList(L);

printf("%d\n",getlength(L));
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值