带头结点的单链表的各种操作
作者:互联网
#include <stdlib.h>
#include <stdio.h>
#include <string.h> //这是常规的三个头文件
#pragma warning(disable:4996) //这是为了避免vs报错。
//带头节点的单链表
struct LinkedNode { //定义结构体用以表示链表的结点
int data;
struct LinkedNode* next;
};
//基本操作
//创建链表
struct LinkedNode* Init_LinkList();
//遍历
void foreach_LinkList(struct LinkedNode* header);
//插入:在给定某个值之前插入,如果给定值在链表中没有,那么插入链表尾
void insert_LinkList(struct LinkedNode* header, int oldVal, int newVal);
//删除一个结点
void deleteNode_LinkList(struct LinkedNode* header, int delVal);
//销毁
void destroy_LinkList(struct LinkedNode* header);
//清空
void clear_LinkList(struct LinkedNode* header);
//逆序 A-B-C-D ---> D-C-B-A
void reverse_LinkList(struct LinkedNode* header);
//基本操作
//创建链表,尾插法。
struct LinkedNode* Init_LinkList()
{
//创建头结点
struct LinkedNode* header = (struct LinkedNode*)malloc(sizeof(struct LinkedNode));
header->data = -1;
header->next = NULL;
struct LinkedNode* pCurrent = header;
int val = -1;
while (true)
{
printf("input node data:\n");
scanf("%d", &val);
if (val == -1)
{
break;//输入结束
}
//创建一个新的节点,然后插入链表尾
struct LinkedNode* newNode = (struct LinkedNode*)malloc(sizeof(struct LinkedNode));
newNode->data = val;
newNode->next = NULL;
pCurrent->next = newNode;
pCurrent = newNode;
}
return header;
}
//遍历
void foreach_LinkList(struct LinkedNode* header)
{
if (NULL == header || NULL == header->next)
{
return;
}
struct LinkedNode* pCurrent = header->next;
while (pCurrent != NULL)
{
printf("%d ", pCurrent->data);
pCurrent = pCurrent->next;
}
printf("\n");
}
//插入:在给定某个值之前插入,如果给定值在链表中没有,那么插入链表尾
void insert_LinkList(struct LinkedNode* header, int oldVal, int newVal)
{
if (NULL == header)
{
return;
}
struct LinkedNode* pPrev = header;
struct LinkedNode* pCurrent = header->next;
struct LinkedNode* newNode = (struct LinkedNode*)malloc(sizeof(struct LinkedNode));
newNode->data = newVal;
newNode->next = NULL;
while (pCurrent != NULL)
{
if (pCurrent->data == oldVal)
{
break;
}
pPrev = pCurrent;
pCurrent = pCurrent->next;
}
if (pCurrent == NULL)
{
pPrev->next = newNode;
}
newNode->next = pCurrent;
pPrev->next = newNode;
return;
}
//删除一个结点
void deleteNode_LinkList(struct LinkedNode* header, int delVal)
{
if (NULL == header)
{
return;
}
struct LinkedNode* pPrev = header;
struct LinkedNode* pCurrent = header->next;
while (pCurrent != NULL)
{
if (pCurrent->data == delVal)
{
break;
}
pPrev = pCurrent;
pCurrent = pCurrent->next;
}
if (pCurrent == NULL)
{
return;
}
pPrev->next = pCurrent->next;
free(pCurrent);
pCurrent = NULL;
return;
}
//销毁
void destroy_LinkList(struct LinkedNode* header)
{
clear_LinkList(header);
header->next = NULL;
free(header);
header = NULL;
return;
}
//清空
void clear_LinkList(struct LinkedNode* header)
{
if (header == NULL)
{
return;
}
struct LinkedNode* pCurrent = header->next;
while (pCurrent != NULL)
{
struct LinkedNode* pNext = pCurrent->next;
free(pCurrent);
pCurrent = pNext;
}
header->next = NULL;
return;
}
//逆序 A-B-C-D ---> D-C-B-A
void reverse_LinkList(struct LinkedNode* header)
{
if (NULL == header)
{
return;
}
struct LinkedNode* pPrev = header->next;
struct LinkedNode* pCurrent = pPrev->next;
struct LinkedNode* t = NULL;
while (pCurrent) //让链表里面的每相邻两元素改变指针。
{
t = pCurrent->next;
pCurrent->next = pPrev;
pPrev = pCurrent;
pCurrent = t;
}
header->next->next = NULL; //让第一个结点的NEXT域为NULL
header->next = pPrev; //新链表的第一个结点是pPrev,因为pPrev是该链表的最后一个结点
}
指针的值是地址
发布了10 篇原创文章 · 获赞 0 · 访问量 86
私信
关注
标签:结点,单链,带头,struct,NULL,pCurrent,header,LinkedNode,next 来源: https://blog.csdn.net/weixin_40007143/article/details/104045154