数据结构——线性表的链式存储结构

Posted hhwa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构——线性表的链式存储结构相关的知识,希望对你有一定的参考价值。

创建一个可复用的静态链表

1 //结点结构体定义
2 typedef struct _tag_staticlistnode
3 {
4     unsigned long data;
5     int next;
6 }tstaticlistnode;
1 //静态链表结构体定义
2 typedef struct _tag_staticlist
3 {
4     int capacity;
5     tstaticlistnode header;
6     tstaticlistnode node[];
7 }tstaticlist;

staticlist.h(头文件)

 1 #ifndef _STATICLIST_H_
 2 #define _STATICLIST_H_
 3 
 4 typedef void staticlist;
 5 
 6 typedef void staticlistnode;
 7 
 8 staticlist* staticlist_create(int capacity);
 9 
10 void staticlist_destroy(staticlist* list);
11 
12 void staticlist_clear(staticlist* list);
13 
14 int staticlist_length(staticlist* list);
15 
16 int staticlist_capacity(staticlist* list);
17 
18 staticlistnode* staticlist_get(staticlist* list,int pos);
19 
20 int staticlist_insert(staticlist* list,staticlistnode* node,int pos);
21 
22 staticlistnode* staticlist_delete(staticlist* list,int pos);
23 
24 #endif

staticlist.c(功能函数)

  1 #include<stdio.h>
  2 #include<malloc.h>
  3 #include"staticlist.h"
  4 
  5 #define AVAILABLE -1
  6 
  7 typedef struct _tag_staticlistnode
  8 {
  9     unsigned long data;
 10     int next;
 11 }tstaticlistnode;
 12 
 13 typedef struct _tag_staticlist
 14 {
 15     int capacity;
 16     tstaticlistnode header;
 17     tstaticlistnode node[];
 18 }tstaticlist;
 19 
 20 staticlist* staticlist_create(int capacity)
 21 {
 22     tstaticlist* ret=NULL;
 23     int i=0;
 24 
 25     if(capacity>=0)
 26     {
 27         ret=(tstaticlist*)malloc(sizeof(tstaticlist)+sizeof(tstaticlistnode)*(capacity + 1));
 28     }
 29     if(ret!=NULL)
 30     {
 31         ret->capacity=capacity;
 32         ret->header.next=0;
 33         ret->header.data=0;
 34 
 35         for(i=1;i<=capacity;i++)
 36         {
 37             ret->node[i].next=AVAILABLE;
 38         }
 39     }
 40     return ret;
 41 }
 42 
 43 void staticlist_destroy(staticlist* list)
 44 {
 45     free(list);
 46 }
 47 
 48 void staticlist_clear(staticlist* list)
 49 {
 50     tstaticlist* slist=(tstaticlist*)list;
 51     int i=0;
 52     if(slist!=NULL)
 53     {
 54         slist->header.data=0;
 55         slist->header.next=0;
 56 
 57         for(i=1;i<=slist->capacity;i++)
 58         {
 59             slist->node[i].next=AVAILABLE;
 60         }
 61     }
 62 }
 63 
 64 
 65 int staticlist_length(staticlist* list)
 66 {
 67     tstaticlist* slist=(tstaticlist*)list;
 68     int ret=-1;
 69     if(slist!=NULL)
 70     {
 71         ret=slist->header.data;
 72     }
 73     return ret;
 74 }
 75 
 76 int staticlist_capacity(staticlist* list)
 77 {
 78     tstaticlist* slist=(tstaticlist*)list;
 79     int ret=-1;
 80     if(slist!=NULL)
 81     {
 82         ret=slist->capacity;
 83     }
 84     return ret;
 85 }
 86 
 87 staticlistnode* staticlist_get(staticlist* list,int pos)
 88 {
 89     tstaticlist* slist=(tstaticlist*)list;
 90     staticlistnode* ret=NULL;
 91     int current=0;
 92     int object=0;
 93     int i=0;
 94     int f=0;
 95     f=(slist!=NULL);
 96     f=f&&(pos>=0)&&(pos<slist->header.data);
 97     if(f)
 98     {
 99         slist->node[0]=slist->header;
100         for(i=0;i<pos;i++)
101         {
102             current=slist->node[current].next;
103         }
104         object=slist->node[current].next;
105         ret=(staticlistnode*)(slist->node[object].data);
106     }
107     return ret;
108 }
109 
110 int staticlist_insert(staticlist* list,staticlistnode* node,int pos)
111 {
112     tstaticlist* slist = (tstaticlist*)list;
113     int ret=(slist!=NULL);
114     int current=0;
115     int index=0;
116     int i=0;
117     
118     ret=ret&&(slist->header.data+1<=slist->capacity);
119     ret=ret&&(pos>=0)&&(node!=NULL);
120     
121     if(ret)
122     {
123         for(i=1;i<=slist->capacity;i++)
124         {
125             if(slist->node[i].next==AVAILABLE)
126             {
127                 index=i;
128                 break;
129             }
130         }
131         
132         slist->node[index].data=(unsigned long)node;
133         
134         slist->node[0]=slist->header;
135 
136         for(i=0;(i<pos)&&(slist->node[current].next!=0);i++)
137         {
138             current=slist->node[current].next;
139         }
140         slist->node[index].next=slist->node[current].next;
141         slist->node[current].next=index;
142         slist->node[0].data++;
143         slist->header=slist->node[0];
144     }
145     
146     return ret;
147 }
148 staticlistnode* staticlist_delete(staticlist* list,int pos)
149 {
150     tstaticlist* slist=(tstaticlist*)list;
151     staticlistnode* ret=NULL;
152     int i=0;
153     int current=0;
154     int object=0;
155     int f=0;
156     f=(slist!=NULL);
157     f=f&&(pos>=0)&&(pos<slist->header.data);
158     if(f)
159     {
160         slist->node[0]=slist->header;
161         for(i=0;i<pos;i++)
162         {
163             current=slist->node[current].next;
164         }
165         object=slist->node[current].next;
166         slist->node[current].next=slist->node[object].next;
167         slist->node[0].data--;
168         slist->header=slist->node[0];
169         slist->node[object].next=AVAILABLE;
170         ret=(staticlistnode*)(slist->node[object].data);
171     }
172     return ret;
173 }

staticlistmain.c(实现程序)

 1 #include<stdio.h>
 2 #include<malloc.h>
 3 #include"staticlist.h"
 4 
 5 int main()
 6 {
 7     staticlist* list=staticlist_create(10);
 8     int index=0;
 9     int a=1;
10     int b=2;
11     int c=3;
12     int d=4;
13     int e=5;
14 
15     staticlist_insert(list,&a,0);
16     staticlist_insert(list,&b,0);
17     staticlist_insert(list,&c,0);
18     staticlist_insert(list,&d,0);
19     staticlist_insert(list,&e,0);
20 
21     for(index=0;index<staticlist_length(list);index++)
22     {
23         int *p=(int*)staticlist_get(list,index);
24         printf("%d
",*p);
25     }
26     printf("
");
27 
28     staticlist_delete(list,2);
29     for(index=0;index<staticlist_length(list);index++)
30     {
31         int *p=(int*)staticlist_get(list,index);
32         printf("%d
",*p);
33     }
34 
35     printf("
");
36 
37     int l=0;
38     int m=0;
39     l=staticlist_length(list);
40     m=staticlist_capacity(list);
41     printf("%d
",l);
42     printf("
");
43     printf("%d
",m);
44 
45     staticlist_destroy(list);
46 
47     return 0;
48 }

 

以上是关于数据结构——线性表的链式存储结构的主要内容,如果未能解决你的问题,请参考以下文章

线性表中的顺序存储与链式存储

数据结构开发:线性表的链式存储结构

线性表的链式存储——线性表的链式存储结构

线性表的顺序存储结构和链式存储结构

用C语言编写链式存储结构下实现线性表的创建,插入,删除,按值查找

数据结构--线性表的链式存储结构