静态链表的基本操作

0、宏定义以及静态链表结点结构体

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;


#define MAXSIZE 1000
#define OK 0
#define error 1 
typedef int Status;
typedef int ElemType;

//静态链表结构体 
typedef struct component
{
    ElemType data;//数据 
    int cur;      //游标(cursor) 
}component,StaticList[MAXSIZE];



1、静态链表的初始化
Status  InitList(StaticList space)
{
    int i;
    for(i=0;i<MAXSIZE;i++)
    space[i].cur=i+1;
    space[MAXSIZE-1].cur=0;//逻辑上最后一个节点的游标是0 

    return OK;

}

2、定位元素

//在静态链表中定位元素位序 
//元素存在则返回元素的位序,不存在则返回0 
Status LocateElem (StaticList S,ElemType e)
{
    i=S[MAXSIZE-1].cur;
    while(i&&S[i].data!=e)
    i=S[i].cur;
    return i;   
} 

3、向备用链表中申请空间

//跳过一个空闲分量并获取它的下标,头游标获得下一个空闲分量的下标(头游标永远是下一个空闲分量的位置)
//当游标指向下一个空闲位置时,先前头游标标出的位置已经可以使用 
Status Malloc_SLL(StaticList space)
{
    int i=space[0].cur;
    if(i)//总会有一个时刻space[0].cur会为0 
    {
        space[0].cur=space[i].cur;
    }
    return i;
} 

4、获取静态链表中元素个数

int ListLength(StaticList L)
{
    int k=MAXSIZE-1;
    k=L[k].cur;
    int i=0;
    while(k!=0)
    {
       i++;
       k=L[k].cur;

    }
    return i;
} 

5、插入一个元素

Status ListInsert(StaticList L, int i,ElemType e)
{
    int j,k,i;//待使用的整型变量  
    k=MAXSIZE-1;//最后一个元素的下标指向逻辑顺序上第一个有元素的结点的下标 
    if(i)(i<1||i>ListLenth(L)+1)
    {
        return error;
    } 
    j=malloc(L);
    if(j)
    { 
        L[j].data=e;
        for(i=1;i<1;i++)
        {
            k=L[k].cur;
        }//循环结束后k的值即为插入位置前驱的下标 
        L[j].cur=L[k].cur;
        L[k].cur=j;//实现在逻辑顺序上的插入
        //注意:当n为1时会引起L[MAX-1]的游标发生变化
        return OK; 
    } 
    return error;
} 

6、删除一个元素

void free_SL(StaticList &L, int k)
 {
    //将下标为k的空闲结点回收到备用链表 
    L[k].cur=L[0].cur;//保持备用链表的逻辑结构
    L[0].cur=k; 
 } 

 Status delete_SL(StaticList &L,int n)
 {
    int i,j,k;
    if(n<1||n>ListLength(L)+1)
    return error;

    k=MAXSIZE-1;
    for(i=0;i<n-1;i++)
    k=L[k].cur;//循环结束后k的值为要删除元素逻辑上的前驱的下标

    j=L[k].cur;//要回收的结点的下标

    L[k].cur=L[j].cur;//先把要回收的结点跳过去
    free_SL(L,j);

    return OK; 
     }

7、遍历线性表

int visit(ElemType e); 

Status Taverse(StaticList L,int(*f)(ElemType e))
{
    int k=MAXSIZE-1;
    k=L[k].cur;
    while(k)
    {
      f(L[k].data);
      k=L[k].cur;
    }
    return 0;
}


int visit(ElemType e)
{
    printf("%d\n",e);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/BruthYU/article/details/52769598