静态链表

来源:互联网 发布:java电脑版86 编辑:程序博客网 时间:2024/06/16 09:15



/*静态链表要点: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 1000bool 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;}