一、链表是什么?
官方解释:
链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。二、使用步骤
1.定义结构体类型
代码如下:
struct node
{
int num;
struct node* next;
};
2.创建及输出动态单链表
创建链表之前需要了解动态单链表的几种形式,有头或无头,尾插法还是头插法,通过多次创建链表,个人更喜欢使用尾插法来创建一个无头单链表。
有头和无头的区别就在于第一个节点是否有数据域。
头插法和尾插法也就顾名思义,头插法每次都是在头节点后插入一个节点,而尾插法则是在链表末尾插入一个节点。所以在顺序输出的情况下,头插法创建的单链表是逆序输出的,而尾插法就是顺序输出。
1.尾插法无头单链表❤
int main()
{
struct node* p1, * p2, * head;
head = NULL;
p1 = p2 = (struct node*)malloc(LEN);
if(p1==NULL) exit(1);
scanf_s("%d", &p1->num);
int count = 0;
do
{
if (count == 0) head = p1;
else p2->next = p1;
p2 = p1;
p1 = (struct node*)malloc(LEN);
if(p1==NULL) exit(1);
count++;
scanf_s("%d", &p1->num);
} while (p1->num != 0);
p2->next = NULL;
free(p1);
struct node* p;
p = head;
while (p != NULL)
{
printf("%d ", p->num);
p = p->next;
}
return 0;
}
2.尾插法有头单链表
int main()
{
struct node* head, * p1, * p2;
p1 = p2 = (struct node*)malloc(LEN);
if(p1==NULL) exit(1);
head = (struct node*)malloc(LEN);
if(head==NULL) exit(1);
scanf_s("%d", &p1->num);
int count = 0;
do
{
if (count == 0) head->next = p1;
else p2->next = p1;
p2 = p1;
count++;
p1 = (struct node*)malloc(LEN);
if(p1==NULL) exit(1);
scanf_s("%d", &p1->num);
} while (p1->num != 0);
p2->next = NULL;
free(p1);
struct node* p;
p = head->next;
while (p != NULL)
{
printf("%d ", p->num);
p = p->next;
}
return 0;
}
3.头插法无头单链表
int main()
{
struct node* head, * p1;
head = NULL;
p1 = (struct node*)malloc(LEN);
if(p1==NULL) exit(1);
scanf_s("%d", &p1->num);
while (p1->num != 0)
{
p1->next = head;
head = p1;
p1 = (struct node*)malloc(LEN);
if(p1==NULL) exit(1);
scanf_s("%d", &p1->num);
}
free(p1);
struct node* p;
p = head;
while (p != NULL)
{
printf("%d ", p->num);
p = p->next;
}
return 0;
}
4.头插法有头单链表
int main()
{
struct node* head, * p1;
head = (struct node*)malloc(LEN);
if(head==NULL) exit(1);
head->next = NULL;
int date;
scanf_s("%d", &date);
while (date != 0)
{
p1 = (struct node*)malloc(LEN);
if(p1==NULL) exit(1);
p1->num = date;
p1->next = head->next;
head->next = p1;
scanf_s("%d", &date);
}
struct node* p;
p = head->next;
while (p != NULL)
{
printf("%d ", p->num);
p = p->next;
}
return 0;
}
以上链表输入时都已0为结束标志,当检测到输入的值为0时,链表创建完毕。
以上链表的创建都是根据自己的思想创建的,所以可能会出现错误,希望大佬们可以指点一二😊