和菜鸟一起学数据结构之简单静态链表实现

       一般情况下,我们要嘛用数组,要嘛就用链表来实现一些线性的数据结构,很少用静态链表。一种基于数组的,具有链表的性质的数据结构。简单的写了个小程序。

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

#define MAXNUM 1000

 

typedef struct

{

       int data;

       int cur;

}List[MAXNUM], Link;

 

void list_create(Link *list);

void list_insert(Link *list, int value);

void list_delete(Link *list, int value);

void list_print(Link *list);

 

int main(void)

{

       List list;

       int i;

       

       list_create(list);

       

       for(i = 1; i < 9; i++)      

              list_insert(list, i);

       

       list_print(list);

       printf("\n");

       

       list_delete(list, 2);

       

       list_print(list);

       printf("\n");

       

       

       return 0;

}

 

/*

       静态链表的链表头

*/

void list_create(Link *list)

{

       list[0].cur = 0;

       list[0].data = 1;      

}

 

/*

       静态链表中插入一个元素

*/

void list_insert(Link *list, int value)

{

       int i;

       int len;

       

       i = 0;

       

       while(list[i].cur != 0) i = list[i].cur;

              

       len = list[0].data++;

 

       list[i].cur = len;

       

       list[len].data = value;

       list[len].cur = 0;

}

 

/*

       静态链表中删除一个元素

*/

void list_delete(Link *list, int value)

{

       int i;

       int len;

 

       if(list[0].data == 1)

       {

              printf("Empty list\n");

              return;     

       }     

       

       i = 0;

       

       while(list[i].cur != 0)

       {

              if(list[list[i].cur].data == value)

              {

                     list[i].cur = list[list[i].cur].cur;     

              }

             i = list[i].cur;

       }

}

 

/*

       打印数组中所有的元素,或者打印链表中的元素

*/

void list_print(Link *list)

{

       int i;

       

       if(list[0].data == 1)

       {

              printf("Empty list\n");

              return;     

       }            

       

       i = 0;

       

       while(list[i].cur != 0)

       { 

              printf("%d  %d\n", list[i].data, list[i].cur);

              i = list[i].cur;

       }

       printf("%d  %d\n", list[i].data, list[i].cur);

/*           

       for(i = 0; i < list[0].data; i++)

              printf("%d  %d\n", list[i].data, list[i].cur);

*/

}


 

       所谓的静态链表就是多了一个光标,类似于链表中的指针,好比把所有的数据都串起来了一样。

比如:

       I   data    cur

       0     5      1

       1     1      3            

       2    2      4

       3    5      2

       4   6     0


 

上面就是一个静态链表了。

首先从表头i=0处开始吧。0-->1 ,  1-->3,  3-->2,  2-->4,  4-->0。这样就是一个链着的链表了,数据还是存放在那里,不过只是有个光标的指向不同而已。就好比,单链表中数据也是动态申请来了后固定在一个内存空间,然后有个指针把所有的串起来。但是这个静态链表他又有可以当数组用,可见他的强大了。

原文地址:https://www.cnblogs.com/wuyida/p/6300050.html