创建和引用单链表
2016-04-09 12:06
260 查看
首先让我们看看单链表的定义:
单向链表:1:单链表有一个头节点head,指向链表在内存的首地址。
2:链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员(实际需要保存的数据)和指向下一个结构体类型节点的指针即下一个节点的地址
(事实上,此单链表是用于存放整型数据的动态数组)。
3:链表按此结构对各节点的访问需从链表的头找起,后续节点的地址由当前节点给出。
4:无论在表中访问那一个节点,都需要从链表的头开始,顺序向后查找。链表的尾节点由于无后续节点,其指针域为空,写作为NULL。
单链表的创建过程有以下几步:
1 ) 定义链表的数据结构;
2 ) 创建一个空表;
3 ) 利用malloc ( )函数向系统申请分配一个节点;
4 ) 将新节点的指针成员赋值为空。若是空表,将新节点连接到表头;若是非空表,将新节点接到表尾;
5 ) 判断一下是否有后续节点要接入链表,若有转到3 ),否则结束;
下面给出相应代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
//单链表中每个结点的存储地址是存放在其前趋结点next域中,而开始结点无前趋,故应设头指针head指向开始结点。
typedef struct link_list //定义了链表的数据结构
{
struct link_list *next;
int data;
}node;
node *creat(void)
//函数功能创建一个单链表 并返回
{
node *h=NULL;
node *p=NULL;
node *q=NULL;//h头节点 p存储数据的节点 q终端节点 其指针域为空
int x;
h = NULL;
//创建一个空表
printf("input x(x==0时结束输入):");
scanf("%d", &x);
while (x != 0)
{
p = (node *)malloc(sizeof(node)); //
函数malloc分配一个类型为ListNode的结点变量的空间, 并将其首地 址放入指针变量p中
p->data = x;
//链节的数据域存放数据x;
if (h == NULL)
//h为头指针,如果其为空 指向下一个节点
{
h = p;
//若为空表,接入表头
}
else
{
q->next = p;
//非空表 接到表尾
}
q = p;
scanf("%d", &x);
}
//free(p); //申请到的没录入,所以释放掉
//p = NULL; //使指向空
//q->next = NULL; //到表尾了,指向空
if (h)
//若头指针为空 则整个链表为空
q->next = NULL;
printf("链表输入结束(END)\n");
return h;
//链表创建好后返回头节点
}
void print_list(node *head)
{
node *temp = head;
printf("\n\n\n链表存入的值为:\n");
while (temp != NULL)
{
printf("%d ", temp->data);
temp = temp->next;
}
}
int main()
{
node *L = NULL;
L = creat();
print_list(L);
return 0;
}
相关文章推荐
- 使用反射和codeDOM实现C#插件开发(1)由来
- C++利用静态成员或类模板构建链表的方法讲解
- 【Matlab】num2str实现数字1到字符串0001的变换
- Java遍历Map对象的4种方法
- 煮茶叶蛋秘籍
- 结对编程
- 用友U8数据库修复用友t3数据库修复用友/823错误824错误/检测到基于一致性的逻辑 I O 错误/ tempdb 空间用尽或某一系统表不一致
- 史上最强Android 开启照相或者是从本地相册选中一张图片以后先裁剪在保存并显示的讲解附源码i
- C# WPF 按钮模板
- 解决SurfaceView调用setZOrderOnTop(true)遮挡其他控件的问题
- Bengio大神的《Deep Learning》全书已完稿可获取全书电子版
- mysql中视图更新详解
- git忽略已被跟踪的文件
- Angularjs学习笔记5_form1
- 第五节 文件上传
- 构建之法阅读笔记02
- 结对项目——四则运算
- openlayers3 在地图上叠加WFS查询矢量图层
- MySQL之DDL,DQL,DML,DCL
- poj3617字典序问题【贪心】