静态链表的操作

//静态链表的插入删除
#include<stdio.h>
#define Max 1000

typedef int ElemType;
typedef struct {
    ElemType Data;
    int cur;
}StaticLinkList[Max];

int InitList(StaticLinkList Init);
int InsertList(StaticLinkList L, int i, ElemType e);
int Malloc(StaticLinkList space);
int DeleteList(StaticLinkList L, int i);
int Free(StaticLinkList L, int i);
int PrintInsert(StaticLinkList L);
int PrintDelete(StaticLinkList L);
int ListLength(StaticLinkList L);

//初始化
int InitList(StaticLinkList Init){
    int i;
    for(i=0;i<Max-1;i++){   
        Init[i].cur=i+1;
    }
    Init[Max-1].cur=0;
    return 1;
}

//插入
int InsertList(StaticLinkList L, int i, ElemType e){
    int j,k,l;
    k=Max-1;
    j=Malloc(L);
    if(j){
        L[j].Data=e;
        for(l=1;l<=i-1;l++){
            k=L[k].cur;
        }
        L[j].cur=L[k].cur;      //插入元素的游标获取了原来应该指向下一个的位置
        L[k].cur=j;             //原来游标的指向改成指向插入元素
        return 1;
    }
    return 0;
}

//备用链表申请空间(改游标指向)
int Malloc(StaticLinkList space){
    int i;
    i=space[0].cur;         //给予新的空间
    if(space[0].cur){
        space[0].cur=space[i].cur;      //将备用链表的游标改成新的空间
    }
    return i;
}

//删除
int DeleteList(StaticLinkList L, int i){
    int j,k;
    k=Max-1;
    for(j=1;j<=i-1;j++){
        k=L[k].cur;
    }
    j=L[k].cur;     
    L[k].cur=L[j].cur;      //删前的一个元素的游标等于删除元素的游标
    Free(L,j);
    return 1;
}

//释放结点(等待被新元素覆盖的状态)
int Free(StaticLinkList L, int j){
    L[j].cur=L[0].cur;          //删除元素的游标改成新的空间
    L[0].cur=j;                 //下一个元素插入首选地方就是被删除的这个地方
}

//建表插入后的输出
int PrintInsert(StaticLinkList L){
    int j,temp;
    j=ListLength(L);
    printf("表长:%d\n",j);
    temp=Max-1;
    temp=L[temp].cur;
    while(L[temp].cur<=j){  //利用游标来循环,游标不大于表长就输出,最后游标会到最后一个数据的游标,也就是0,而0的游标是一个新的空间,大于了表长
        printf("%d ",L[temp].Data);     //不可以用下标来循环哦,这样看不出插入的效果的
        temp=L[temp].cur;
    }
    printf("\n");
}

//删除后的输出
int PrintDelete(StaticLinkList L){
    int temp,j,i;
    j=ListLength(L);
    temp=Max-1;
    temp=L[temp].cur;
    printf("表长:%d\n",j);
    while(i++<=j){      //这里就不能和插入后的输出一样了,因为有个位置被删除了,那个位置的游标值是大于表长的
        printf("%d ",L[temp].Data);
        temp=L[temp].cur;
    }
    printf("\n");
}
//长度
int ListLength(StaticLinkList L){
   int i,j=0;
   i=L[Max-1].cur;  //i=1
   while(i){        //游标不等于最后一个也就是不等于0就循环
       i=L[i].cur;      //每次循环等于下一个游标
       j++;             //记录循环了几次就是表的长度
   }
   return j;
}
int main(){
    StaticLinkList L;
    InitList(L);
    for(int i=1;i<6;i++){
        InsertList(L,i,i*10);
    }
    PrintInsert(L);
    printf("插入后\n");
    InsertList(L,4,99);
    PrintInsert(L);
    printf("删除后\n");
    DeleteList(L,2);
    PrintDelete(L);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
静态链表是一种使用数组实现的链表结构。它通过数组中的元素自身的指针来实现链表的连接关系。以下是静态链表的基本操作: 1. 初始化:创建一个包含足够多元素的数组,每个元素包含两个字段,一个用于存储数据,另一个用于存储指向下一个元素的索引。初始化时,设置数组中所有元素的指针字段为-1,表示链表为空。 2. 插入:插入操作将新元素插入到静态链表中的指定位置。首先找到一个空闲位置并将新元素插入其中,然后将前一个元素的指针字段指向新元素,在将新元素的指针字段指向原来位置的后继元素。 3. 删除:删除操作静态链表中指定位置的元素移除。首先将要删除的元素的前一个元素的指针字段指向要删除元素的后继元素,然后将要删除元素所在位置设置为空闲。 4. 查找:查找操作可以根据给定的关键字或索引在静态链表中找到对应的元素。可以通过遍历整个链表,逐个比较每个节点中存储的值与给定关键字或索引进行匹配。 5. 更新:更新操作用于修改静态链表中指定位置元素的值。首先找到要更新的元素位置,然后将其值进行修改。 需要注意的是,静态链表的插入和删除操作可能需要额外的空间来存储空闲位置的索引信息,以便快速找到可用位置。另外,由于静态链表使用数组实现,插入和删除操作可能会涉及元素的移动,因此效率较低,适用于对数据的频繁查找而不是插入和删除的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值