静态链表(查找、插入)

 写的时候进入了一个逻辑误区,认为对应的游标可以是对应的第几位元素,但游标只是指向下一位数组的位置,所以需要另外设置计数。

自设静态链表
数组下标数据元素游标(下一位数据元素的数组下标)
032
163
251
324
48-1

按位序依次是  3、5、6、2、8

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10      //静态链表的最大长度

//0号结点充当“头结点”,游标为-1表示已经到达表尾,游标充当指针

//定义方式1——王道课程
struct Node{            //静态链表结构类型的定义
    int data;      //存储数据元素
    int next;           //下一个元素的数组下标
};

//定义方式2——王道教材
typedef struct LinkList{
    int data;
    int next;
}SLinkList[MaxSize];

//初始化静态链表(把a[0]的next设为-1)
void InitSLinkList(SLinkList &a){
    a[0].next = -1;
    a[0].data = 0;
    for(int i=0; i<MaxSize; i++){
        a[i].data = 0;
        a[i].next = -2;     //表示空数据
    }
}

//插入数据
bool CreateSLinkList(SLinkList &a, int n){
    int b, c;   //过渡数据
    printf("请依照‘数据元素 下一个数据元素的位置’的格式输入数据\n");
    printf("ps:最后一位数据元素的下一个元素位置请输入-1\n");
    for(int i=0; i<n; i++){
        if(a[i].next == -2) {
            scanf("%d %d", &b, &c);
            a[i].data = b;
            a[i].next = c;
        }
        else
            return false;
    }
}

void PrintSLinkList(SLinkList a, int n){
    printf("静态链表的数据为:\n");
    for(int i=0; i<n; i++)
        printf("%d   数据元素:%d   游标:%d  \n", i, a[i].data, a[i].next);
}

//查找,从头结点出发挨个往后遍历结点,插入位序为i的结点
/*
    找到一个空的结点,存入数据元素(如何判断结点是否为空:可让next为某个特殊值,如-2)
    从头结点出发找到位序为i-1的结点
    修改新结点的next
    修改i-1号节点的next
*/
//查找静态链表位序第i位的数据元素
bool SearchElem(SLinkList a, int n, int i, int &e){
    if(i<1 || i>n)
        return false;
    int j=0;
    int count =1;
    if(i == 1){
        e = a[j].data;
        return true;
    }

    while(count != i){
        j = a[j].next;
        count++;
    }

    e = a[j].data;
    return true;
}

//返回第i位位序的下表
void ReSubscripts(SLinkList a, int i, int &s){
    int count=1;
    s = 0;
    while (count !=i){
        s = a[s].next;
        count++;
    }
}

//插入静态链表
bool InsertElem(SLinkList &a, int i, int e, int &n){    //(静态链表,位序,元素,链表元素个数)
    if(n>MaxSize || n==MaxSize)
        return false;
    if(i<1 || i>n)
        return false;
    a[n].data = e;
    int s;
    ReSubscripts(a, i, s);
    a[n].next = a[s].next;
    a[s].next = n;
    n++;
    return true;
}


int main(){
    int n;  //数据元素个数
    int i;  //位序——查找
    int e = 0;  //返回的数据元素
    int k;  //位序——插入
    SLinkList a;
    InitSLinkList(a);

    printf("请输入你要输入的数据元素个数(不超过10个):");
    scanf("%d", &n);
    if(n<1 || n>10)
    {
        printf("输入错误!\n");
        return false;
    }

    if(CreateSLinkList(a, n))
        PrintSLinkList(a, n);
    else
        printf("数据插入失败\n");

    int flag = 1;
    while (flag){
        printf("请输入查找的静态链表的位序:");
        scanf("%d", &i);
        if(SearchElem(a, n, i, e))
            printf("查找的第%d位的数据元素为%d \n", i, e);
        else
            printf("查找失败\n");

        printf("请问是否需要继续查找,继续输入1,停止输入0 :");
        scanf("%d", &flag);
        continue;
    }

    flag = 1;
    while(flag){
        printf("\n请输入你想插入的位序和元素,格式:位序 元素\n");
        scanf("%d %d",&k, &e);
        if(InsertElem(a, k-1, e, n)){
            printf("数据插入成功");
            PrintSLinkList(a, n);
        }
        else
            printf("插入失败");

        printf("请问是否需要继续查找,继续输入1,停止输入0 :");
        scanf("%d", &flag);
        continue;
    }

    return 0;
}

运行结果

请输入你要输入的数据元素个数(不超过10个):5
请依照‘数据元素 下一个数据元素的位置’的格式输入数据
ps:最后一位数据元素的下一个元素位置请输入-1
3 2
6 3
5 1
2 4
8 -1
静态链表的数据为:
0   数据元素:3   游标:2
1   数据元素:6   游标:3
2   数据元素:5   游标:1
3   数据元素:2   游标:4
4   数据元素:8   游标:-1
请输入查找的静态链表的位序:2
查找的第2位的数据元素为5
请问是否需要继续查找,继续输入1,停止输入0 :0

请输入你想插入的位序和元素,格式:位序 元素
3 18
数据插入成功静态链表的数据为:
0   数据元素:3   游标:2
1   数据元素:6   游标:3
2   数据元素:5   游标:5
3   数据元素:2   游标:4
4   数据元素:8   游标:-1
5   数据元素:18   游标:1
请问是否需要继续查找,继续输入1,停止输入0 :0

Process returned 0 (0x0)   execution time : 31.952 s
Press any key to continue.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

『F╰お╯X』

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值