数据结构(13)线性表

来源:互联网 发布:python 迭代器使用 编辑:程序博客网 时间:2024/04/30 15:29

线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。Balabala.....其实最简单的也就不用说了,上述是取自百度百科对于线性表的定义。而在这里,就简单说明下线性表的定义:

        线性表是具有相同类型的n个数据元素的有限序列:  (a1, a2, a3, a4, ......, an)  ai是表项, n是表长度

        或许大家应该能联想到数组,其实是和线性表是一个道理,性质如下:

                   1. a0为表首元素,只有一个后继

                   2. an为表尾元素,只有一个前驱

                   3. 除a0an外的其他元素ai,既有前驱,又有后继

                   4. 线性表能够逐项访问和顺序存取

         这里主要介绍线性表的常用操作:

                   l 创建线性表                      

                   l 销毁线性表

                   l 清空线性表

                   l 表元素插入

                   l 表元素删除

                   l 获取表中某个位置的元素

                   l 获取表长度

 

            代码总分为三个文件:

                  SeqList.h : 放置功能函数的声明,以及表和表结点的声明

                  SeqList.h : 放置功能函数的定义,以及表和表结点的定义

                  Main.c : 主函数,使用功能函数完成各种需求,不过我一般是用作测试

         用一副图来描述下代码的总体结构:

         其实对于在SeqList.c 和SeqList.h文件中分别定义SeqList,我刚开始看的时候也不懂,在SeqList.c文件中每次使用函数参数中的list,需要强制类型转换为sList,后来才知道多了一次转换是为了更高的安全性和可靠性。

         这里着重说下插入操作和删除操作:

                           插入操作

                                   如图

                      插入元素方法:

                                首先判断线性表﹑插入位置是否合法,表是否已满

                                把最后一个元素到插入位置的元素向后移一个位置

                                把新元素插入

                               最后把线性表长度加1

                删除操作

                        如图

                               删除元素方法:

                              首先判断线性表﹑删除位置是否合法

                              把要删除的元素取出

                              然后从删除元素后一个位置的元素到最后元素依次往前移一个位置

                              最后把线性表长度减1

 

        OK! 上代码:

 

           SeqList.h

          

[cpp] view plaincopy
  1. #ifndef _SEQLIST_H_  //防止重复调用   
  2. #define _SEQLIST_H_  
  3.   
  4. typedef void SeqList;  
  5. typedef void SeqListNode;  
  6.   
  7. SeqList* SeqList_Create(int capacity);  
  8.   
  9. void SeqList_Destroy(SeqList* list);  
  10.   
  11. void SeqList_Clear(SeqList* list);  
  12.   
  13. int SeqList_Length(SeqList* list);  
  14.   
  15. int SeqList_Capacity(SeqList* list);  
  16.   
  17. int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);  
  18.   
  19. SeqListNode* SeqList_Get(SeqList* list, int pos);  
  20.   
  21. SeqListNode* SeqList_Delete(SeqList* list, int pos);  
  22.   
  23. #endif  


SeqList.c

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. #include <malloc.h>  
  3. #include "SeqList.h"  
  4.   
  5. typedef unsigned int TSeqListNode;  
  6.   
  7. typedef struct _tag_SeqList  
  8. {  
  9.     int capacity;  
  10.     int length;  
  11.     TSeqListNode* node;  
  12. }TSeqList;  
  13.   
  14. SeqList* SeqList_Create(int capacity)  
  15. {  
  16.     TSeqList* ret = NULL;  
  17.   
  18.     if(ret == NULL)  
  19.     {  
  20.         ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode)*capacity);  
  21.     }  
  22.   
  23.     if(ret != NULL)  
  24.     {  
  25.         ret->capacity = capacity;  
  26.         ret->length = 0;  
  27.         ret->node = (TSeqListNode*)(ret+1);  
  28.     }  
  29.   
  30.     return ret;  
  31. }  
  32.   
  33. void SeqList_Destroy(SeqList* list)  
  34. {  
  35.     free(list);  
  36. }  
  37.   
  38. void SeqList_Clear(SeqList* list)  
  39. {  
  40.     TSeqList* sList = (TSeqList*)list;  
  41.   
  42.     if(sList!=NULL)  
  43.     {  
  44.         sList->length = 0;  
  45.     }  
  46. }  
  47.   
  48. int SeqList_Length(SeqList* list)  
  49. {  
  50.     TSeqList* sList = (TSeqList*)list;  
  51.     int ret = -1;  
  52.   
  53.     if(sList!=NULL)  
  54.     {  
  55.         ret = sList->length;  
  56.     }  
  57.   
  58.     return ret;  
  59. }  
  60.   
  61. int SeqList_Capacity(SeqList* list)  
  62. {  
  63.     TSeqList* sList = (TSeqList*)list;  
  64.     int ret = -1;  
  65.   
  66.     if(sList!=NULL)  
  67.     {  
  68.         ret = sList->capacity;  
  69.     }  
  70.   
  71.     return ret;  
  72. }  
  73.   
  74. int SeqList_Insert(SeqList* list, SeqListNode* node, int pos)  
  75. {  
  76.     TSeqList* sList = (TSeqList*)list;  
  77.     int ret = (sList!=NULL);  
  78.     int i = 0;  
  79.   
  80.     ret = ret && (sList->length+1 <= sList->capacity);  
  81.     ret = ret && (pos >= 0);  
  82.   
  83.     if(ret)  
  84.     {  
  85.         if(pos >= sList->length)  
  86.         {  
  87.             pos = sList->length;  
  88.         }  
  89.   
  90.         for(i=sList->length; i>pos; i--)  
  91.         {  
  92.             sList->node[i] = sList->node[i-1];  
  93.         }  
  94.   
  95.         sList->node[i] = (TSeqListNode)node;  
  96.           
  97.         sList->length++;  
  98.     }  
  99.   
  100.     return ret;  
  101. }  
  102.   
  103. SeqListNode* SeqList_Get(SeqList* list, int pos)  
  104. {  
  105.     TSeqList* sList = (TSeqList*)list;  
  106.     SeqListNode* ret = NULL;  
  107.   
  108.     if( (sList!=NULL) && (pos >= 0) && (pos<sList->length) )  
  109.     {  
  110.         ret = (TSeqListNode*)(sList->node[pos]);  
  111.     }  
  112.   
  113.     return ret;  
  114. }  
  115.   
  116. SeqListNode* SeqList_Delete(SeqList* list, int pos)  
  117. {  
  118.     SeqListNode* ret = SeqList_Get(list, pos);  
  119.   
  120.     TSeqList* sList = (TSeqList*)list;  
  121.   
  122.     int i = 0;  
  123.   
  124.     if(ret!=NULL)  
  125.     {  
  126.         for(i=pos+1; i<sList->length; i++)  
  127.         {  
  128.             sList->node[i-1] = sList->node[i];  
  129.         }  
  130.   
  131.         sList->length--;  
  132.     }  
  133.   
  134.     return ret;  
  135. }  


main.c

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include "SeqList.h"  
  4.   
  5. int main(void)  
  6. {  
  7.     SeqList* list = SeqList_Create(6);  
  8.   
  9.     int i=0, j=1, k=2;  
  10.     int x=3, y=4, z=5;  
  11.   
  12.     int index = 0;  
  13.   
  14.     SeqList_Insert(list, &i, 0);  
  15.     SeqList_Insert(list, &j, 0);  
  16.     SeqList_Insert(list, &k, 0);  
  17.     SeqList_Insert(list, &x, 0);  
  18.     SeqList_Insert(list, &y, 0);  
  19.     SeqList_Insert(list, &z, 0);  
  20.   
  21.     for(index=0; index<SeqList_Length(list); index++)  
  22.     {  
  23.         int* p = (int*)SeqList_Get(list, index);  
  24.   
  25.         printf("%d\n", *p);  
  26.     }  
  27.   
  28.     while(SeqList_Length(list) > 0)  
  29.     {  
  30.         int* p = (int*)SeqList_Delete(list, 0);  
  31.   
  32.         printf("%d\n", *p);  
  33.     }  
  34.   
  35.     SeqList_Destroy(list);  
  36.   
  37.     return 0;  
  38. }  


 

本文借鉴:http://blog.csdn.net/nethanhan/article/details/9670577

0 0