【C语言--数据结构】线性顺序表

线性表的本质:
1.线性表(List)是零个或者多个数据元素的集合;
2.线性表中的数据元素之间是有顺序的;
3.线性表中的数据元素个数是有限的;
4.线性表中的数据元素的类型必须相同;
定义:
线性表是具有相同类型的n(>=0)个数据元素的有限序列
(a1,a2,a3.....) a1是表项,n是表长度
性质:
1.a0为线性表的第一个元素,只有一个后继
2.an为线性表的最后一个元素,只有一个前驱
3.除了a0,an外的其它元素ai,既有前驱,又有后继
4.线性表能够逐项访问和顺序存取

总结:
(1)线性表是数据元素的有序并且有限的集合
(2)线性表中的元素必须是类型相同的
(3)线性表可用于描述“队列类型”关系的问题

代码范例:

(1)头文件

 1 #ifndef __SEQLIST_H__
 2 #define __SEQLIST_H__
 3 
 4 #include <stdio.h>
 5 #include <stdlib.h>
 6 #include <malloc.h>
 7 
 8 typedef void SeqListNode;
 9 typedef void SeqList;
10 
11 /* 函数声明 */
12 SeqList *SeqList_Create(int iCapacity);
13 void SeqList_Destory(SeqList *pstList);
14 void SeqList_Clear(SeqList* pstList);
15 int SeqList_Length(SeqList* pstList);
16 int SeqList_Capacity(SeqList* pstList);
17 int SeqList_Insert(SeqList* pstList, SeqListNode *pstNode, int iPos);
18 SeqListNode* SeqList_Get(SeqList* pstList, int iPos);
19 SeqListNode* SeqList_Delete(SeqList* pstList, int iPos);
20 
21 
22 #endif 

(2)函数实现

  1 /*
  2 ** 顺序存储结构的线性表
  3 */
  4 #include "SeqList.h"
  5 
  6 typedef unsigned int TSeqListNode;
  7 
  8 typedef struct _tag_SeqList
  9 {
 10     int iCapacity;
 11     int iLength;
 12     TSeqListNode *node;
 13 }TSeqList;
 14 
 15 /* 线性表相关函数的实现 */
 16 
 17 /**************************************************************************
 18 ** 函 数 名: SeqList_Create
 19 ** 函数作用: 创建一个线性顺序表
 20 ** 返 回 值: SeqList *
 21 ** 日    期: 2017年2月13日
 22 ** 作    者: Rookie
 23 ***************************************************************************/
 24 SeqList *SeqList_Create(int iCapacity)
 25 {
 26     TSeqList* pstRet = NULL;
 27 
 28     if (0 <= iCapacity)
 29     {
 30         pstRet = (TSeqList *)malloc(sizeof(TSeqList) + sizeof(TSeqListNode)*iCapacity);
 31     }
 32 
 33     if (pstRet != NULL)
 34     {
 35         pstRet->iCapacity = iCapacity;
 36         pstRet->iLength = 0;
 37         pstRet->node = (TSeqListNode *)(pstRet + 1);
 38     }
 39 
 40     return pstRet;
 41 }
 42 
 43 /**************************************************************************
 44 ** 函 数 名: SeqList_Destory
 45 ** 函数作用: 销毁一个线性顺序表
 46 ** 返 回 值: void
 47 ** 日    期: 2017年2月13日
 48 ** 作    者: Rookie
 49 ***************************************************************************/
 50 void SeqList_Destory(SeqList *pstList)
 51 {
 52     free(pstList);
 53 
 54     return;
 55 }
 56 
 57 /**************************************************************************
 58 ** 函 数 名: SeqList_Clear
 59 ** 函数作用: 一个线性顺序表清空
 60 ** 返 回 值: void
 61 ** 日    期: 2017年2月13日
 62 ** 作    者: Rookie
 63 ***************************************************************************/
 64 void SeqList_Clear(SeqList* pstList)
 65 {
 66    TSeqList* pstListTemp = (TSeqList *)pstList;
 67 
 68     if (pstListTemp != NULL)
 69     {
 70         pstListTemp->iLength = 0;
 71     }
 72     
 73     return;
 74 }
 75 
 76 /**************************************************************************
 77 ** 函 数 名: SeqList_Length
 78 ** 函数作用: 获取顺序表的长度
 79 ** 返 回 值: int 
 80 ** 日    期: 2017年2月14日
 81 ** 作    者: Rookie
 82 ***************************************************************************/
 83 int SeqList_Length(SeqList* pstList)
 84 {
 85     int iRet = -1;
 86     TSeqList* pstListTemp = (TSeqList *)pstList;
 87 
 88     if (pstListTemp != NULL)
 89     {
 90         iRet = pstListTemp->iLength;
 91     }
 92 
 93     return iRet;
 94 }
 95 
 96 /**************************************************************************
 97 ** 函 数 名: SeqList_Capacity
 98 ** 函数作用: 获取顺序表的容量
 99 ** 返 回 值: int 
100 ** 日    期: 2017年2月14日
101 ** 作    者: Rookie
102 ***************************************************************************/
103 int SeqList_Capacity(SeqList* pstList)
104 {
105     int iRet = -1;
106     TSeqList* pstListTemp = (TSeqList *)pstList;
107 
108     if (pstListTemp != NULL)
109     {
110         iRet = pstListTemp->iCapacity;
111     }
112 
113     return iRet;
114 }
115 
116 /**************************************************************************
117 ** 函 数 名: SeqList_Insert
118 ** 函数作用: 向线性表中插入一个节点
119 ** 返 回 值: int 
120 ** 日    期: 2017年2月14日
121 ** 作    者: Rookie
122 ***************************************************************************/
123 int SeqList_Insert(SeqList* pstList, SeqListNode *pstNode, int iPos)
124 {
125     TSeqList* pstListTemp = (TSeqList *)pstList;
126     int iRet = (pstListTemp != NULL);
127     int iLoop;
128 
129     iRet = iRet && ((pstListTemp->iLength + 1) <= pstListTemp->iCapacity);
130     iRet = iRet && (0 <= iPos);
131 
132     if (iRet)
133     {
134         if (iPos > pstListTemp->iLength)
135         {
136             iPos = pstListTemp->iLength;
137         }
138 
139         for (iLoop = pstListTemp->iLength; iLoop > iPos; iLoop--)
140         {
141             pstListTemp->node[iLoop] = pstListTemp->node[iLoop-1];
142         }
143 
144         pstListTemp->node[iLoop] = (TSeqListNode)pstNode;
145         pstListTemp->iLength++;
146     }
147 
148     return iRet;
149 }
150 
151 /**************************************************************************
152 ** 函 数 名: SeqList_Get
153 ** 函数作用: 获取顺序表的指定位置的值
154 ** 返 回 值: int 
155 ** 日    期: 2017年2月14日
156 ** 作    者: Rookie
157 ***************************************************************************/
158 SeqListNode* SeqList_Get(SeqList* pstList, int iPos)
159 {
160     TSeqList* pstListTemp = (TSeqList *)pstList;
161     SeqListNode* pstRet = NULL;
162 
163     if ((NULL != pstListTemp) && (0 <= iPos) && (iPos <= pstListTemp->iLength))
164     {
165         pstRet = (SeqListNode*)pstListTemp->node[iPos];
166     }
167 
168     return pstRet;
169 }
170 
171 /**************************************************************************
172 ** 函 数 名: SeqList_Delete(SeqList* pstList, int iPos)
173 ** 函数作用: 删除顺序表的指定位置的值
174 ** 返 回 值: 
175 ** 日    期: 2017年2月14日
176 ** 作    者: Rookie
177 ***************************************************************************/
178 SeqListNode* SeqList_Delete(SeqList* pstList, int iPos)
179 {
180     TSeqList* pstListTemp = (TSeqList *)pstList;
181     SeqListNode* pstRet = SeqList_Get(pstList, iPos);
182     int iLoop;
183 
184     if (NULL != pstRet)
185     {
186         for (iLoop = iPos+1; iLoop < pstListTemp->iLength; iLoop++)
187         {
188             pstListTemp->node[iLoop-1] = pstListTemp->node[iLoop];
189         }
190         pstListTemp->node[iLoop] = (TSeqListNode)NULL;
191         pstListTemp->iLength--;
192     }
193 
194     return pstRet;
195 }

 

posted @ 2017-02-14 20:53  LinuxRookie  阅读(1330)  评论(0编辑  收藏  举报