单链表的创建过程有以下几步:
1 ) 定义链表的数据结构;
2 ) 创建一个空表;
3 ) 利用malloc ( )函数向系统申请分配一个节点;
4 ) 将新节点的指针成员赋值为空。若是空表,将新节点连接到表头;若是非空表,将新节点接到表尾;
5 ) 判断一下是否有后续节点要接入链表,若有转到3 ),否则结束;
单链表的输出过程有以下几步
1) 找到表头;
2) 若是非空表,输出节点的值成员,是空表则退出;
3 ) 跟踪链表的增长,即找到下一个节点的地址;
4) 转到2 ).
接下来来一步步实现链表的创建: (1)定义一个结构体类型来存储这个节点 链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员(实际需要保存的数据)和指向下一个结构体类型节点的指针即下一个节点的地址(事实上,此单链表是用于存放整型数据的动态数组)。链表按此结构对各节点的访问需从链表的头找起,后续节点的地址由当前节点给出。无论在表中访问那一个节点,都需要从链表的头开始,顺序向后查找。链表的尾节点由于无后续节点,其指针域为空,写作为NULL。
图1:节点存储
struct node
{
int data; //整形data用来存储具体的数值
struct node *next; //存储下一个节点的地址,类型相同,所以指针类型必须也是struct node *类型的指针
}; //注意结构体定义后面需要;
(2)链表创建
单链表有一个头节点head,指向链表在内存的首地址。当链表还没有建立的时候头指针为空(NULL)。
struct node *head;
head = NULL; //头指针为空
创建第一个节点,并用临时指针p指向这个节点。(利用malloc函数)
struct node *p;
p = (struct node *)malloc(sizeof(struct node));
接下来分别设置新创建的这个节点的左部分和右部分。
scanf("%d",&a);
p ->data = a; //将数据存储到当前节点da中
p ->next = NULL; //设置当前节点的下一个节点为空
//->结构体指针运算符,访问结构体内部成员
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;
};
int main()
{
struct node *head,*p,*q,*t;
int i,n,a;
scanf("%d",&n);
head = NULL; //头指针为空
for(i=1;i<=n;i++) //循环读入n个数
{
scanf("%d",&a);
p = (struct node *)malloc(sizeof(struct node));
p ->data = a;
p ->next = NULL;
if (head==NULL)
head = p; //如果这是第一个创建的节点,则将头指针指向这个节点
else
q ->next = p; //上一个节点的后继指针指向当前节点
q = p; //指针q也指向当前节点
}
//输出链表中的所有数
t = head;
while(t!=NULL)
{
printf("%d",t ->data);
t = t ->next; //继续下一个结点
}
getchar();
return 0;
}
待续….
参考文献: ①malloc函数详解: http://blog.csdn.net/xw13106209/article/details/4962479