单向链表的创建和遍历

单向链表

简介

单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;
链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点;
链表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一个指向nuLL的指针。

创建单向链表

一个简单的单向链表

这里写图片描述

创建过程

说明:
图中的p为我代码中的p1
p1为我代码中的p2

首先定义一个结构体
struct node
 19 {
 20     int data;//存储数据
 21     struct node *next;//指向下一节点的指针
 22 };
建立节点
第一步
        p1 = (struct node *)malloc(LEN);//创建第一个节点
 34     p2 = p1;//如果创建成功,把第一个节点保存下来
 35     if(p1==NULL)//创建失败则返回0
 36     {
 37         printf("creat fail\n");
 38         return 0;
 39     }
 40     else
 41     {
 42         head = NULL;//头指针赋值为0
 43         printf("please input %d node\n",n+1);//打印这是第几个节点
 44         scanf("%d",&(p1->data));//向第一个节点输入数据
 45     }

这里写图片描述

第二步
        n = 1;
 48     head = p1;//让头指针指向第一个节点
 49     p2->next = NULL;//现在还没有创建第二个节点,因此第一个节点的next指向为空
 50 
 51     p2 = p1;//将p1保存到p2
 52 
 53     p1 = (struct node *)malloc(LEN);//p1指向新创建的节点
 54     printf("Please input %d node\n ", n+1);
 55     scanf("%d",&(p1->data));//向新节点输入数据

这里写图片描述

第三步

 57     p2->next = p1;//在第一个节点和第二个节点间建立连接

这里写图片描述

依次向下进行,创建整个链表

代码示例,创建三个节点


  1 /*********************************************************************************
  2  *      Copyright:  (C) 2017 fanmaolin<fanmaolinn@gmail.com>
  3  *                  All rights reserved.
  4  *
  5  *       Filename:  make2.c
  6  *    Description:  This file 
  7  *                 
  8  *        Version:  1.0.0(08/05/2017)
  9  *         Author:  fanmaolin <fanmaolinn@gmail.com>
 10  *      ChangeLog:  1, Release initial version on "08/05/2017 03:06:33 AM"
 11  *                 
 12  ********************************************************************************/
 13 
 14 #include <stdio.h>
 15 #include <stdlib.h>
 16 
 17 #define LEN sizeof(struct node)
 18 struct node
 19 {
 20     int data;//输入数据
 21     struct node *next;//指向下一个节点
 22 };
 23 
 24 int n;//统计是第几个节点
 25 
 26 int main(void)
 27 {
 28     struct node *head;//头节点指针
 29     struct node *p1 = NULL;//p1保存创建的新节点的地址
 30     struct node *p2 = NULL;//p2保存原链表最后一个节点的地址
 31 
 32     n = 0;
 33     p1 = (struct node *)malloc(LEN);//新建一个节点
 34     p2 = p1;
 35     if(p1==NULL)//创建节点失败
 36     {
 37         printf("creat fail\n");
 38         return 0;
 39     }
 40     else//创建节点成功
 41     {
 42         head = NULL;
 43         printf("please input %d node\n",n+1);
 44         scanf("%d",&(p1->data));//输入数据
 45     }
 46 
 47     n = 1;
 48     head = p1;//头指针指向第一个节点
 49     p2->next = NULL;//因为没有创建下一个节点,所以第一个节点的next指向为空
 50 
 51     p2 = p1;
 52 
 53     p1 = (struct node *)malloc(LEN);//新建第二个节点
 54     printf("Please input %d node\n ", n+1);
 55     scanf("%d",&(p1->data));
 56 
 57     p2->next = p1;//第一个节点的next指向第二个节点,把第一个节点和第二个节点连接
 58 
 59     p2 = p1;
 make2.c                                                                                                                            
 60 
 61     n = 2;
 62     p1 = (struct node *)malloc(LEN);//新建第三个节点
 63     printf("Please input %d node\n", n+1);
 64     scanf("%d", &(p1->data));
 65 
 66     p2->next = p1;//把第二个节点与第三个节点建立连接
 67     p2 = p1;
 68 
 69     p2->next = NULL;//第三个节点为最后一个节点,所以它的next指向为空
 70 
 71 
 72    //p1 = NULL;
 73 /*输出节点内容*/
 74     struct node *p;
 75     p = head;//从第一个节点开始
 76 
 77     printf("head is %o\n", head);
 78     do
 79     {
 80     printf("p is %o ,data is  %d, pnext is %o\n", p, p->data, p->next);//分别输出p的地址,data数据,下一个节点的地址
 81     p = p->next;//指向下一个节点
 82 
 83     }while(p != NULL);
 84 
 85 
 86     free(p1);//释放占用的内存
 87     p1 = NULL;//防止p1变为野指针
 88 }

执行结果:


[fanmaolin@Centeros lianbiao]$ gcc make2.c    
[fanmaolin@Centeros lianbiao]$ ./a.out     
please input 1 node
1
Please input 2 node
 2
Please input 3 node
3
head is 74710020
p is 74710020 ,data is  1, pnext is 74710060
p is 74710060 ,data is  2, pnext is 74710120
p is 74710120 ,data is  3, pnext is 0

总结:

上面是不带头结点的单向链表的创建方式,节点的创建最重要的是理清思路,从头结点开始,最后一个节点p2->next必须为空,表示一个链表的结束,还要注意释放内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值