今天搞了一个多小时,头是疼的,应该是没休息好吧,学习了数据结构这一节,感觉收益良多,下面贴上代码和心得:

 /*24_链表创建和链表遍历算法的演示*/
 # include <stdio.h>
 # include <malloc.h>
 # include <stdlib.h>

 typedef struct Node
 {
     int data;//数据域
     struct Node * pNext;//指针域
 }NODE, *PNODE;//NODE等价于struct Node

               //函数声明
 PNODE create_list(void);
 void traverse_list(PNODE pHead); 

 int main(void)
 {
     PNODE pHead = NULL;//等价于 struct Node * pHead = NULL;把首节点的地址赋值给pHead(在一个链表中首节点和尾节点后面都是NULL,没有其他元素)
                        //PNODE 等价于struct Node *
     pHead = create_list();
     traverse_list(pHead);

     ;
 }

 //创建地址类型的地址,因为create_list 这个函数是要返回的地址
 //功能就是把头节点的地址返回,最终才能头节点才能指向一个链表
 PNODE create_list(void)
 {
     int len;//存放有效节点的个数
     int i;
     int val;//用来临时存放用户熟入的节点是值

 //前面说过只要是找到头节点,对于链表的操作就方便了,所以在这里我们首先先定义头节点
     PNODE pHead = (PNODE)malloc(sizeof(NODE));//定义头节点(不存放有效数据)
     if (NULL == pHead) //如果指针指向为空,则动态内存分配失败
     {
         printf("分配失败,程序终止!\n");
         exit(-);
     }
     PNODE pTail = pHead; //pHead 是指向头节点的,如果用户是输入节点的个数是0,那么只有一个“头节点”
     pTail->data = NULL; //此时把pHead 赋值给pTail,则就合理l,然后指针域为空(和初始化差不多...)

     printf("请您输入要生成链表节点的个数:len = ");
     scanf("%d", &len);
     ; i < len; i++)
     {
         printf();
         scanf("%d", &val);
         PNODE pNew = (PNODE)malloc(sizeof(NODE));//创建新节点,使之指针都指向每一个节点(循环了len次)
         if (NULL == pNew) //如果指针指向为空,则动态内存分配失败
         {
             printf("分配失败,程序终止!\n");
             exit(-);
         }
         /*

         pNew->data = val;//一个临时的节点
         pHead->pNext = pNew;//把pNew挂到pHead上
         pNew->pNext=NULL; //这个临时的节点最末尾是空

         */

         //上面/**/注释掉的这行代码是有问题的,上面注释掉的代码的含义是分别把头节点后面的节点都挂在头节点上,
         //导致头节点后面的节点的指针域丢失,而我们想的是只是把第一个节点挂在头节点上,后面的依次进行,即把第二个
         //节点挂在第一个节点的指针域上,依次类推,很明显上面所注释掉的代码是实现不了这个功能的

         //下面是改进之后的
         pNew->data = val; //把有效数据存入pNEW
         pTail->pNext = pNew; //把pNew 挂在pTail的后面(也就是pTail指针域指向,依次串起来)
         pNew->pNext = NULL;//把pNew的指针域清空
         pTail = pNew;   //在把pNew赋值给pTai,这样就能循环,实现依次连接(而我们想的是只是把第一个节点挂在头节点上,后面的依次进行,即把第二个
                         //节点挂在第一个节点的指针域上)
     }
     return pHead;
 }

 //遍历函数并不需要返回值,参数还是要有的,要不然怎么知道是对哪个对象进行的遍历!
 //还是定义指针变量 PNODE pHead 因为 traverse_list(pHead)  调用的是地址

 /*
 链表的遍历写法的整体思路:
     1. 定义一个指针变量p指向第一个有效的节点
     2.判断这个节点的指针域是不是为空(如果不是就不是最后一个)
     3.不为空就输出此节点的有效数据,并且p-pNext来指向下一个节点(不能用p++哦!)
     4.如果为空的话,说明到来尾节点
 */

 void traverse_list(PNODE pHead)//怎样遍历,是不能像以前一样用数组的,以为数组是连续的,这里不连续
 {
     PNODE p = pHead->pNext;

     while (NULL != p)
     {
         printf("%d ", p->data);
         p = p->pNext;
     }
     printf("\n");
 }

运行截图:

吟诗一首:

    精神经百炼,锋锐坚不挫。 ——刘过

链表创建和链表遍历算法的演示_C语言的更多相关文章

  1. 单链表的插入伪算法和用C语言创建单链表,并遍历

    非循环单链表插入结点伪算法讲解 q插入p之后的伪算法:第一种表示方法:r = p->pNext; // p->pNext表示的是所指向结点的指针域,指针域又是指向下一个结点的地址p-> ...

  2. 「C语言」单链表/双向链表的建立/遍历/插入/删除

    最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合, ...

  3. 【数据结构与算法】(二) c 语言链表的简单操作

    // // main.c // testLink // // Created by lan on 16/3/6. // Copyright © 2016年 lan. All rights reserv ...

  4. 链表习题(2)-一个集合用带头结点的单链表L表示,编写算法删除其值最大的结点。

    /*一个集合用带头结点的单链表L表示,编写算法删除其值最大的结点.*/ /* 算法思想:使用pre,p,premax,max四个指针,pre和p进行比较,premax和max进行最后的删除操作 通过遍 ...

  5. Project 1 :创建链表与显示链表

    目标:创建一个链表,并将链表输出.结构体中包括学号与分数.链表以输入学号为0作为结束.输出模版为 No.学号 Score:分数 输入样例: 10101 98 10102 97 10103 100 10 ...

  6. [PHP] 数据结构-链表创建-插入-删除-查找的PHP实现

    链表获取元素1.声明结点p指向链表第一个结点,j初始化1开始2.j<i,p指向下一结点,因为此时p是指向的p的next,因此不需要等于3.如果到末尾了,p还为null,就是没有查找到 插入元素1 ...

  7. [算法]在单链表和双链表中删除倒数第k个结点

    题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头 ...

  8. Python -二叉树 创建与遍历算法(很详细)

    树表示由边连接的节点.它是一个非线性的数据结构.它具有以下特性. 一个节点被标记为根节点. 除根节点之外的每个节点都与一个父节点关联. 每个节点可以有一个arbiatry编号的chid节点. 我们使用 ...

  9. c++ LeetCode (网易面试题和链表以及树篇) 五道算法例题代码详解(三)

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11209807.html 一.1道网易c++的面试题 我当时第一时间的解答方案 #include ...

随机推荐

  1. openface 训练数据集

    训练深度网络模型OpenFace还不是运用faceNet的model作为训练模型,所以在准确性上比faceNet要低,如果你只是做一个简单的分类,建议你看看官网的demo3(http://cmusat ...

  2. .net 系列:并发编程之一 并发编程的初步理论

    一.关于并发编程的几个误解 1)并发就是多线程 实际上多线程只是并发编程的一种形式而已,在C#中还有很多其他的并发编程技术,包括异步编程,并行编程,TPL数据流,响应式编程等.  2)只有大型服务器才 ...

  3. python解释执行原理(转载)

    Python解释执行原理 转自:http://l62s.iteye.com/blog/1481421 这里的解释执行是相对于编译执行而言的.我们都知道,使用C/C++之类的编译性语言编写的程序,是需要 ...

  4. 电子笔记本的思考(1)(ver0.3)

    章节:电子笔记本的思考(1)   陶哲轩在<解题·成长·快乐——陶哲轩教你学数学>中着重强调,用纸笔来“缓存”思维对于数学解题的重要性: 用选定的符号表达你所知道的信息,并画一个示意图.把 ...

  5. continue,break以及加上标签的使用(goto思路)

    代码例子在java编程思想70-73页.这里只是想做做总结 java中需要用到标签的唯一理由就是因为由循环嵌套的存在,而且想从多层嵌套循环中break或者continue. 因此,标签只能放在循环前面 ...

  6. keepalived结合nginx实现nginx高可用

    1.简介 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障.一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台 ...

  7. 数据结构之【栈】+十进制转d进制(堆栈数组模拟)

    其实这篇文章开出来主要是水文章%% %% 栈--后进先出的婊 特点:只能在某一端插入和删除的特殊的线性表 操作:进栈--PUSH->向栈顶插入元素 出栈--POP-->将栈顶元素删除 实现 ...

  8. OJ随笔——【1102-海明距离】——位运算

    题目如下: Description 海明距离是在指二进制情况下,一个整数变成另外一个整数需要翻转的位数.比如2转换到3需要翻转1位,所以2到3的海明距离是1.给你两个正整数x和y,(x,y<=1 ...

  9. Git版本号控制 为什么那么复杂 头大 (忍不住强烈吐槽)

    想把自己的源代码保存到云端.想到了用Github.com,然后便開始看怎么使用GIT. 一開始,没有接触之前,想的非常easy的.应该就跟SVN几乎相同吧.写好了提交就能够了. 只是使用了之后才发现根 ...

  10. OR1200中指令Cache的结构

    下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 12.3 ICache结构 OR1200中实现ICache的文件有or1200_ic_top.v.or1200_ic_fsm.v.o ...