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

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 }

 

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

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

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

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

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

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

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