数据结构——线性表的链式存储结构
Posted hhwa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构——线性表的链式存储结构相关的知识,希望对你有一定的参考价值。
创建一个可复用的单链表
1 //结点指针域定义
2 typedef struct _tag_linklistnode linklistnode;
3
4 struct _tag_linklistnode
5 {
6 linklistnode* next;
7 };
1 //头结点定义
2 typedef struct _tag_linklist
3 {
4 linklistnode header;
5 int length;
6 }tlinklist;
1 //数据元素定义
2 struct value
3 {
4 linklistnode header;
5 int v;
6 };
linklist.h(头文件)
1 #ifndef _LINKLIST_H_
2 #define _LINKLIST_H_
3
4 typedef void linklist;
5 typedef struct _tag_linklistnode linklistnode;
6
7 struct _tag_linklistnode
8 {
9 linklistnode* next;
10 };
11
12 linklist* linklist_create();
13
14 void linklist_destroy(linklist* list);
15
16 void linklist_clear(linklist* list);
17
18 int linklist_length(linklist* list);
19
20 int linklist_insert(linklist* list,linklistnode* node,int pos);
21
22 linklistnode* linklist_get(linklist* list,int pos);
23
24 linklistnode* linklist_delete(linklist* list,int pos);
25
26 #endif
linklist.c(功能函数)
1 #include<stdio.h>
2 #include<malloc.h>
3 #include"linklist.h"
4
5 typedef struct _tag_linklist
6 {
7 linklistnode header;
8 int length;
9 }tlinklist;
10
11 linklist* linklist_create()
12 {
13 tlinklist* ret=(tlinklist*)malloc(sizeof(tlinklist));
14 if(ret!=NULL)
15 {
16 ret->length=0;
17 ret->header.next=NULL;
18 }
19 return ret;
20 }
21
22 void linklist_destroy(linklist* list)
23 {
24 free(list);
25 }
26
27 void linklist_clear(linklist* list)
28 {
29 tlinklist* slist=(tlinklist*)list;
30 if(slist!=NULL)
31 {
32 slist->length=0;
33 slist->header.next=NULL;
34 }
35 }
36
37 int linklist_length(linklist* list)
38 {
39 tlinklist* slist=(tlinklist*)list;
40 int ret=-1;
41 if(slist!=NULL)
42 {
43 ret=slist->length;
44 }
45 return ret;
46 }
47
48 int linklist_insert(linklist* list,linklistnode* node,int pos)
49 {
50 tlinklist* slist=(tlinklist*)list;
51 int i=0;
52 int ret=(slist!=NULL);
53 ret=ret&&(pos>=0)&&(node!=NULL);
54 if(ret)
55 {
56 linklistnode* current=(linklistnode*)slist;
57 for(i=0;(i<pos)&&(current->next!=NULL);i++)
58 {
59 current=current->next;
60 }
61 node->next=current->next;
62 current->next=node;
63 slist->length++;
64 }
65 return ret;
66 }
67
68 linklistnode* linklist_get(linklist* list,int pos)
69 {
70 tlinklist* slist=(tlinklist*)list;
71 int i=0;
72 linklistnode* ret=NULL;
73 int r=(slist!=NULL);
74 r=r&&(pos>=0)&&(pos<slist->length);
75 if(r)
76 {
77 linklistnode* current=(linklistnode*)slist;
78 for(i=0;i<pos;i++)
79 {
80 current=current->next;
81 }
82 ret=current->next;
83 }
84 return ret;
85 }
86
87 linklistnode* linklist_delete(linklist* list,int pos)
88 {
89 tlinklist* slist=(tlinklist*)list;
90 int i=0;
91 linklistnode* ret=NULL;
92 int r=(slist!=NULL);
93 r=r&&(pos>=0)&&(pos<slist->length);
94 if(r)
95 {
96 linklistnode* current=(linklistnode*)slist;
97 for(i=0;i<pos;i++)
98 {
99 current=current->next;
100 }
101 ret=current->next;
102 current->next=ret->next;
103 slist->length--;
104 }
105 return ret;
106 }
linklistmain.c(实现程序)
1 #include<stdio.h>
2 #include<malloc.h>
3 #include"linklist.h"
4
5 struct value
6 {
7 linklistnode header;
8 int v;
9 };
10
11 int main()
12 {
13 int i=0;
14 linklist* list=linklist_create();
15 struct value v1;
16 struct value v2;
17 struct value v3;
18 struct value v4;
19 struct value v5;
20
21 v1.v=1;
22 v2.v=2;
23 v3.v=3;
24 v4.v=4;
25 v5.v=5;
26 linklist_insert(list,(linklistnode*)&v1,0);
27 linklist_insert(list,(linklistnode*)&v2,0);
28 linklist_insert(list,(linklistnode*)&v3,0);
29 linklist_insert(list,(linklistnode*)&v4,0);
30 linklist_insert(list,(linklistnode*)&v5,0);
31
32 for(i=0;i<linklist_length(list);i++)
33 {
34 struct value* p=(struct value*)linklist_get(list,i);
35 printf("%d
",p->v);
36 }
37 printf("
");
38 linklist_delete(list,linklist_length(list)-1);
39 for(i=0;i<linklist_length(list);i++)
40 {
41 struct value* q=(struct value*)linklist_get(list,i);
42 printf("%d
",q->v);
43 }
44 printf("
");
45
46 int l=linklist_length(list);
47 printf("%d
",l);
48
49 linklist_destroy(list);
50
51 return 0;
52 }
以上是关于数据结构——线性表的链式存储结构的主要内容,如果未能解决你的问题,请参考以下文章