数据结构1.2双链表循环链表以及静态链表

双链表

双链表即在单链表的基础上,对每一个结点增加一块“前指针域”,即每个结点均为“前指针域-数据域-后指针域”的格式,前指针域指向其前一个结点的地址,这样就改变了单链表无法通过一个结点查找上一结点的缺陷。

循环链表

循环链表又分为单向循环链表和双向循环链表

单向循环链表

单向循环链表指在单链表的基础上,将最后一位结点的指针域由NULL改为指向头结点,这样就可以通过循环从任意点出发访问到表中所有结点,而此时在程序中的循环条件则应从p或p->NULL是否为空改为判断其是否指向头结点。

双向循环链表

双向循环链表指在双链表的基础上将最后一位结点的指针域指向头结点,头结点的前指针域指向最后一位结点,同样将循环条件改为判断其是否指向对应结点

:循环链表的结点类型与对应非循环链表的类型完全相同,操作也基本一致。

静态链表

不通过指针而是数组来实现链表的操作存取。
其数组定义如下

typedef int ElemType
#define MAXSIZE 100
typedef struct node{
Elemtype data;
int cur;
}sta[MAXSIZE];

用这种类型描述的线性表,在作线性表的插入和删除操作时不需移动元素,仅需修改指针(游标),具有链式存储结构的主要优点,为与指针型链表相区别,将其称为静态链表。
在静态链表中,数组的第一个分量是备用链表头结点,备用链表中的结点为数组中未被使用的分量,数组第二个分量是链表头结点,头结点中的游标(cur)值为第一个结点的下标,若链表中第i个结点的下标为k,则其游标值就是第i+1个结点的下标。游标值为0的结点是链表尾结点或备用链表尾结点。

我的静态链表插入数据的实现

#include <stdio.h>
#define MAXSIZE 100

typedef struct node{//结点定义
    int data;
    int cur;
}sta[MAXSIZE];
void initlist(sta space){//建立一个空的静态链表space
    int i;
    for(i = 0;i < MAXSIZE - 1;i++){
        space[i].cur = i + 1;
    }
    space[MAXSIZE - 1].cur = 0;
}
int allocnode(sta space){//获取结点函数
    int i;
    i = space[0].cur;
    if(i == 0){
        return 0;
    }else{
        space[0].cur = space[i].cur;
        return i;
    }
}
int creat1(sta space,int n){//建立一个含有n个结点的静态链表head
    int head,k,s,i;
    k = head = allocnode(space);
    printf("请输入你想要存储的数据:\n");
    for(i = 1;i <= n;i++){
        s = allocnode(space);
        scanf("%d",&space[s].data);
        space[k].cur = s;
        k = s;
    }
    space[k].cur = 0;
    return head;
}
void list(sta space,int head){//输出函数
    int i;
    i = space[head].cur;
    while(i != 0){
        printf("%4d ",space[i].data);
        i = space[i].cur;
    }
    printf("\n");
}
int insert(sta space,int head,int i,int x){//插入数据
    int  j,k,m;
    if(i < 1)return 0;
    k = head;
    j = 0;
    while(k != 0 && j < i - 1){
        j++;
        k = space[k].cur;
    }
    m = allocnode(space);
    if(m != 0){
        space[m].data = x;
        space[m].cur = space[k].cur;
        space[k].cur = m;
        return 1;
    }else{
        return 0;
    }
}
int main() {
    int n,x,s,head;
    sta space;
    initlist(space);
    printf("建立一个含n个结点的静态链表,n = ");
    scanf("%d",&n);
    head = creat1(space,n);
    printf("当前静态链表所含数据依次输出为:");
    list(space,head);
    printf("请输入你想要插入的位序及数据:");
    scanf("%d %d",&x,&s);
    if(insert(space,head,x,s)){
    printf("当前静态链表所含数据依次输出为: ");
    list(space,head);
    }else{
        printf("输入不合理");
    }
    return 0;
}

静态链表的难度较大,较难理解,还需多加练习

猜你喜欢

转载自blog.csdn.net/weixin_43451616/article/details/86426369
今日推荐