1. 程式人生 > >數據結構——線性表的鏈式存儲結構

數據結構——線性表的鏈式存儲結構

bsp 結構 eat listnode str 鏈式存儲 ren i++ tro

創建一個可復用的單鏈表

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\n",p->v);
36     }
37     printf("\n");
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\n",q->v);
43     }
44     printf("\n");
45 
46     int l=linklist_length(list);
47     printf("%d\n",l);
48 
49     linklist_destroy(list);
50 
51     return 0;
52 }

數據結構——線性表的鏈式存儲結構