2) 線性鏈表

  •   線性表的順序存儲的缺點很是明顯:咱們插入和刪除時,須要移動大量的元素,這顯然將耗費很長的時間。
  •   當線性表的長度變化較大時,相對來講難以肯定存儲空間的容量。

所以,爲解決上述問題,提出了線性表的鏈式存儲結構html

 

引用:node

1.http://blog.csdn.net/u011314012/article/details/49069377ios

2.http://www.cnblogs.com/fanyong/archive/2011/11/06/2238439.html緩存

3. 大話數據結構數據結構

1. 鏈式存儲結構測試

  鏈表中的第一個結點的存儲位置叫作頭指針,最後一個結點指針域爲空(NULL)。鏈表中的頭結點不是鏈表的必要元素。
下面介紹下頭結點和頭指針的區別(參見大話數據結構P59):
1)頭指針是指向鏈表中第一個結點的指針,若鏈表有頭結點,則是頭指針---是指向頭結點的指針。
2)不管鏈表是否爲空,頭指針都不爲空。頭指針是鏈表的必要元素,而頭結點不是。
3)頭結點的數據域通常不存儲任何信息。
2. 代碼
  1 #include <iostream>
  2 
  3 using namespace std;
  4 
  5 
  6 
  7 typedef int ElemType;
  8 typedef struct _tag_LinkListNode LinkListNode;//
  9 
 10 struct _tag_LinkListNode
 11 {
 12  LinkListNode *next;
 13 };
 14 
 15 //0. linklist的存儲結構
 16 typedef struct Node
 17 {
 18     ElemType data;
 19     //int length;
 20     struct Node *next;
 21 } Node;
 22 
 23 typedef struct _tag_LinkList
 24 {
 25     LinkListNode head;
 26     int length;
 27 }LinkList;
 28 
 29 
 30 //1. 建立線性表
 31  LinkList* initList()
 32 {
 33     int ret=0;
 34     LinkList *tmp=(LinkList*)malloc(sizeof(LinkList));
 35     if(tmp==NULL)
 36     {
 37         ret=-1;
 38         printf("initList erro: %d",ret);
 39     }
 40     
 41     //(*tmp)->length=0;
 42     memset(tmp,0,sizeof(LinkList));
 43     if(tmp!=NULL)
 44     {
 45         tmp->head.next=NULL;
 46         tmp->length=0;
 47     }
 48     return tmp;
 49 }
 50 
 51 //2. 銷燬線性表
 52 void LinKList_Destory(LinkList* list)
 53 {
 54     if(list!=NULL)
 55     {
 56         free(list);
 57         list=NULL;
 58     }
 59     return;
 60 }
 61 
 62 //3. 清空鏈表全部元素,恢復初始狀態
 63 void LinkList_Clear(LinkList* list)
 64 {
 65     LinkList* sList = (LinkList*)list;
 66  
 67     if(sList != NULL)
 68     {
 69          sList->length = 0;
 70          sList->head.next = NULL;
 71     } 
 72 }
 73 
 74 
 75 //4 .插入
 76 int LinkList_Insert(LinkList* list,int pos,LinkListNode *node)
 77 {
 78     int ret=0;
 79     LinkListNode *current=NULL;
 80 
 81     if(list==NULL||pos<0||node==NULL)
 82     {
 83         ret=-1;
 84         printf("LinkList_Insert ()erro: %d",ret);
 85         return ret;
 86     }
 87 
 88     current=&(list->head);
 89 
 90     for(int i=0;i<pos&&current->next!=NULL;i++)
 91     {
 92         current=current->next;
 93     }
 94     
 95     node->next=current->next;//1 node鏈接後續鏈表
 96     current->next=node;    //2 鏈接節點
 97     list->length++;
 98     return 0;
 99 }
100 
101 // 5. 刪除,返回該節點
102 LinkListNode * LinkList_Delete(LinkList* list,int pos)
103 {
104     int ret=0;
105     LinkListNode *node=NULL;
106     LinkListNode *current=NULL;
107 
108     if(list==NULL||pos<0)
109     {
110         ret=-1;
111         printf("LinkList_Insert ()erro: %d",ret);
112         return (LinkListNode * )ret ;
113     }
114 
115     current=&(list->head);
116     
117     for(int i=0;i<pos&&(current->next!=NULL);i++)
118     {
119         current=current->next;
120     }
121     node=current->next;//1 緩存node節點
122 
123      //2 鏈接節點
124     current->next=node->next;   
125     list->length--;
126 
127     return node;
128 }
129 
130 //6. 獲取線性表的元素
131 LinkListNode * getElem(LinkList *list,int i)
132 {
133     LinkListNode *node=NULL;
134     node=&(list->head);
135     for(int k=0;k<=i;k++)
136     {
137         node=node->next;
138     }
139     return node;
140 }

3. 測試代碼spa

 1 int main()
 2 {
 3     int ret=0;
 4     typedef struct Teacher
 5     {
 6         LinkListNode node;//第一個域是node,就能夠把teacher強制轉化爲LinkListNode
 7         int age;
 8     }Teacher;
 9 
10     LinkList *list1=NULL;
11 
12     Teacher t1,t2,t3,t4,t5;
13     t1.age=31;
14     t2.age=32;
15     t3.age=33;
16     t4.age=34;
17     t5.age=35;
18     
19 
20     list1=initList();
21     if(list1==NULL)
22     {
23         return -1;
24     }
25 
26     //1.插入:int LinkList_Insert(LinkList* list,int pos,LinkListNode *node)
27     ret=LinkList_Insert(list1,0,(LinkListNode*)(&t1));
28     ret=LinkList_Insert(list1,0,(LinkListNode*)(&t2));
29     ret=LinkList_Insert(list1,0,(LinkListNode*)(&t3));
30     ret=LinkList_Insert(list1,0,(LinkListNode*)(&t4));
31     ret=LinkList_Insert(list1,0,(LinkListNode*)(&t5));
32 
33 
34     //2. 遍歷LinkListNode * getElem(LinkList *list,int i)
35     printf("\n輸入值: \n");
36     for (int i=0;i<list1->length;i++)
37     {
38         Teacher *tmp=(Teacher*)getElem(list1,i);
39         if(tmp==NULL)
40         {
41             return -2;
42         }
43         printf("tmp->age :%d \n",tmp->age);
44     }
45 
46     //3. 刪除 int LinkList_Delete(LinkList* list,int pos,LinkListNode *node)
47         printf("\n刪除: \n");
48         LinkListNode *node=NULL;
49         
50         while(list1->length>0)
51         {
52             LinkListNode *node=LinkList_Delete(list1,0);//頭刪法
53             Teacher *teacher=(Teacher*)node;
54             if(teacher==NULL)
55             {
56                 return -2;
57             }
58             printf("tmp->age :%d \n",teacher->age);
59         }
60     system("pause");
61     return 0;
62 }

4. 運行結果.net

相關文章
相關標籤/搜索