数据结构---单链表实现(源码)

第二章   单链表

  1. /*****************************SqList********************************** 
  2. Date:2008.10.23 
  3. Author:ZORO 
  4. WebSite:http://blog.csdn.net/sevenhu 
  5. ====================================================================== 
  6. 参考资料: 
  7. BOOK:数据结构(C语言版)     严蔚敏     清华大学出版社 
  8. Page:37 
  9. ====================================================================== 
  10. ADT LinkList  { 
  11.     InitList(&L)
  12.     DestroyList(&L) 
  13.     ListAdd(&L,q)  
  14.     LocateElem(L,data,&i) 
  15.     ListInsert(&L, i, data) 
  16.     ListDelete(&L, i) 
  17.     ListTraverse(L) 
  18. }ADT LinkList 
  19. ====================================================================== 
  20. note:VC++ 6.0测试通过。 
  21. *********************************************************************/ 
  22. #include <iostream>
  23. #define     OK      1
  24. #define     ERROR   0
  25. #define     NULL    0
  26. #define     FALSE   0
  27. using namespace std;
  28. typedef int Status;
  29. typedef struct  LNode{                          //结点类型
  30.     int data;
  31.     struct LNode * next;
  32. }LNode, *Link;
  33. typedef struct {                                //链表类型
  34.     Link head,tail;                             //链表头结点和尾结点
  35.     int len;                                    //链表长度
  36. }LinkList;
  37. Status MakeNode(Link &p, int data)
  38. {
  39.     //新建结点
  40.     Link q = (Link)malloc(sizeof(LNode));
  41.     if (!q)  {                                  //分配空间失败
  42.         return ERROR;
  43.     }
  44.     q ->data = data;
  45.     q ->next = NULL;
  46.     p = q;
  47.     q = NULL;                                   //q不再有用
  48.     return OK;
  49. }//MakeNode
  50. Status InitList(LinkList &L)
  51. {
  52.     //初始化链表
  53.     L.head = NULL;
  54.     L.tail = NULL;
  55.     L.len = 0;
  56.     
  57.     return OK;
  58. }//InitList
  59. Status ClearList(LinkList &L)
  60. {
  61.     //清空链表并释放空间
  62.     Link p,q;
  63.     p = L.head ;
  64.     q = p->next ;
  65.     while (q){                                  //循环释放
  66.         free(p);
  67.         p = q;
  68.         q = p->next ;
  69.     }
  70.     free(p);
  71.     p = q = NULL;
  72.     
  73.     L.head = NULL;
  74.     L.tail = NULL;
  75.     L.len = 0;
  76.     return OK;
  77. }//ClearList
  78. Status DestroyList(LinkList &L)
  79. {
  80.     //销毁表
  81.     ClearList(L);
  82.     return OK;
  83. }//DestroyList
  84. Status InsHead(LinkList &L, Link &s)
  85. {
  86.     //插入头结点
  87.     if (!s)  {
  88.         return ERROR;
  89.     }
  90.     Link h = L.head ;
  91.     L.head = s;
  92.     s->next = h;
  93.     ++L.len ;
  94.         
  95.     return OK;
  96. }//InsHead
  97. Status DelHead(LinkList &L)
  98. {
  99.     //删除头结点
  100.     Link p = L.head ;
  101.     L.head = p->next ;                              //修改L表中的头结点
  102.     --L.len ;
  103.     free(p);
  104.     p = NULL;
  105.     return OK;
  106. }//DelHead
  107. Status ListDel(LinkList &L, int i)
  108. {
  109.     //在L表中删除第i个元素
  110.     if (i > L.len || i < 1)  {
  111.         return ERROR;
  112.     }
  113.     if (i == 1)  {                                  //如果删除第一个元素
  114.         DelHead(L);
  115.         return OK;
  116.     }
  117.     Link q = L.head;
  118.     if (i == L.len )  {                             //如果删除最后一个元素
  119.         while (q->next->next)  {
  120.             q = q->next ;
  121.         }
  122.         free(q->next) ;
  123.         L.tail = q;                                 //修改L表中的尾结点
  124.         q->next = NULL;                             //尾结点的指针域为空
  125.         --L.len ;
  126.         return OK;
  127.     }
  128.         
  129.     Link p;
  130.     for (int j = 0; j < i-1; ++j)  {                //判断元素位置
  131.         p = q;
  132.         q = q->next ;
  133.     }
  134.     p->next = q->next ;                             //删除元素
  135.     --L.len ;
  136.     free(q);
  137.     return OK;
  138. }//ListDel
  139. Status ListTraverse(LinkList L)
  140. {
  141.     //遍历单链表
  142.     Link p = L.head ;
  143.     while (p)  {
  144.         cout << p->data << " ";                                 //输出元素,并移向下一个元素
  145.         p = p->next ;
  146.     }
  147.     cout << endl << "共" << L.len << "个元素!" << endl;         //输出链表长度
  148.     return OK;
  149. }//ListTraverse
  150. Status ListAdd(LinkList &L, Link q)
  151. {
  152.     //增加元素
  153.     if (!L.head)  {                                             //第一个元素
  154.         L.head = q;
  155.         L.tail = q;
  156.     }
  157.     else {                                                      //不是第一个元素
  158.         Link p1 = L.head ;
  159.         Link p2;
  160.         while (p1)  {
  161.             p2 = p1;
  162.             p1 = p1->next ;
  163.         }
  164.         p2->next = q;
  165.         L.tail = q;
  166.     }
  167.     ++L.len;                                                    //加表长
  168.     return OK;
  169. }//ListAdd
  170. Status ListIns(LinkList &L, int i, int data)
  171. {
  172.     //在i个位置之前插入元素data,不能插在表的最后,如果插入最后请用ListAdd函数
  173.     if (i > L.len || i < 1)  {                                  //判断i值的合法性
  174.         return ERROR;
  175.     }
  176.     Link q;
  177.     MakeNode(q,data);                                           //给元素data创建一个新结点,并分配空间
  178.     
  179.     if (i == 1)  {                                              //如果在第一个位置插入
  180.         InsHead(L,q);                                           //调用插入头结点函数
  181.         return OK;
  182.     }
  183.     Link p = L.head ;
  184.     for (int j = 0; j < i-2; ++j)  {                            //判断位置
  185.         p = p->next ;
  186.     }
  187.     q ->next = p->next ;                                        //插入操作
  188.     p ->next = q;
  189.     ++L.len ;                                                   //加表长
  190.     return OK;
  191. }//ListIns
  192. Status LocateList(LinkList L, int data, int &i)
  193. {
  194.     //查找与data相等的值,由i返回位置
  195.     Link p = L.head ;
  196.     i = 0;
  197.     while (p)  {
  198.         ++i;
  199.         if (p->data == data)  {                                 //查找
  200.             return OK;
  201.         }
  202.         p = p->next ;
  203.     }
  204.     i = -1;                                                     //如果没有找到,位置为-1
  205.     return FALSE;
  206. }//LocateList
  207. int main()
  208. {
  209.     //测试数据
  210.     LinkList L;
  211.     Link q;
  212.     InitList(L);
  213.     for (int i = 0; i < 10; ++i)  {
  214.         MakeNode(q,i);
  215.         ListAdd(L,q);
  216.     }
  217.     ListTraverse(L);
  218.     cout << "在第9个位置插入100" << endl;
  219.     ListIns(L,9,100);
  220. //  ListIns(L,1,99);
  221.     cout << "成功插入!" << endl;
  222.     ListTraverse(L);
  223.     cout << "删除第五个元素!" << endl;
  224.     ListDel(L,11);
  225.     ListTraverse(L);
  226.     int index;
  227.     LocateList(L,8,index);
  228.     cout << "数字8在链表的第" << index << "个元素!" << endl;
  229.     
  230.     if (DestroyList(L) == OK) cout << "OK" << endl;
  231.     return 0;
  232. }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值