Chinaunix首页 | 论坛 | 博客
  • 博客访问: 156359
  • 博文数量: 44
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 407
  • 用 户 组: 普通用户
  • 注册时间: 2015-11-10 13:28
个人简介

仰望星空

文章分类
文章存档

2016年(22)

2015年(22)

我的朋友

分类: C/C++

2015-12-12 21:54:56

一、  前几天学习了单向链表,这两天学双向循环链表感觉容易了许多,双向循环链表比单向链表的优势是能够知道后一个节点,向前访问,不需要像单向链表一样再从头开始访问。
    下面说一下我对头结点head的理解,前几天学单向链表的时候其实是没有真正理解的,其实头节点中保存的就是一个入口地址,也就是你链表第一个元素的地址,当你想要访问某个链表时,传递的也就是这个地址,比如说*p,他的入口地址也就是head就是p,通常我们得调用p = p->next;之后才能访问到链表的第一个节点。
   
二、 双向链表的学习还非常得益于这篇文章,将的特别好,值得收藏:http://blog.sina.com.cn/s/blog_7d44748b01013fsf.html
下面直接上代码,实现了双向循环链表的创建、查找、插入、删除等操作,插入主要是需要4步,删除需要3步
(1)插入:在p节点前插入s节点
                s->prior=p->prior
                s->next=p
                p->prior->next=s
                p->prior=s

(2)删除:删除p节点                 
                
p->prior->next=p->next
                p->next->prior=p->prior
                free(p)


三、代码如下

点击(此处)折叠或打开

  1. /*
  2. ========================================
  3.             双向循环链表
  4.         输入4个元素,按要求输出
  5. ========================================
  6. */
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <malloc.h>
  10. #include <stdlib.h>

  11. typedef struct DList
  12. {
  13.     int data;
  14.     struct Dlist *prior;
  15.     struct Dlist *next;

  16. }Dlist;

  17. Dlist *head; //将head定义成全局变量

  18. Dlist *DlistCreat(int n) //有n个节点
  19. { //创建双向循环链表
  20.     int i;
  21.     Dlist *p, *q;

  22.     head = (Dlist *)malloc(sizeof(Dlist));
  23.     head->data = 0;
  24.     p = head;

  25.     for(i = 0; i < n; i++)
  26.     {
  27.         q = (Dlist *)malloc(sizeof(Dlist));
  28.         printf("Input n num:");
  29.         scanf("%d", &(q->data));

  30.         p->next = q; // 顺向连接新结点
  31.         q->next = head; // 始终保持环形连接
  32.         q->prior = p; // 新结点的反向链接
  33.         p = q; // 为连接新节点做准备
  34.     }
  35.     head->prior = p; // 头结点的prior指向最后的结点,是实现双向环形链表的最后一步

  36.     return head;
  37. }


  38. void Sprint(Dlist *p)
  39. { // 顺向输出链表数据
  40.     p = p->next;
  41.     while(p != head)
  42.     {
  43.         printf("%3d", p->data);
  44.         p = p->next;
  45.     }
  46.     printf("\n");
  47. }

  48. void Nprint(Dlist *p)
  49. { // 反向输出链表数据
  50.     p = p->prior;
  51.     while(p != head)
  52.     {
  53.         printf("%3d", p->data);
  54.         p = p->prior;
  55.     }
  56.     printf("\n");
  57. }

  58. Dlist *DlistFind(Dlist *p, int n)
  59. { // 找到链表第n个位置的元素
  60.     int i;
  61.     //Dlist *p;
  62.     p = head->next;
  63.     for(i = 0; i < n; i++)
  64.     {
  65.         p = p->next;
  66.     }

  67.     return p->prior;
  68. }

  69. int DlistInsert(Dlist *q, int n, int num)
  70. { //在链表q的第n个位置上插入num
  71.     Dlist *p, *s, *m; /*其中m是个临时节点*/
  72.     p = DlistFind(q, n);

  73.     s = (Dlist *)malloc(sizeof(Dlist));
  74.     s->data = num;
  75.     
  76.     s->prior = p->prior; /*在p节点前插入需要以下4步*/
  77.     s->next = p;

  78.     m = p->prior;    m->next = s;

  79.     p->prior =s;

  80.     return 0;
  81. }

  82. int DlistDelete(Dlist *q, int n)
  83. {
  84.     //删除链表q中的第n个元素
  85.     Dlist *p, *m1, *m2; /*其中m1、m2都是临时节点*/
  86.     p = DlistFind(q, n);

  87.     m1 = p->prior; /*删除p需要以下两步*/
  88.     m1->next = p->next;

  89.     m2 = p->next;
  90.     m2->prior = p->prior;

  91.     free(p);
  92.     return 0;
  93. }

  94. int DlistCount(Dlist *p)
  95. { //输出链表p总的节点个数
  96.     int i = 0;
  97.     p = p->next;
  98.     while(p != head)
  99.     {
  100.         i++;
  101.         p = p->next;
  102.     }
  103.     return i;
  104. }

  105. int main()
  106. {
  107.     Dlist *p, *q;
  108.     int n = 4; /*有4个节点的链表*/
  109.     p = DlistCreat(n);
  110.     Sprint(p);
  111.     Nprint(p);

  112.     q = DlistFind(p, 2); /*找到在链表第二个位置的元素*/
  113.     printf("%3d\n", q->data);

  114.     DlistInsert(p, 2, 99); /*链表p第2个位置上插入99*/
  115.     Sprint(p);

  116.     DlistDelete(p, 3); /*删除链表p第3个位置上的元素*/
  117.     Sprint(p);

  118.     printf("%3d\n", DlistCount(p)); /*输出链表p总的节点个数*/
  119.     return 0;
  120. }

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