C语言实现静态链表

2018-05-16  本文已影响0人  obsession_me

静态链表(单链表的一种形式)

有时,也可以借用一维数组来描述线性链表,我们称这种链表为静态链表

#define MAXSIZE 100
typedef struct{
    ElemType data; // 数据域
    int cur;       // 另一种形式的指针域
}component, SLinkList[MAXSIZE];

静态链表需要实现插入和删除操作的时候,需要用户自己实现mallocfree两个函数,因此,最好是用游标构成一个备用的链表。

#include <stdio.h>
#include <stdlib.h>

# define MAXSIZE 100
typedef int ElemType;
// 静态链表的定义
typedef struct{
    ElemType data;
    int cur;
}component, SLinkList[MAXSIZE];

// 使用 游标 链接出未使用的节点
void init_cur(SLinkList *L){
    for(int i=0;i<MAXSIZE-1;++i){
        (*L)[i].cur = i+1;
        // 我们应该要明白一点,传入的东西即是指向数组的指针的指针,因此,我们需要得到数组本身,对其进行取值。
        // *(L)[i].cur error; cause [] has higher priority than *
    }
    (*L)[MAXSIZE-1].cur=0;
}

int malloc_sq(SLinkList *L){
    int temp = (*L)[0].cur;  // 这个是L[0].cur我们通过对这个值来判断是否进入 满 的状态
    if (temp == 0){
        // 满,则返回0,即分配空间失败
    }else{
        (*L)[0].cur = (*L)[temp].cur;
    }
    printf("[allocate] %d\n", temp);
    return temp;
} 

void free_sq(SLinkList *L, int i){
    // free
    (*L)[i].cur = (*L)[0].cur;
    (*L)[0].cur = i;
    printf("[free] %d\n", i);
}

int main(){
    SLinkList sl;
    init_cur(&sl);
    for (int j=0; j<MAXSIZE; j++){
        printf("the cur of %d is:%d\n", j, sl[j].cur);
    }
    // 测试malloc
    for (int i=0; i<MAXSIZE; i++){
        int j = malloc_sq(&sl);
        if (j != 0){
            sl[j].data = 9699;
        }else{
            printf("the static linklist is full, in this state the value of j is:%d\n", j);
        }
    }
    free_sq(&sl, 20);
    malloc_sq(&sl);
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读