目录
主程序在下面
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++的面试试题和面试技巧。