C语言单链表的建立(详细注解)
1.头文件
#include<stdio.h>
#include<malloc.h>//分配节点内存要用
2.定义节点
typedef struct ListNode {
int val;//数据域
struct ListNode *next;//指针域,指向下一指针
}ListNode;//结构体别名
3.初始化链表函数
//返回类型为ListNode节点类型(返回头节点)
ListNode *InitList(int n){//n为链表大小
ListNode *head,*p,*s;//头节点,链表构建指针变量,链表接入指针变量
head=(ListNode*)malloc(sizeof(ListNode));//动态分配内存给头节点
head->next=NULL;//初始化头节点
p=head;
for(int i=1;i<=n;i++)
{
s=(ListNode*)malloc(sizeof(ListNode));//这是接入指针变量的动态分配内存
scanf("%d",&s->val);//数据
s->next=NULL;//初始化接入节点
p->next=s;//将s节点接入链表(p代表了已接入链表的最后一颗指针)
p=p->next;//将p节点指向最后,以便下一次接入链表
}
//p->next=head;//可以将最后的指针连到头节点做成循环链表
return head;//返回一个链表的头节点
}
4.补充一个已封装好的单链表头文件
LinkedList.h
#include<malloc.h>
#include<stdio.h>
struct Node {//结点定义
int data;//数据域
Node* next;//指针域
};
struct LinkedList {
Node* head;//头结点
Node* tail;//尾结点
LinkedList* initLinkedList() {//初始化链表,头尾指针指向一个结点
Node* tmp = (Node*)malloc(sizeof(Node));
tmp->data = 0;
tmp->next = NULL;
head= tmp;
tail = tmp;
return this;
}
void reverseLinkedList() {//翻转链表(头插法),把head想象成一个火车掉头点,火车开进去之后,原本的头变为尾,尾变为头
Node* p = head;
Node* q = head->next;
tail = q;
tail->next = NULL;
while (q != NULL) {
Node* tmp = p->next;
Node* tmp2 = q->next;
p->next = q;
q->next = tmp;
q = tmp2;
}
}
void reverseLinkedList_3pointer() {//[三指针法翻转参考视频](https://www.bilibili.com/video/BV1ss41197uh?p=2&vd_source=11335a7920046ab7df2091e391fe12c7)
Node* prev = head->next;
Node* p = prev->next;
tail = prev;
tail->next = NULL;
while (p != NULL) {
Node* tmp = p->next;
p->next = prev;
prev = p;
p = tmp;
}
head->next = prev;
}
void printLinkedList() {//打印整个链表
Node* head = this->head;
while (head != NULL) {
if (head->data != 0) {//除去头结点,亦可以从头结点的下一个遍历
printf("%d->", head->data);
}
head = head->next;
}
printf("NULL\n");//直观
}
void insertNode(int data) {//插入结点,参数为数据
Node* tmp = (Node*)malloc(sizeof(Node));//分配空间
tmp->data = data;//初始化
tmp->next = NULL;
this->tail->next = tmp;//插入队尾
this->tail = tmp;
}
};
附三指针联动法图:
加入此模块,不必再自己构造链表。方法:创建名为LinkedList.h的头文件,并在主函数中引入 #include"LinkedList.h"
初始化和测试如下:
int main()
{
LinkedList list;
list.initLinkedList();
list.insertNode(1);
list.insertNode(2);
list.insertNode(3);
list.insertNode(4);
list.insertNode(5);
list.printLinkedList();
list.reverseLinkedList();
list.printLinkedList();
}