单链表分为有头节点和无头节点链表,插入的方法有头接法和尾接法俩种办法,下面,我将使用无头结点的链表,因为尾插法更适合无头结点的链表的插入,所以在此我们使用 1.无头结点链表 2.尾插法插入数据
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#pragma warning(disable:4996)
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node *next;
}Node;
int main()
{
int i;
Node *head = NULL, *tail = NULL, *p = NULL;
for (i = 0; i < 5; i++) {
p = (Node *)malloc(sizeof(Node));
p->data = i;
p->next = NULL;
if (head == NULL)
head = p;
else tail->next = p;
tail = p;
}
while (head != NULL) {
printf("%d ", head->data);
head = head->next;
}
}
运行结果:
typedef struct Node
{
DataType data;
struct Node *next;
}Node;
这是链表的结点,包含数据以及指向下一个结点的指针,数据可以是结构体类型,也可以是int,char等各种数据类型
Node *head = NULL, *tail = NULL, *p = NULL;
head是表头,因为是无头结点的链表,所以它既是表头,又是第一个结点
tail 是表尾,我们的尾插法就是在表尾插入数据,
p是我们为了申请内存空间,也就是为了获取结点而使用的局部变量
for (i = 0; i < 5; i++) {
p = (Node *)malloc(sizeof(Node));
p->data = i;
p->next = NULL;
if (head == NULL)
head = p;
else tail->next = p;
tail = p;
}
此段代码的解析:外层利用for循环,循环五次,插入5个数据
内层:
p = (Node *)malloc(sizeof(Node));申请结点的内存空间
p->data = i;p->next = NULL; 结点赋值
下面是尾插法关键语句:
if (head == NULL)
head = p;
else tail->next = p;
tail = p;
当首结点为空时,也就是链表开始时没有任何结点时,插入的时候就直接将head指向第一个结点,然后再将tail表尾指向这个结点。
当首节点不为空时,也就是说链表已经有结点了,那么此时我们将表尾的下一个指向的结点tail->next 指向新申请的结点,然后此时表尾又改变了位置,我们就要重新将表尾指向新的表尾结点位置,即tail = p;
注:链表需要用到指针的知识。因为链表的结点通常我们是需要申请内存空间的,而指针的指向说白了就是指向内存地址,即放这块数据的地址。
我们学链表的时候一般用图来帮助理解
个人认为这是比较适合初学者的!