[关闭]
@Arbalest-Laevatain 2018-10-15T03:10:15.000000Z 字数 2492 阅读 645

带头结点的单链表

未分类


为什么我们需要带头结点的单链表?

因为在原来的单链表中,每次在某个节点前面插入元素,都需要先找到该节点的前驱结点才可实现插入操作,那么如果要在第一个结点前面插入元素,该怎么做?这是会带来困难,所以我们需要有一个不存储数据的头结点。
而且只有带头结点的单链表才可以就地逆置

类型定义同单链表:

  1. typedef struct LNode {
  2. ElemType data;
  3. struct LNode *next;
  4. } LNode, *LinkList; // 结点和结点指针类型

相关操作

初始化

判断是否为空

  1. Status ListEmpty_L(LinkList L)
  2. /* 判定带头结点单链表L是否为空链表。 */
  3. /* 若L是空链表,则返回TRUE,否则FALSE。*/
  4. {
  5. if (L->next == NULL)
  6. return TRUE;
  7. else
  8. return FALSE;
  9. }

销毁

注意:清空与销毁的区别
清空:只是把元素从链表里面去掉
销毁:把元素全部去掉之后,还要释放头结点的空间

  1. Status DestroyList_L(LinkList &L)
  2. /* 销毁带头结点单链表L,并返回OK。*/
  3. {
  4. LinkList p,q;
  5. LinkList a,b,c;
  6. p = L->next;
  7. if (p == NULL)
  8. {
  9. free(L);
  10. return OK;
  11. }
  12. while (p != NULL)
  13. {
  14. q = p;
  15. p = p->next;
  16. free(q);
  17. }
  18. free(L);
  19. return OK;
  20. }

清空

  1. Status ClearList_L(LinkList &L)
  2. /* 将带头结点单链表L置为空表,并返回OK。*/
  3. /* 若L不是带头结点单链表,则返回ERROR。 */
  4. {
  5. if (NULL == L)
  6. return ERROR;
  7. LinkList p,q;
  8. LinkList a,b,c;
  9. p = L->next;
  10. if (p == NULL)
  11. return OK;
  12. while (p != NULL)
  13. {
  14. q = p;
  15. p = p->next;
  16. free(q);
  17. }
  18. L->next = NULL;
  19. return OK;
  20. }

求链表的长度

  1. int ListLength_L(LinkList L)
  2. /* 求带头结点单链表L的长度,并返回长度值。*/
  3. /* 若L不是带头结点单链表,则返回-1。 */
  4. {
  5. if (NULL == L)
  6. return -1;
  7. LinkList p;
  8. p = L->next;
  9. int num = 0;
  10. while (p != NULL)
  11. {
  12. p = p->next;
  13. num++;
  14. }
  15. return num;
  16. }

在第i各位值插入元素

  1. Status Insert_L(LinkList L, int i, ElemType e)
  2. /* 在带头结点单链表L插入第i元素e,并返回OK。*/
  3. /* 若参数不合理,则返回ERROR。 */
  4. {
  5. LinkList p = L;
  6. if (NULL == p || i <1)
  7. return ERROR;
  8. int num = 1;
  9. while (p->next != NULL && num<i)
  10. {
  11. p = p->next;
  12. num++;
  13. }
  14. if (num <i)
  15. return ERROR;
  16. LinkList m;
  17. m = (LinkList) malloc (sizeof(LNode));
  18. m->next = p->next;
  19. p->next = m;
  20. m->data = e;
  21. return OK;
  22. }

删除第i个节点,并把数据返回

  1. Status Delete_L(LinkList L, int i, ElemType &e)
  2. /* 在带头结点单链表L删除第i元素到e,并返回OK。*/
  3. /* 若参数不合理,则返回ERROR。 */
  4. {
  5. LinkList p = L;
  6. LinkList q ;
  7. if (NULL == p || i <1)
  8. return ERROR;
  9. int num = 0;
  10. while (p->next != NULL && num<i)
  11. {
  12. q = p;
  13. p = p->next;
  14. num++;
  15. }
  16. if (i > num)
  17. return ERROR;
  18. LinkList m = p;
  19. e = m->data;
  20. q->next = m->next;
  21. //free(m);
  22. return OK;
  23. }

测试代码

  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4. #define TRUE 1
  5. #define FALSE 0
  6. #define OK 1
  7. #define ERROR 0
  8. #define OVERFLOW -1
  9. typedef int Status;
  10. #define ElemType char
  11. typedef struct LNode {
  12. ElemType data;
  13. struct LNode *next;
  14. } LNode, *LinkList;
  15. Status Insert_L(LinkList L, int i, ElemType e)
  16. /* 在带头结点单链表L插入第i元素e,并返回OK。*/
  17. /* 若参数不合理,则返回ERROR。 */
  18. {
  19. LinkList p = L;
  20. if (NULL == p || i <1)
  21. return ERROR;
  22. int num = 1;
  23. while (p->next != NULL && num<i)
  24. {
  25. p = p->next;
  26. num++;
  27. }
  28. if (num <i)
  29. return ERROR;
  30. LinkList m;
  31. m = (LinkList)malloc(sizeof(LinkList));
  32. m->next = p->next;
  33. p->next = m;
  34. m->data = e;
  35. return OK;
  36. }
  37. //初始化带头结点的单链表函数
  38. void InitLinkList(LinkList &L)
  39. {
  40. LinkList q;
  41. char c[] = {"abcdefg"};
  42. q = L;
  43. //q->next = L->next;
  44. for (int i = 0; i < 7; i++)
  45. {
  46. LinkList p = (LinkList)malloc(sizeof(LinkList));
  47. p->data = c[i];
  48. p->next = q->next;
  49. q->next = p;
  50. q = q->next;
  51. }
  52. //L = q;
  53. }
  54. //定义打印函数
  55. void printLinkLIst(LinkList &L)
  56. {
  57. LinkList p;
  58. p = L->next;
  59. while (p != NULL)
  60. {
  61. cout << p->data;
  62. p = p->next;
  63. }
  64. cout << endl;
  65. }
  66. int main()
  67. {
  68. //定义一个带头结点的单链表
  69. //L3 = ( abcdefg)
  70. cout<<Fib2(0)<<endl;
  71. return 0;
  72. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注