Chinaunix首页 | 论坛 | 博客
  • 博客访问: 36909
  • 博文数量: 19
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 230
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-13 00:47
文章分类

全部博文(19)

文章存档

2014年(6)

2013年(13)

我的朋友

分类: C/C++

2013-12-13 16:06:03

链表:                
            链表是一种物理
上非连续、非顺序的的逻辑顺序是通过链表中的链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储的数据域,另一个是存储下一个结点地址的域。 相比于,操作。
特点:
            的链式存储表示的特点是用一组任意的存储(这组存储单元可以是连续的,也可以是不连续的)。因此,为了表示每个与其直接后继数据元素 之间的逻辑关系,对数据元素 来说,除了其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。由这两部分信息组成一个"结点"(如概述旁的图所示),表示线性表中一个。线性表的链式存储表示,有一个缺点就是要找一个数,必须要从头开始找起,十分麻烦。

//头文件

点击(此处)折叠或打开

  1. #ifndef _LINKLIST_H_
  2. #define _LINKLIST_H_

  3. typedef void LinkList;

  4. typedef struct _tag_LinkListNode LinkListNode;
  5. struct _tag_LinkListNode
  6. {
  7.     LinkListNode* next; //定义结点指针
  8. };
  9. LinkList* LinkList_Create();

  10. void LinkList_Destroy(LinkList* list);

  11. void LinkList_Clear(LinkList* list);

  12. int LinkList_Length(LinkList* list);

  13. int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);

  14. LinkListNode* LinkList_Get(LinkList* list, int pos);

  15. LinkListNode* LinkList_Delete(LinkList* list, int pos);

  16. #endif
//C源文件

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include "LinkList.h"

  4. typedef struct _tag_LinkList   //定义头结点
  5. {
  6.     LinkListNode header; //定义指针指向第一个元素
  7.     int length; //链表长度
  8. }TLinkList;

  9. LinkList* LinkList_Create()
  10. {
  11.     TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkList));
  12.     //为结点分配空间
  13.     if( ret != NULL)
  14.     {
  15.         ret->length = 0;
  16.         ret->header.next = NULL;
  17.     }
  18.     return ret;
  19. }

  20. void LinkList_Destroy(LinkList* list)
  21. {
  22.     free(list);
  23. }

  24. void LinkList_Clear(LinkList* list)
  25. {
  26.     TLinkList* sList = (TLinkList*)list;

  27.     if( sList != NULL )
  28.     {
  29.         sList->length = 0;
  30.         sList->header.next = NULL;
  31.     }
  32. }

  33. int LinkList_Length(LinkList* list)
  34. {
  35.     TLinkList* sList = (TLinkList*)list;

  36.     int ret = -1;
  37.     if( sList != NULL )
  38.     {
  39.         ret = sList->length;
  40.     }
  41.     return ret;
  42. }

  43. int LinkList_Insert(LinkList* list, LinkListNode* node, int pos)
  44. {
  45.     TLinkList* sList = (TLinkList*)list;

  46.     int ret = 1;
  47.     int i = 0;

  48.     ret = ret && (sList != NULL); //判断链表是否合法
  49.     ret = ret && (pos >= 0) && (node->next != NULL);
  50.     //判断插入位置是否合法

  51.     if( ret )
  52.     {
  53.         LinkListNode* current = (LinkListNode*)sList;
  54.         for(i=0; ( (i<pos) && (current->next != NULL) ); i++)
  55.         {
  56.             current = current->next;
  57.         }

  58.         node->next = current->next;
  59.         current->next = node;
  60.         sList->length++;
  61.     }

  62.     return ret;
  63. }

  64. LinkListNode* LinkList_Get(LinkList* list, int pos)
  65. {
  66.     TLinkList* sList = (TLinkList*)list;

  67.     LinkListNode* ret = NULL;
  68.     int i = 0;

  69.     if( (sList != NULL) && ((0<=pos) && (pos<=LinkList_Length(sList))) )
  70.     {
  71.         LinkListNode* current = (LinkListNode*)sList;
  72.         for(i=0; i<pos; i++)
  73.         {
  74.             current = current->next;
  75.         }
  76.         ret = current->next;
  77.     }
  78.     return ret;
  79. }

  80. LinkListNode* LinkList_Delete(LinkList* list, int pos)
  81. {
  82.     TLinkList* sList = (TLinkList*)list;

  83.     LinkListNode* ret = NULL;
  84.     int i = 0;

  85.     if( (sList != NULL) && ((0<=pos) && (pos<sList->length)) )
  86.     {
  87.         LinkListNode* current = (LinkListNode*)sList;
  88.         for(i=0; i<pos; i++)
  89.         {
  90.             current = current->next;
  91.         }
  92.         ret = current->next;
  93.         current->next = ret->next;

  94.         sList->length--;
  95.     }
  96.     return ret;
  97. }
//测试文件

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "LinkList.h"

  4. struct value    //定义数据元素
  5. {
  6.     LinkListNode header;  //定义指针域
  7.     int v;                //定义数据域
  8. };

  9. int main()
  10. {
  11.     LinkList* list = LinkList_Create();
  12.     int i;

  13.     struct value v1;
  14.     struct value v2;
  15.     struct value v3;
  16.     struct value v4;
  17.     struct value v5;

  18.     v1.v = 1;
  19.     v2.v = 2;
  20.     v3.v = 3;
  21.     v4.v = 4;
  22.     v5.v = 5;

  23.     LinkList_Insert(list,(LinkListNode*)&v1,LinkList_Length(list));
  24.     LinkList_Insert(list,(LinkListNode*)&v2,LinkList_Length(list));
  25.     LinkList_Insert(list,(LinkListNode*)&v3,LinkList_Length(list));
  26.     LinkList_Insert(list,(LinkListNode*)&v4,LinkList_Length(list));
  27.     LinkList_Insert(list,(LinkListNode*)&v5,LinkList_Length(list));

  28.     for(i=0; i<LinkList_Length(list); i++)
  29.     {
  30.         struct value* pv = (struct value*)LinkList_Get(list,i);

  31.         printf("%d\n",pv->v);
  32.     }

  33.     while( LinkList_Length(list)>0 )
  34.     {
  35.         struct value* pv = (struct value*)LinkList_Delete(list,0);

  36.         printf("%d\n",pv->v);
  37.     }

  38.     LinkList_Destroy(list);

  39.     return 0;
  40. }

阅读(454) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~