重学数据结构:静态链表的各种操作(C语言)

静态链表定义

#include <stdio.h>
#include <string.h>

#define maxSize 50

typedef struct
{
    int index;
    int data;
}StaticLink[maxSize];

初始化链表

void InitStaticLink(StaticLink L)
{
    L[0].index=-1;
    for (int i=1; i<maxSize; i++) {
        L[i].index=-2;
    }
    L[0].index=5;
    L[1].data=8;
    L[1].index=7;
    L[3].data=2;
    L[3].index=-1;
    L[5].data=3;
    L[5].index=1;
    L[7].data=4;
    L[7].index=3;
}

打印链表

void PrintStaticLink(StaticLink L)
{
    int index=0;
    char path[20]="0";
    char value_path[20]="0";
    while(L[index].index!=-1)
    {
        index=L[index].index;
        char dest[10],value_dest[10];
        sprintf(dest,"%s%d","->",index);
        sprintf(value_dest,"%s%d","->",L[index].data);
        strcat(path,dest);
        strcat(value_path,value_dest);
    }
    printf("index:%s\n",path);
    printf("value:%s\n",value_path);
}

根据序号获取对应的值

int GetSLElem(StaticLink L,int i)
{
    int j=0;
    int index=0;
    while(L[index].index!=-1&&j<i-1)
    {
        index=L[index].index;
        j++;
    }
    return L[index].data;
    
}

在对应序号节点后增加节点

void InsertSLNextNode(StaticLink L,int i,int e)
{
    if(L==NULL)return;
    if(i<=0||i>maxSize)return;
    int index=0;
    for (int j=1; j<maxSize; j++) {
        if(L[j].index==-2)
        {
            index=j;
            break;
        }
    }
    L[index].data=e;
    L[index].index=L[i].index;
    L[i].index=index;
}

在对应序号节点后删除节点

int  DeleteSLNextNode(StaticLink L,int i)
{
    if(L==NULL)return -2;
    if(i<=0||i>maxSize)return -2;
    
    int j=0;
    int preindex=0;
    while(L[preindex].index!=i)
    {
        preindex=L[preindex].index;
        j++;
    }
    L[preindex].index=L[i].index;
    int data=L[i].data;
    L[i].index=-2;
    
    return data;
}

测试

int main(int argc, const char * argv[]) {
    
    StaticLink L;
    InitStaticLink(L);
    PrintStaticLink(L);

    int target=GetSLElem(L,3);
    printf("GetSLElem(L,3)=%d\n",target);
  
    InsertSLNextNode(L,1,6);
    printf("InsertSLNextNode(L,1,6)\n");
    PrintStaticLink(L);
    
    
    int deleted_data=DeleteSLNextNode(L,7);
    printf("DeleteSLNextNode(L,7)=%d\n",deleted_data);
    PrintStaticLink(L);
    return 0;
}

输出结果

index:0->5->1->7->3
value:0->3->8->4->2
GetSLElem(L,3)=8
InsertSLNextNode(L,1,6)
index:0->5->1->2->7->3
value:0->3->8->6->4->2
DeleteSLNextNode(L,7)=4
index:0->5->1->2->3
value:0->3->8->6->2
Program ended with exit code: 0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值