静态链表实例

本文介绍静态链表的数据结构特点及其在C语言中的具体实现方法。包括静态链表的创建、元素插入、删除等核心操作,并通过示例代码展示了如何进行遍历及定位等常见操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 顺序表定位操作效率高,只要知道下标便能直接引用数据元素.但是在顺序表插入删除数据时,需要移动数据元素以确保其结构完整性. 链表定位操作需要计数器帮助,效率低下。但是插入删除元素时效率高。静态链表包含二者大部份优点(能够快速定位,插入删除数据时效率高)如下是静态链表的一个实例.

#include <stdio.h>
typedef struct Elem
{
 int data;
 int next; /*指定下一个元素位序*/
} Elem_p;

 

typedef struct node
{
 Elem_p *Elem;
 int length;
 int size;
} NODE ;

 

/*创建静态链表*/
int CreatList(NODE *L,int size)
{
 L->Elem = (Elem_p *)malloc(sizeof(Elem_p) * (size + 1 ));
 if(L->Elem == NULL) return 0;
 L->Elem[0].next = -1;
 L->length = 0;
 L->size = size;
 return 1;
}

/*插入元素*/
int AddDate(NODE *L,int data)
{
 int k = 0;
 if(L->size <= L->length )  /*检查链表是否溢出*/
  return 0;

 /*升序插入元素*/
 while(L->Elem[L->Elem[k].next].data != -1 && L->Elem[L->Elem[k].next].data < data)
 {
  k = L->Elem[k].next;
 }

 L->Elem[L->length+1].data = data;
 L->Elem[L->length+1].next = L->Elem[k].next;
 L->Elem[k].next = L->length+1;

 (L->length)++;
}

void print(int d)
{
 printf("/n %d",d);
}

/*遍历链表*/
void foreach(NODE L, void (*t)(int))
{
 int k;
 k = L.Elem[0].next;
 while(k!= -1)
 {
  (*t)(L.Elem[k].data);
  k = L.Elem[k].next;
 }
}

/*返回指定位序索引*/
int GetElemAt(int index,NODE L,int *pre)
{
 int p,k = 0;
 if(index < 0 || index > L.length)
  return -4;
 p = 0 ;
 while(p != -1 &&  k < index )
 {
     *pre = p;
  p = L.Elem[p].next;
  k++;
 }

 if(p == -1 || k > index)
  return -4;

 return p;
}

/*指定位序插入元素*/
int InsertElemAt(NODE *L,int index,int date)
{
 int p,pre;
 if(L->length >= L->size)
  return 0;
 if(index < 1 || index > L->length+1)
  return 0;

 p = GetElemAt(index-1,*L,&pre);
 if(p == -4) return 0;

/*在 位序 L->Elem[p] 和 L->Elem[L->Elem[p].next] 间插入元素*/
 L->Elem[L->length+1].data = date;
 L->Elem[L->length+1].next =  L->Elem[p].next;
 L->Elem[p].next = L->length+1;

 L->length++;
 return 1;
}

/*删除指定位序元素*/
int DeleteElemAt(NODE *L,int index)
{
 int pre,p;
 p = GetElemAt(index,*L,&pre);
 if(p == -4 || p == 0) return 0;

 L->Elem[pre].next = L->Elem[p].next;
 L->length--;
 return 1;
}

void main()
{

 NODE L;
 int k,p;
 clrscr();
 CreatList(&L,7);

 /*插入元素*/
 AddDate(&L,1);
 AddDate(&L,3);
 AddDate(&L,2);
 AddDate(&L,4);
 AddDate(&L,5);
 AddDate(&L,10);

    InsertElemAt(&L,1,1);

/*遍历静态链表*/
 foreach(L,print);

 

 free(L);
}

 

/*因为静态链表是数组结构,其缺点:初使化时必须指定大小*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值