C语言单链表的建立

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();
}

在这里插入图片描述

  • 14
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值