首先让我们看看单链表的定义:
单向链表:
1:单链表有一个头节点head,指向链表在内存的首地址。
2:链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员(实际需要保存的数据)和指向下一个结构体类型节点的指针即下一个节点的地址
1:单链表有一个头节点head,指向链表在内存的首地址。
2:链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员(实际需要保存的数据)和指向下一个结构体类型节点的指针即下一个节点的地址
(事实上,此单链表是用于存放整型数据的动态数组)。
3:链表按此结构对各节点的访问需从链表的头找起,后续节点的地址由当前节点给出。
4:无论在表中访问那一个节点,都需要从链表的头开始,顺序向后查找。链表的尾节点由于无后续节点,其指针域为空,写作为NULL。
3:链表按此结构对各节点的访问需从链表的头找起,后续节点的地址由当前节点给出。
4:无论在表中访问那一个节点,都需要从链表的头开始,顺序向后查找。链表的尾节点由于无后续节点,其指针域为空,写作为NULL。
单链表的创建过程有以下几步:
1 ) 定义链表的数据结构;
2 ) 创建一个空表;
3 ) 利用malloc ( )函数向系统申请分配一个节点;
4 ) 将新节点的指针成员赋值为空。若是空表,将新节点连接到表头;若是非空表,将新节点接到表尾;
5 ) 判断一下是否有后续节点要接入链表,若有转到3 ),否则结束;
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;
}
#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;
}