单链表构造、插入、打印、逆序实现

目录

1、构造结点结构体

2、初始化一个带头结点的单链表

3、往链表中插入节点

4、将链表逆序

5、打印节点信息

完整程序:


主程序在下面

1、构造结点结构体

typedef struct linkList
{
	int data;
	struct linkList *next;
}LINKLIST,*list;

  data用于节点存储数据,struct linkList *next是结点的指针域。LINKLIST是结构体的别名,list是结构体的指针。

2、初始化一个带头结点的单链表

//初始化带头结点的单链表
LINKLIST *CreateLinkList(void)
{
	//创建新结点,并为其申请堆内存
	LINKLIST *head = (LINKLIST *)malloc(sizeof(LINKLIST));
	head->data = 0;	//头结点的值初始化为0
	head->next = NULL; //头结点的指针域指向空
	return head;	

}

  创建一个指向头结点的指针,将头结点的值置为0,并且指针域指向空。

3、往链表中插入节点

//将新结点插入单链表
void InsertNode(LINKLIST *current,int n)
{
	LINKLIST *node=NULL;
	for (int i = 1; i <= n; i++)
	{
		//为新插入的结点申请堆内存
		node = (LINKLIST*)malloc(sizeof(LINKLIST));
		//判断
		if (current == NULL || node == NULL)
			return;

		node->data = i;
		node->next = NULL;

		current->next = node;	//当前结点指向新插入的结点
		current = node;			//当前结点变为新插入的结点
	}

}

4、将链表逆序

​
//单链表逆序
void ListReverse(list* head)
{
    if(head==NULL) return;

	//构造一个临时结点来保存q的下一个结点
	LINKLIST *temp = NULL;
	//
	LINKLIST *p = head->next;
	LINKLIST *q = head->next->next;

	//如果只有头结点或者没有头结点就返回
	if (p == NULL || q == NULL)
		return;

	//遍历
	while (q != NULL)
	{
		temp = q->next;		//temp指向q下一个结点
		q->next = p;		//q的指针域指向p
	
		p = q;		//指针p指向q所指的结点
		q = temp;	//指针q指向temp所指的节结点	即将q和q的指向往下偏移一个结点
	}
	//注意:head->next才是头结点,而不是head!head只是指向头结点的指针
	//因为头指针与头结点不同,头结点即第一个结点,头指针是指向第一个结点的指针。
	//链表中可以没有头结点,但不能没有头指针

	//头指针指向的头结点的指针域指向空,头变尾
	head->next->next = NULL;  
	//头结点的指针域指向p即尾结点。p为新的头结点,所以head指向p
	head->next = p;   
	
}

5、打印节点信息

//打印结点序列
void PrintLinkList(list head)
{
	LINKLIST *p = head->next;
	while (p!=NULL)
	{
		cout << p->data<<" ";
		p=p->next;
	}
	cout << endl;
}

  将链表头节点传入,当节点的指针域指向不为空时,输出该节点的值,并将指针指向它的下一个节点。

完整程序:

#include <iostream>

using namespace std;

//构造单链表结构体
typedef struct linkList
{
	int data;
	struct linkList *next;
}LINKLIST,*list;

//初始化带头结点的单链表
LINKLIST *CreateLinkList(void)
{
	//创建新结点,并为其申请堆内存
	LINKLIST *head = (LINKLIST *)malloc(sizeof(LINKLIST));
	head->data = 0;	//头结点的值初始化为0
	head->next = NULL; //头结点的指针域指向空
	return head;	

}

//将新结点插入单链表
void InsertNode(LINKLIST *current,int n)
{
	LINKLIST *node=NULL;
	for (int i = 1; i <= n; i++)
	{
		//为新插入的结点申请堆内存
		node = (LINKLIST*)malloc(sizeof(LINKLIST));
		//判断
		if (current == NULL || node == NULL)
			return;

		node->data = i;
		node->next = NULL;

		current->next = node;	//当前结点指向新插入的结点
		current = node;			//当前结点变为新插入的结点
	}

}

//打印结点序列
void PrintLinkList(list head)
{
	LINKLIST *p = head->next;
	while (p!=NULL)
	{
		cout << p->data<<" ";
		p=p->next;
	}
	cout << endl;
}

//单链表逆序
void ListReverse(list* head)
{
    if(head==NULL) return;    

	//构造一个临时结点来保存q的下一个结点
	LINKLIST *temp = NULL;
	//
	LINKLIST *p = head->next;
	LINKLIST *q = head->next->next;

	//如果只有头结点或者没有头结点就返回
	if (p == NULL || q == NULL)
		return;

	//遍历
	while (q != NULL)
	{
		temp = q->next;		//temp指向q下一个结点
		q->next = p;		//q的指针域指向p
	
		p = q;		//指针p指向q所指的结点
		q = temp;	//指针q指向temp所指的节结点	即将q和q的指向往下偏移一个结点
	}
	//注意:head->next才是头结点,而不是head!head只是指向头结点的指针
	//因为头指针与头结点不同,头结点即第一个结点,头指针是指向第一个结点的指针。
	//链表中可以没有头结点,但不能没有头指针

	//头指针指向的头结点的指针域指向空,头变尾
	head->next->next = NULL;  
	//头结点的指针域指向p即尾结点。p为新的头结点,所以head指向p
	head->next = p;   	
}


int main()
{
	LINKLIST *head = NULL;
	head = CreateLinkList();
	InsertNode(head, 15);
	cout << "逆序前的:";
	PrintLinkList(head);

	cout << "逆序后的:";
	ListReverse(head);
	PrintLinkList(head);

	return 0;
}

输出结果:

因为工作比较忙csdn不是经常上,如果大家有任何疑问或者找我聊技术唠唠嗑,欢迎加我微信a5230gxkd交流,一起进步,我会第一时间回复

或者在公众号领取珍藏电子书(带书签)(有c、c++、python、linux、设计模式等),以及c、c++的面试试题和面试技巧。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值