静态链表

来源:互联网 发布:什么是源码销售 编辑:程序博客网 时间:2024/06/15 19:10

今天下午学了一下午静态链表,花了将近两个小时才将静态链表学会。

静态链表的思想就是通过数组来模拟单链表的运行。以数组的下标来模拟指针的操作,因此又名游标实现法

首先建立一个包含两个基本性质的元素,num和cur,num表示该链表每个单元中的储存数字,cur表示游标。


规定:

1.把未使用的位置视为备用链表。

2.把链表第1个位置(即下标为零处)视为备用链表的头指针,其游标指向第一个未使用位置的下标(如上图中下标为0处的为5的游标),数组最后一个元素(即数组最大限度处)视为储存数据的链表的头指针,其游标指向被第一个储存的数据的下标(即下标为999处的数字为1的游标)。

3.将两个链表最后一个元素的游标标记为0。

4.对这两处起头指针作用的数组位置来说,这两处不储存数字。

#include <stdio.h>#include <stdlib.h>#define true 1#define false 0#define MAX_SIZE 1000 // 储存链表的最大限度typedef int bool;typedef int ElemType;//定义静态链表的基本单元与表的基本框架typedef struct{    int num;    int cur;}Node;
//初始化链表,因为链表的处理都是通过游标与下标的关系进行的,所以需要初始化各个位置上的游标,建立游标与下标的关系。
//第一步要将链表从i = 0到MAX_SIZE - 2该范围内的各个值都赋成i + 1;第二步将数组最后一个元素的游标指向第一个元素(因数组为空)
void InitList(Node L[]){    int i;    for(int i = 0; i < MAX_SIZE - 2; ++i)    {        L[i].cur = i + 1;    }    L[MAX_SIZE - 1].cur = 0;}//验证链表是否为空bool ListEmpty(Node L[]){    if(L[MAX_SIZE - 1] = 0)    {        return true;    }    return false;}//清除整个链表void ClearList(Node L[]){    int i = L[MAX_SIZE - 1].cur;    L[MAX_SIZE - 1].cur = 0;        int k = L[0].cur;    L[0].cur = i;        int j;    while(i)    {        j = L[i].cur;        i = L[i].cur;    }    L[j] = k;}//获取储存链表中某位置上的元素void GetElem(Node L[], int i, ElemType *key){    int j = 1;    int pos = L[MAX_SIZE - 1];    while(L[pos].cur&& j < i)    {        pos = L[pos].cur;        j++;    }    if(j > i|| !L[pos].cur)    {        return false;    }    *key = L[pos].num;}//在链表中定位某个元素的位置int LocateElem(Node L[], ElemType e){    int j = 1;    int pos = L[MAX_SIZE - 1];    while(L[pos].cur&& e != L[pos].num)    {        j++;        pos = L[pos].cur;    }    if(e != L[pos].num)    {        return 0;    }    else    {        return j;    }}//获取链表的长度int GetLen(Node L[]){    int j = 1, pos = L[MAX_SIZE - 1];    while(L[pos].cur)    {        j++;        pos = L[pos].cur;    }    return j;}//获取数组中的未被利用的位置int Malloc(Node L[]){    int i = L[0].cur;    if(L[0].cur)    {        L[0].cur = L[i].cur;    }    return i;}//向链表某位置上插入一个元素int ListInsert(Node L[], int index, ElemType e){    if(index < 1|| index > Getlen(L)) return false;//如果插入的位置不在链表大小范围内,则失败    int n, mov, i;    mov = MAX_SIZE - 1;    n = Malloc(L);//找到第一个未用的位置并将位置为0的游标设置为备用链表的下一个位置的下标    if(n)    {        L[n].num = e;        for(i = 1; i < index; ++i)            mov = L[mov].cur;        L[n].cur = L[mov].cur;        L[mov].cur = n;        return true;    }//调节相关位置的游标使新插入的元素插入到了正确位置。    return false;}//将链表中某个位置上的元素释放,将之归为备用数组中void Free(Node L[], int pos){    L[pos].cur = L[0].cur;    L[0].cur = pos;}//删除链表中某个位置上的元素int ListDelete(Node L[], int i, ElemType *e){    if(i < 1|| i > GetLen(L)) return false;    int pos = L[MAX_SIZE - 1].cur, j = 1;    for(; j < i - 1; j++)    {        pos = L[pos].cur;    }    int mid = L[pos].cur;    L[pos].cur = L[mid].cur;    Free(L, mid);    return true;}int main(){    Node List[MAX_SIZE];}