数据结构 静态链表

做一个豁达而努力的自己。

静态链表的定义:用数组来代替指针数组元素,由data和cur组成,data为数据域,cur代替next指针存放的是下一个后继节点的下标,称cur为游标,用数组描述的链表成为静态链表。

顺序表的静态链表存储结构:

#define MAXSIZE 1000

typedef struct Node    //这里必须加结构体名称,不加的话只能在主函数声明一个结构体数组,不能在其它函数参数里声明

{

    ElemType data;

    int cur;

}StaticLinkList[MAXSIZE];    

要点:数组的第一个元素和最后一个元素作为特殊元素处理,不存放数据;我们把未使用过的元素称为备用链表;数组第一个元素的cur存放的则是备用链表第一个节点的下标,最后一个元素则存放的是第一个有数值元素的下标,相当于头结点。

静态链表的优缺点:优点是在插入和删除时,自己只需要修改游标,,,缺点是没能解决连续分配空间带来表长难确定,失去了随机存取的特性。

代码:

#include <iostream>
#include <cstdlib>
using namespace std;

#define MAXSIZE 1000
typedef struct Node
{
    int data;   //数据域
    int cur;    //游标
}StaticLinkList[MAXSIZE];
//静态链表的初始化
void InitList(StaticLinkList space)
{
    int i;
    for(i = 0; i < MAXSIZE - 1; i++)
        space[i].cur = i + 1;
    space[MAXSIZE - 1].cur = 0; //个人觉得这里完全可以改为1,因为创建的时候也是要改为1的,,,
}
//静态链表的创建
void CreateLink(StaticLinkList space)
{
    int n, mov;
    mov = MAXSIZE - 1;
    space[mov].cur = 1;
    cout << "请输入元素个数:";
    cin >> n;
    cout << "输入int型数据:" << endl;
    while(n--)
    {
        mov = space[mov].cur;
        cin >> space[mov].data;
    }
    space[0].cur = space[mov].cur;
    space[mov].cur = 0;
}
//静态链表的输出
void PutList(StaticLinkList space)
{
    int mov;
    mov = MAXSIZE - 1;
    while(space[mov].cur)
    {
        mov = space[mov].cur;
        cout << space[mov].data << endl;
    }
}
//为静态链表分配备用空间
int MallocspaceList(StaticLinkList space)
{
    int i;
    i = space[0].cur;
    if(space[0].cur)
        space[0].cur = space[i].cur;
    return i;
}
//静态链表的长度
int LengthList(StaticLinkList space)
{
    int mov, i;
    mov = MAXSIZE - 1;
    i = 0;
    while(space[mov].cur)
    {
        mov = space[mov].cur;
        i++;
    }
    return i;
}
//静态链表的插入
bool InsertList(StaticLinkList space, int i, int e)
{
    if(i < 1 || i > LengthList(space))
        return false;
    int n, mov;
    mov = MAXSIZE - 1;
    n = MallocspaceList(space);
    if(n)
    {
        space[n].data = e;
        for(int j = 1; j < i; j++)
            mov = space[mov].cur;
        space[n].cur = space[mov].cur;
        space[mov].cur = n;
    }
    return true;
}
//为静态链表释放节点
void FreeList(StaticLinkList space, int n)
{
    space[n].cur = space[0].cur;    //将第一个备用节点连接到释放节点的后面
    space[0].cur = n;   //数组第一个元素的cur存放要释放节点的下标
}
//静态链表的删除
bool DeleteList(StaticLinkList space, int i)
{
    if(i < 1 || i > LengthList(space))
        return false;
    int mov, n;
    mov = MAXSIZE - 1;
    for(int j = 1; j < i; j++)
        mov = space[mov].cur;
    n = space[mov].cur; //获取删除节点的下标
    space[mov].cur = space[n].cur;  //将要删除的节点的前一个与后一个节点连接起来
    FreeList(space, n); //释放节点
    return true;
}
//静态链表的读取
bool GetList(StaticLinkList space, int i, int &e)
{
    if(i < 1 || i > LengthList(space))
        return false;
    int mov;
    mov = MAXSIZE - 1;
    for(int j = 1; j <= i; j++)
        mov = space[mov].cur;
    e = space[mov].data;
    return true;
}
//菜单
void menu()
{
    cout << "1.静态链表的初始化" <<endl;
    cout << "2.静态链表的创建" <<endl;
    cout << "3.静态链表当前的长度" <<endl;
    cout << "4.静态链表的读取" <<endl;
    cout << "5.静态链表的插入" <<endl;
    cout << "6.静态链表的删除" <<endl;
    cout << "7.静态链表的输出" <<endl;
    cout << "0.退出静态链表" <<endl;
}
int main()
{
    StaticLinkList space;
    int i, e, n, num = -1;
    while(num)
    {
        system("cls");
        menu();
        cout << "请输入选项:";
        cin >> num;
        switch(num)
        {
            case 1: InitList(space);
                    cout << "初始化成功" << endl;
                    break;
            case 2: CreateLink(space);
                    cout << "创建成功" << endl;
                    break;
            case 3: cout << "当前静态链表的长度为:" << LengthList(space) << endl;
                    break;
            case 4: cout << "请输入要读取的位置:";
                    cin >> i;
                    n = GetList(space, i, e);
                    if(n == 0)
                        cout << "读取失败" << endl;
                    else
                        cout << "数据为:" << e << endl;
                    break;
            case 5: cout << "请输入要插入的位置:";
                    cin >> i;
                    cout << "请输入要插入的int型元素:";
                    cin >> e;
                    n = InsertList(space, i, e);
                    if(n == 0)
                        cout << "插入失败" << endl;
                    else
                        cout << "插入成功" << endl;
                    break;
            case 6: cout << "请输入要删除的位置:";
                    cin >> i;
                    n == DeleteList(space, i);
                    if(n == 0)
                        cout << "删除失败" << endl;
                    else
                        cout << "删除成功" << endl;
                    break;
            case 7: cout << "数据元素:" << endl;
                    PutList(space);
            case 0: break;
            default : cout << "没有所选项" << endl;
        }
        system("pause");
    }
    return 0;
}

转载于:https://www.cnblogs.com/KogetsuChida/p/10410008.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值