1.线性表的定义:

线性表(List)是零个或多个数据元素的集合;
相同内型的N(>=0)个元素的有限序列(a1,a2,a3,…an)
2.性质:
线性表中的数据元素之间是有顺序的:
 a0只有一个后继,an只有一个前驱,ai(0<i<n)既有后继也有前驱;
 线性表可以逐项访问和顺序存储:
3.操作线性表
  创建线性表
 销毁线性表
删除一个元素.
添加一个元素
  清空线性表
缺点:如果链表很大,插入或删除元素会牵动很多元素的移动,时间复杂度增大。
4.线性表的存储结构
顺序存储结构(在物理内存上是相邻的) 
链式存储结构:
定义:每个节点不仅包含数据信息域,而且还需存储后继节点的指针。
单向链表包括三种内型的节点:
表头节点:
第一个节点,它不是一个数据元素,它包含指向一个数据元素的指针以及链表自身的一些信息。
数据节点:
尾节点:即数据节点,指向下一个节点的指针为空。
 
不多说了上菜吧:
 
  1. #ifndef _SEQLIST_H_  
  2. #define _SEQLIST_H_  
  3.  
  4. typedef void SeqList;          //viod 为空内型,数据分封装思想  
  5. typedef void SeqListNode;  
  6.  
  7. SeqList* SeqList_Create(int capacity);  //该方法用于创建并且返回一个空的线性表  
  8.  
  9. void SeqList_Destroy(SeqList* list);  //该方法用于销毁一个线性表list  
  10.  
  11. void SeqList_Clear(SeqList* list);   //该方法用于将一个线性表list中的所有元素清空  
  12.                                   //使得线性表回到创建时的初始状态  
  13.  
  14. int SeqList_Length(SeqList* list);  //该方法用于返回一个线性表list中的所有元素个数  
  15.  
  16. int SeqList_Capacity(SeqList* list);//该方法用于返回一个线性表list的空间容量  
  17.                               
  18. int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);//该方法用于向一个线性表list的pos位置处插入新元素node  
  19.                                                         //   返回值为1表示插入成功,0表示插入失败  
  20. SeqListNode* SeqList_Get(SeqList* list, int pos);  //   该方法用于获取一个线性表list的pos位置处的元素  
  21.                                                     //  返回值为pos位置处的元素,NULL表示获取失败  
  22.  
  23. SeqListNode* SeqList_Delete(SeqList* list, int pos);//该方法用于删除一个线性表list的pos位置处的元素  
  24.                                                 // 返回值为被删除的元素,NULL表示删除失败  
  25.  
  26. #endif  
  27.  
seqList.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() // O(1)  
  12. {  
  13.     TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkList));  
  14.       
  15.     if( ret != NULL )  
  16.     {  
  17.         ret->length = 0;  
  18.         ret->header.next = NULL;  
  19.     }  
  20.       
  21.     return ret;  
  22. }  
  23.  
  24. void LinkList_Destroy(LinkList* list) // O(1)  
  25. {  
  26.     free(list);  
  27. }  
  28.  
  29. void LinkList_Clear(LinkList* list) // O(1)  
  30. {  
  31.     TLinkList* sList = (TLinkList*)list;  
  32.       
  33.     if( sList != NULL )  
  34.     {  
  35.         sList->length = 0;  
  36.         sList->header.next = NULL;  
  37.     }  
  38. }  
  39.  
  40. int LinkList_Length(LinkList* list) // O(1)  
  41. {  
  42.     TLinkList* sList = (TLinkList*)list;  
  43.     int ret = -1;  
  44.       
  45.     if( sList != NULL )  
  46.     {  
  47.         ret = sList->length;  
  48.     }  
  49.       
  50.     return ret;  
  51. }  
  52.  
  53. int LinkList_Insert(LinkList* list, LinkListNode* node, int pos) // O(n)  
  54. {   
  55.     TLinkList* sList = (TLinkList*)list;  
  56.     int ret = (sList != NULL) && (pos >= 0) && (node != NULL);  
  57.     int i = 0;  
  58.       
  59.     if( ret )  
  60.     {  
  61.         LinkListNode* current = (LinkListNode*)sList;  
  62.           
  63.         for(i=0; (i<pos) && (current->next != NULL); i++)  
  64.         {  
  65.             current = current->next;  
  66.         }  
  67.           
  68.         node->next = current->next;  
  69.         current->next = node;  
  70.           
  71.         sList->length++;  
  72.     }  
  73.       
  74.     return ret;  
  75. }  
  76.  
  77. LinkListNode* LinkList_Get(LinkList* list, int pos) // O(n)  
  78. {  
  79.     TLinkList* sList = (TLinkList*)list;  
  80.     LinkListNode* ret = NULL;  
  81.     int i = 0;  
  82.       
  83.     if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )  
  84.     {  
  85.         LinkListNode* current = (LinkListNode*)sList;  
  86.           
  87.         for(i=0; i<pos; i++)  
  88.         {  
  89.             current = current->next;  
  90.         }  
  91.           
  92.         ret = current->next;  
  93.     }  
  94.       
  95.     return ret;  
  96. }  
  97.  
  98. LinkListNode* LinkList_Delete(LinkList* list, int pos) // O(n)  
  99. {  
  100.     TLinkList* sList = (TLinkList*)list;  
  101.     LinkListNode* ret = NULL;  
  102.     int i = 0;  
  103.       
  104.     if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )  
  105.     {  
  106.         LinkListNode* current = (LinkListNode*)sList;  
  107.           
  108.         for(i=0; i<pos; i++)  
  109.         {  
  110.             current = current->next;  
  111.         }  
  112.           
  113.         ret = current->next;  
  114.         current->next = ret->next;  
  115.           
  116.         sList->length--;  
  117.     }  
  118.       
  119.     return ret;  
  120. }  
最后
main.c
 
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include "LinkList.h"  
  4.  
  5. /* run this program using the console pauser or add your own getch, system("pause") or input loop */ 
  6.  
  7. struct Value  
  8. {  
  9.     LinkListNode header;  
  10.     int v;  
  11. };  
  12.  
  13. int main(int argc, char *argv[])   
  14. {  
  15.     int i = 0;  
  16.     LinkList* list = LinkList_Create();  
  17.       
  18.     struct Value v1;  
  19.     struct Value v2;  
  20.     struct Value v3;  
  21.     struct Value v4;  
  22.     struct Value v5;  
  23.       
  24.     v1.v = 1;  
  25.     v2.v = 2;  
  26.     v3.v = 3;  
  27.     v4.v = 4;  
  28.     v5.v = 5;  
  29.       
  30.     LinkList_Insert(list, (LinkListNode*)&v1, LinkList_Length(list));//插入到链表最后  
  31.     LinkList_Insert(list, (LinkListNode*)&v2, LinkList_Length(list));  
  32.     LinkList_Insert(list, (LinkListNode*)&v3, LinkList_Length(list));  
  33.     LinkList_Insert(list, (LinkListNode*)&v4, LinkList_Length(list));  
  34.     LinkList_Insert(list, (LinkListNode*)&v5, LinkList_Length(list));  
  35.       
  36.     for(i=0; i<LinkList_Length(list); i++) //从链尾逐个输出链表元素  
  37.     {  
  38.         struct Value* pv = (struct Value*)LinkList_Get(list, i);  
  39.           
  40.         printf("%d\n", pv->v);  
  41.     }  
  42.       
  43.     while( LinkList_Length(list) > 0 )  
  44.     {  
  45.         struct Value* pv = (struct Value*)LinkList_Delete(list, 0);  
  46.           
  47.         printf("%d\n", pv->v);  
  48.     }  
  49.       
  50.     LinkList_Destroy(list);  
  51.       
  52.     return 0;  
  53. }  

可以参考数据封装,指针操作等算法!

还有一个链式存储工程,见附件包!