链表创建和链表遍历算法的演示_C语言

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

  1 /*24_链表创建和链表遍历算法的演示*/
  2 # include <stdio.h>
  3 # include <malloc.h>
  4 # include <stdlib.h>
  5
  6 typedef struct Node
  7 {
  8     int data;//数据域
  9     struct Node * pNext;//指针域
 10 }NODE, *PNODE;//NODE等价于struct Node
 11
 12               //函数声明
 13 PNODE create_list(void);
 14 void traverse_list(PNODE pHead);
 15
 16 int main(void)
 17 {
 18     PNODE pHead = NULL;//等价于 struct Node * pHead = NULL;把首节点的地址赋值给pHead(在一个链表中首节点和尾节点后面都是NULL,没有其他元素)
 19                        //PNODE 等价于struct Node *
 20     pHead = create_list();
 21     traverse_list(pHead);
 22
 23
 24     return 0;
 25 }
 26
 27 //创建地址类型的地址,因为create_list 这个函数是要返回的地址
 28 //功能就是把头节点的地址返回,最终才能头节点才能指向一个链表
 29 PNODE create_list(void)
 30 {
 31     int len;//存放有效节点的个数
 32     int i;
 33     int val;//用来临时存放用户熟入的节点是值
 34
 35 //前面说过只要是找到头节点,对于链表的操作就方便了,所以在这里我们首先先定义头节点
 36     PNODE pHead = (PNODE)malloc(sizeof(NODE));//定义头节点(不存放有效数据)
 37     if (NULL == pHead) //如果指针指向为空,则动态内存分配失败
 38     {
 39         printf("分配失败,程序终止!\n");
 40         exit(-1);
 41     }
 42     PNODE pTail = pHead; //pHead 是指向头节点的,如果用户是输入节点的个数是0,那么只有一个“头节点”
 43     pTail->data = NULL; //此时把pHead 赋值给pTail,则就合理l,然后指针域为空(和初始化差不多...)
 44
 45     printf("请您输入要生成链表节点的个数:len = ");
 46     scanf("%d", &len);
 47     for (i = 0; i < len; i++)
 48     {
 49         printf("请输入第%d个节点的值",i + 1);
 50         scanf("%d", &val);
 51         PNODE pNew = (PNODE)malloc(sizeof(NODE));//创建新节点,使之指针都指向每一个节点(循环了len次)
 52         if (NULL == pNew) //如果指针指向为空,则动态内存分配失败
 53         {
 54             printf("分配失败,程序终止!\n");
 55             exit(-1);
 56         }
 57         /*
 58
 59         pNew->data = val;//一个临时的节点
 60         pHead->pNext = pNew;//把pNew挂到pHead上
 61         pNew->pNext=NULL; //这个临时的节点最末尾是空
 62
 63         */
 64
 65
 66         //上面/**/注释掉的这行代码是有问题的,上面注释掉的代码的含义是分别把头节点后面的节点都挂在头节点上,
 67         //导致头节点后面的节点的指针域丢失,而我们想的是只是把第一个节点挂在头节点上,后面的依次进行,即把第二个
 68         //节点挂在第一个节点的指针域上,依次类推,很明显上面所注释掉的代码是实现不了这个功能的
 69
 70         //下面是改进之后的
 71         pNew->data = val; //把有效数据存入pNEW
 72         pTail->pNext = pNew; //把pNew 挂在pTail的后面(也就是pTail指针域指向,依次串起来)
 73         pNew->pNext = NULL;//把pNew的指针域清空
 74         pTail = pNew;   //在把pNew赋值给pTai,这样就能循环,实现依次连接(而我们想的是只是把第一个节点挂在头节点上,后面的依次进行,即把第二个
 75                         //节点挂在第一个节点的指针域上)
 76     }
 77     return pHead;
 78 }
 79
 80
 81 //遍历函数并不需要返回值,参数还是要有的,要不然怎么知道是对哪个对象进行的遍历!
 82 //还是定义指针变量 PNODE pHead 因为 traverse_list(pHead)  调用的是地址
 83
 84
 85 /*
 86 链表的遍历写法的整体思路:
 87     1. 定义一个指针变量p指向第一个有效的节点
 88     2.判断这个节点的指针域是不是为空(如果不是就不是最后一个)
 89     3.不为空就输出此节点的有效数据,并且p-pNext来指向下一个节点(不能用p++哦!)
 90     4.如果为空的话,说明到来尾节点
 91 */
 92
 93
 94 void traverse_list(PNODE pHead)//怎样遍历,是不能像以前一样用数组的,以为数组是连续的,这里不连续
 95 {
 96     PNODE p = pHead->pNext;
 97
 98     while (NULL != p)
 99     {
100         printf("%d ", p->data);
101         p = p->pNext;
102     }
103     printf("\n");
104 }

运行截图:

吟诗一首:

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

时间: 2024-09-30 17:13:15

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

数据结构与算法基础之非循环单链表创建和链表遍历

1 #include<stdio.h> 2 #include<malloc.h> 3 #include<stdlib.h> 4 //函数声明 5 PNODE create_list();//返回值是链表头结点的地址 6 void traverse_list(PNODE pHead); 7 8 typedef struct Node{ 9 int data;//数据域 10 struct Node * pNext;//指针域 11 }NODE,*PNODE;//NODE等

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

非循环单链表插入结点伪算法讲解 q插入p之后的伪算法:第一种表示方法:r = p->pNext; // p->pNext表示的是所指向结点的指针域,指针域又是指向下一个结点的地址p->pNext = q; // q保存了那一块结点的地址.q是一个指针变量,存放那个结点的地址.q->pNext = r; 第二种表示方法:q->pNext = p->pNext; // q的指针域指向p后面一个结点p->pNext = q; // p的指针域指向q 删除非循环单链表结点

头插法链表的基本操作:创建空链表,插入结点,遍历链表,求链表长度,查找结点,删除结点

1 #include <stdio.h> 2 #include <stdlib.h> 3 /* 4 头插法链表的基本操作:创建空链表,插入节点,遍历输出节点数据,求链表长度,查找结点,删除结点. 5 */ 6 typedef struct node 7 { 8 int data; 9 struct node * next; 10 }NODE; 11 //创建空链表 12 NODE * createList() 13 { 14 NODE * head = (NODE *)malloc

单向链表的构建以及翻转算法_图文详解

单向链表的构建以及翻转算法 一.基本概念 单向链表的链接方向是单向的,其中每个结点都有指针成员变量指向链表中的下一个结点,访问链表时要从头节点(带头节点的链表)或存储首个数据的节点(不带头节点的链表)开始顺序查询.本文将以带头结点的非循环单向链表为例,其链表模型如下: 其中head为头结点(不存储数据).data节点存储数据.pNext存储下一节点的地址. 当单项链表不包含头结点时,链表首个节点便是所存储的第一个数据的节点:当单项链表是循环链表时,链表中存储最后一个数据的节点中pNext指向的不

创建单链表

还记得创建单链表的这些代码还是大学时候写过,现在再重新写一写,为面试做准备吧: 创建单链表的两种形式:头插法和尾插法 // 演示创建2种单链表的方式 // [C++基础]单链表.cpp #include "stdafx.h" #include <iostream> using namespace std; struct link { int data; link *next; }; //头插法建立单链表 link *creatLink_head(link *head) {

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

最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合,一种面向过程的MVC的感觉. 而这一切的基础就在于对链表的创建.删除.输出.写入文件.从文件读出...... 本篇文章在于巩固链表的基础知识(整理自<C语言程序设计教程--人民邮电出版社>第十章),只对链表的概念及增删改查作出探讨,欢迎指教. 一.链表结构和静态/动态链表 二.单链表的建立与遍历

链表 创建 插入 删除 查找 合并

最近学习了一下单链表的操作,将代码保存如下,供以后查看. 链表创建: 1.先建立一个不含数据的头指针*head,头指针的链接域为NULL. 2.声明一个用于暂存新申请空间的指针*pc,一个用于保存创建的链表的指针*r,令*r指向*head. 3.在循环中,为指针*pc申请空间,并给数据域赋值,head->next = pc, pc->next = NULL, head = pc. #define _CRT_SECURE_NO_DEPRECATE /*取消scanf,printf不安全之类的错误

实现你的第一个链表——手把手教你创建单向链表

写在前面 这是我原发在独立博客上的文章,用来帮助初学链表的同学们理解链表,现在发在这里供大家批评. 为什么要使用链表? 这是我们首先要考虑的一个问题,我们之前已经学过了数组的使用,可以方便快速地存储大量数据,为何还要引入"链表"的概念呢? 比如我们让50个小朋友排排坐,那事情是很好办的:只需要准备50个椅子,让小朋友们依次坐好即可,这就是数组的使用.但是,如果我们预先不知道有多少小朋友,那事情就不好办了,我们可能需要准备大量的椅子,但这就会浪费很多空间:此外,如果一个新来的小朋友必须进

数据结构和算法--3链表(单向链表、双向链表、环形单向链表和约瑟夫问题)

链表 链表是以节点的方式来存储 每个节点包含data域和next域,指向下一个节点 链表的各个节点不一定是连续存储 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定 单向列表 最大特点是可以将物理地址上不连续的数据连接起来,通过指针来对物理地址进行操作,实现增删改查等功能. 单链表分为两种:有头链表和无头链表. 有头节点的增删改查 定义一个单链表的类: //定义一个SingleLinkedList,单链表,管理HeroNode class SingleLinkedList{ //初始