《数据结构》C语言版 静态链表的基本操作实现

#include <stdio.h>

#define MAXSIZE 1000

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int ElemType;


typedef struct {
    ElemType data;
    int cur;
}component, StaticLinkList[MAXSIZE];


// 初始化一个静态链表
void InitList(StaticLinkList &space)
{
    int i;
    for (i = 0; i < MAXSIZE - 1; i++)
    {
        space[i].cur = i + 1;
    }
    space[MAXSIZE].cur = 0;//链表最初的第一个元素下标为0
}

void CreateList(StaticLinkList space)
{
    int n, i;
    printf("请输入链表的长度:");
    scanf_s("%d", &n);
    for (i = 1; i <= n; i++)//从下标1开始输入内容
    {
        printf("请输入数据:");
        scanf_s("%d", &space[i].data);
        space[0].cur = space[i].cur;//0位置记录下一个空闲位置下标
    }
    space[i - 1].cur = 0;
    space[MAXSIZE - 1].cur = 1;//记录链表第一个元素的下标
}

int ListLength(const StaticLinkList space)
{
    int i, k, m = 0;
    k = MAXSIZE - 1;
    while (space[k].cur)
    {
        k = space[k].cur;
        m++;
    }
    return m;
}

void GetElemType(const StaticLinkList space)//按位置查找元素
{
    int n, i, k;
    printf("请输入查找元素的位置:");
    scanf_s("%d", &n);
    if (n<1 || n>space[0].cur - 1)
    {
        printf("查找位置异常,查找失败!\n");
        return;
    }
    k = space[MAXSIZE - 1].cur;
    for (i = 1; i < n; i++)
    {
        k = space[k].cur;
    }
    printf("第%d位置上的元素为:%d", n, space[k].data);
}

void FindList(StaticLinkList space)//按元素查找
{
    int n, k, i, m = 1;
    printf("请输入查找的内容:");
    scanf_s("%d", &n);
    k = space[MAXSIZE - 1].cur;
    for (i = 1; i <= ListLength(space); i++)
    {
        if (space[k].data == n)
        {
            printf("所查找的元素在位置:%d\n", m);
            return;
        }
        m++;
        k = space[k].cur;
    }
    printf("没有查找到!\n");
}

int Malloc_List(StaticLinkList space)//模拟创建节点,返回的是节点的下标
{
    int i;
    i = space[0].cur;
    space[0].cur = space[i].cur;
    return i;
}

void ListInsert(StaticLinkList space)//插入链表
{
    int k, n, i, j;
    printf("请输入插入的位置:");
    scanf_s("%d", &n);
    if (n<1 || n>space[0].cur)
    {
        printf("插入位置异常,插入失败!\n");
        return;
    }
    if (ListLength(space) == MAXSIZE - 1)//如果链表满了
    {
        printf("静态链表已满,插入失败!\n");
        return;
    }
    k = MAXSIZE - 1;
    j = Malloc_List(space);
    for (i = 1; i < n; i++)
        k = space[k].cur;
    space[j].cur = space[k].cur;
    space[k].cur = j;
    printf("请输入插入的数据:");
    scanf_s("%d", &space[j].data);
}

void FreeList(StaticLinkList space, int k)//模拟释放节点
{
    space[k].cur = space[0].cur;
    space[0].cur = k;
}

void DeleteList(StaticLinkList space)//删除节点
{
    int n, i, k, j;
    printf("请输入删除的位置:");
    scanf_s("%d", &n);
    if (n<1 || n>ListLength(space))
    {
        printf("删除的位置异常,删除失败!\n");
        return;
    }
    k = MAXSIZE - 1;
    for (i = 1; i < n; i++)
        k = space[k].cur;
    j = space[k].cur;
    space[k].cur = space[j].cur;
    FreeList(space, j);
}

void OutputList(const StaticLinkList space)//输出链表
{
    int i, k;
    k = MAXSIZE - 1;
    for (i = 1; i <= ListLength(space); i++)
    {
        k = space[k].cur;
        printf("%d\n", space[k].data);
    }
}

int main()
{
    StaticLinkList List;

    InitList(List);
    CreateList(List);
    ListInsert(List);
    DeleteList(List);
    ListLength(List);
    FindList(List);
    OutputList(List);
    GetElemType(List);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值