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

仰望星空

文章分类
文章存档

2016年(22)

2015年(22)

我的朋友

分类: C/C++

2015-12-06 14:41:43

    单链表是线性表的一种,是数据结构中重要的内容,具有灵活和节省空间的特点,至于单链表的具体概念我就不说了,有很多人都说的比较详细了,之所以写这个博客是因为,我个人感觉,单链表初始化话的时候,有一个地方我一直不是很明白,想了一会儿才明白的,所以这篇博文的也就是对这个点的讲解算是创新点,其他的有很多大神都写的非常好。
    大家可以参考这篇博文:http://blog.csdn.net/hackbuteer1/article/details/6591486/

下面就是我用代码实现的单链表的创建、查找、插入和删除等操作的代码:(代码写的比较垃圾,将就着看看吧)

点击(此处)折叠或打开

  1. /*
  2. ======================================================================================
  3. 难点:p2->next = p1;将p1的地址赋给p2-next,这样讲P2和p1链接了起来
  4.      p2 = p1;是将p1的地址给了p2,实际上是一个地址转移的问题,也就是p2原来的地址
  5.      不要的,转移到p1这里来了接下来,实际上已经增加了原来p1节点的一个数值了。
  6.      后p1自己再开辟一个新的空间,然后再重复上边的过程,
  7. ======================================================================================
  8. */
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <malloc.h>

  12. typedef struct student //单链表的固定结构体形式
  13. {
  14.     int num;
  15.     struct student *next;
  16. }list;


  17. list *ListCreate()
  18. {
  19.     list *head, *p1, *p2;
  20.     head = (list *)malloc(sizeof(list));
  21.     //head->num = 99/0/NULL;
  22.     //head->next = NUll/p1/2; // 这两句加上去掉都可以的,由此可以知道head是必须有的,起到
  23.     p2 = head; // 指针的作用,但他的值是什么,以及其next指向哪里没有影响

  24.     p1 = (list *)malloc(sizeof(list));
  25.     printf("请输入一个数值,输入0时结束:");
  26.     scanf("%d", &(p1->num));

  27.     while(p1->num != 0)
  28.     {
  29.         p2->next = p1;
  30.         p2 = p1; //理解这两句是精髓
  31.     
  32.         p1 = (list *)malloc(sizeof(list)); //还是开辟
  33.         printf("请输入一串数值,输入0时结束:");
  34.         scanf("%d", &(p1->num));
  35.     }
  36.     p2->next = NULL; //最后一个节点指向的是空

  37.     return head;
  38. }


  39. list *ListFind(list *p, int n) //查找到链表p第n个节点
  40. {
  41.     while(n) //一共执行n次,从head开始,正好是到第n个节点
  42.     {
  43.        p = p->next;
  44.        if(p == NULL)
  45.            return 0;
  46.      n--;
  47.     }
  48.     return p;
  49. }


  50. int ListLen(list *p) //    求单链表节点的个数
  51. {
  52.     int i = 0;
  53.     while(p != NULL)
  54.     {
  55.         i++;
  56.         p = p->next;
  57.     }
  58.     return i-1;
  59. }


  60. int ListInsert(list *p, int n, int nu) //单链表的第n个位置上插入数组nu,后边的数值向后移动
  61. {
  62.     list *padd, *q; //padd是新的节点
  63.     padd = (list *)malloc(sizeof(list)); //开辟一个新节点地址空间
  64.     q =ListFind(p, n-1);

  65.     padd->num = nu;
  66.     padd->next = q->next; //单链表插入的三个步骤
  67.     q->next = padd;

  68.     return 1;
  69. }


  70. int ListDelete(list *p, int n) // 删除链表p上第n个节点的值
  71. {
  72.     list *q = ListFind(p, n-1);// q 是所要删除元素的前一个元素
  73.     list *ptr = ListFind(p, n);// ptr 是所要删除的元素

  74.     q->next = ptr->next; //删除只需要这一步即可

  75.     return 1;
  76. }

  77. int main()
  78. {
  79.     list *p, *q, *l;
  80.     p = ListCreate();
  81.     q = p->next; //从head的下一个元素开始

  82.     ListInsert(p, 3, 999); //在链表第三个位置上插入999
  83.     ListDelete(p, 4); //删除单链表第四个位置上的元素

  84.     printf("创建的链表为:");
  85.     while(q) //输出所以的链表
  86.     {
  87.         printf("%4d", q->num);
  88.         q = q->next;
  89.     }

  90.     printf("\n");

  91.     l = ListFind(p, 3); //找到链表第三个位置上的元素
  92.     printf("Find = %d\n", l->num);
  93.     printf("NUM = %d\n", ListLen(p)); //输出链表的总长度

  94.     return 0;
  95. }


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