1. 链表的结构体定义(结点定义)
链表的一个结点首先肯定包含一个数据域和一个指针域,数据域用来存放结点数据,指针域存放的是指向下一个结点的地址。当然,头节点例外,其实,头结点和普通结点一样,只不过头结点只存放了指向下一个结点的地址(即首结点)。
2、创建节点 为插入做准备,学习数据的时候,一定要把功能划分明确
3、表头插入
// 插在头结点之后 插队插入,不能越过头结点
// 插队插入,不能越过头结点
只需要强调一点,头插法是在头结点尾部,尾插法是在链表尾部插入,这个不要理解错了。其实思想和尾插类似,只要记得插入是和头结点有关,
即
newNode->next = headNode->next;
headNode->next = newNode;
newNode始终是用来接收输入数据,然后插入头结点的尾部,headNode->next是头指针每次插入新节点之前,最近指向一次插入的结点。当新节点排队插入后,需要将新节点的next指向原先插入之前,距离头结点最接的结点 headNode->next
4.尾插法建立链表
这里,尾插法是在链表尾部插入结点的
所以先创建一个头结点,struct Node* newNode = createNode(data);
并提前在 createNode(data)函数中为头节点分配结点空间,
然后 head->next=NULL,此时只有头节点,所以链表下一个结点为空。
尾插法关键代码就是
struct Node* tailNode = headNode;
while (tailNode->next != NULL)
{
tailNode = tailNode->next;
}
tailNode->next = newNode;
头插法 依次插入0-9
尾插法 依次插入 100 1000两个数
// 表头插入 表尾插入 打印链表
/* 任务 */
// 1、创建表
// 2、创建节点
// 3、表头插入
// 4、表尾插入
// 5、打印表
// 6、表头删除
-
#include<stdio.h>
-
#include<stdlib.h>
-
-
/* C语言 <1> 什么是链式结构 碎片内存存储*/
-
/* 创建表:结构体变量和结构体变量 连接在一起 */
-
// 结构体变量 使用指针去表示----->指针成为变量------->动态内存申请
-
// 如何去表示一个表:使用第一个节点来表示整个链表
-
struct Node //自定义节点
-
{
-
-
int data;
-
struct Node *next;
-
};
-
-
// 1、创建表
-
struct Node *createList()
-
{
-
-
struct Node *headNode = (struct Node*)malloc(sizeof(struct Node));
-
headNode->next = NULL;
-
-
// 变量规则:变量需要初始化,才能使用
-
-
//data 为什么不可以初始化 不初始化 与众不同 有表头的链表
-
// 差异化处理
-
headNode->data = -111;
-
return headNode; // 返回指针变量
-
-
}
-
-
// 2、创建节点 为插入做准备,学习数据的时候,一定要把功能划分明确
-
struct Node *createNode(int data)
-
{
-
struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
-
newNode->data = data;
-
newNode->next = NULL;
-
-
return newNode; 返回指针变量
-
}
-
-
-
// 3、表头插入
-
// 插在头结点之后 插队插入,不能越过头结点
-
// 插队插入,不能越过头结点
-
-
// 函数参数设计是具有含义的:插入那个链表??插入的新节点的定义变量
-
void insertNodeByHead(struct Node *headNode, int data) //表头法插入
-
{
-
-
// 1、插入的新节点的定义变量
-
struct Node* newNode = createNode(data);
-
// 2、 插在头结点之后 插队插入,不能越过头结点
-
newNode->next = headNode->next;
-
-
headNode->next = newNode;
-
}
-
-
// 4、表尾插入
-
void insertNodeByTail(struct Node *headNode, int data)
-
{
-
-
struct Node* newNode = createNode(data);
-
struct Node* tailNode = headNode;
-
while (tailNode->next != NULL)
-
{
-
-
tailNode = tailNode->next;
-
}
-
tailNode->next = newNode;
-
}
-
-
-
-
-
void printList(struct Node *headNode) //打印,浏览信息
-
{
-
-
// 有表头,要从第二个节点开始打印
-
struct Node *pMove = headNode->next;
-
while (pMove != NULL)
-
{
-
printf("%d\t", pMove->data);
-
pMove = pMove->next;
-
-
-
}
-
-
printf("\n");
-
}
-
-
int main()
-
{
-
-
-
struct Node *list1 = createList();
-
for (int i = 0; i < 10; i++)
-
{
-
insertNodeByHead(list1, i);
-
}
-
printList(list1);
-
insertNodeByTail(list1, 100);
-
insertNodeByTail(list1, 1000);
-
printList(list1);
-
system("pause");
-
return 0;
-
}
头插法 依次插入0-9
尾插法 插入 100 1000两个数