链表是一种常见的数据结构,用于存储一系列的元素。它由一系列的节点(Node)组成,每个节点包含数据和指向下一个节点的指针。不同于数组需要连续的内存空间来存储元素,链表使用指针将节点按照某种逻辑顺序连接起来。
每个节点通常由两个部分组成:数据部分(存储元素的值)和指针部分(指向下一个节点)。链表的开头节点称为头节点(Head),而最后一个节点没有指针指向下一个节点的位置,通常使用空指针(NULL)来表示链表的结尾。
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>#ifdef __cplusplus
extern "C" {
#endifstruct LinkNode {int num;struct LinkNode* next;};struct LinkNode* Init_LinkList();void foreach_LinkList(struct LinkNode* pHeader);void insert_LinkList(struct LinkNode* pHeader, int oldval, int newval);void delete_LinkList(struct LinkNode* pHeader, int delval);void clear_LinkList(struct LinkNode* pHeader);void destroy_LinkList(struct LinkNode* pHeader);void rever_LinkList(struct LinkNode* pHeader);int size_LinkList(struct LinkNode* pHeader);
#ifdef __cplusplus
}
#endif
#include"LinkList.h"
struct LinkNode* Init_LinkList()
{struct LinkNode* pHeader = malloc(sizeof(struct LinkNode));if (pHeader == NULL){return ;}pHeader->num = -1; pHeader->next = NULL;int val = -1;struct LinkNode* pTail = pHeader;while (1){printf("请插入数据,输入-1结束\n");scanf_s("%d",&val);if (val == -1){break;}//创建新节点struct LinkNode* newNode = malloc(sizeof(struct LinkNode));newNode->num = val;newNode->next = NULL;pTail->next = newNode;//连接pTail = newNode;}return pHeader;
}
void foreach_LinkList(struct LinkNode* pHeader)
{if (pHeader == NULL){return;}struct LinkNode* pCurrent = pHeader->next;while (pCurrent != NULL){printf("%d\n", pCurrent->num);pCurrent = pCurrent->next;}
}
void insert_LinkList(struct LinkNode* pHeader, int oldval, int newval)
{struct LinkNode* pPrev = pHeader;struct LinkNode* pCurrent = pHeader->next;while (pCurrent != NULL){if (pCurrent->num == oldval){break;}pPrev = pCurrent;pCurrent = pCurrent->next;}struct LinkNode* newNode = malloc(sizeof(struct LinkNode));newNode->num = newval;newNode->next = NULL;newNode->next = pCurrent;pPrev->next = newNode;
}void delete_LinkList(struct LinkNode* pHeader, int deval)
{if (pHeader == NULL){return;}struct LinkNode* pPrev = pHeader;struct LinkNode* pCurrent = pHeader->next;while (pCurrent != NULL){if(pCurrent->num==deval){break;}pPrev->next = pCurrent;pCurrent = pCurrent->next;}if (pCurrent == NULL){return;}pPrev->next = pCurrent->next;free(pCurrent);pCurrent = NULL;
}
void clear_LinkList(struct LinkNode* pHeader)
{if (pHeader == NULL){return;}struct LinkNode* pCurrent = pHeader->next;while (pCurrent != NULL){struct LinkNode* nextnode = pCurrent->next;free(pCurrent);pCurrent = nextnode;}pHeader->next = NULL;
}
void destroy_LinkList(struct LinkNode* pHeader)
{if (pHeader == NULL){return;}clear_LinkList(pHeader);free(pHeader);pHeader = NULL;}
void rever_LinkList(struct LinkNode* pHeader)
{if (pHeader == NULL){return;}struct LinkNode* pPrev;struct LinkNode* pCurrent;struct LinkNode* pNext;pPrev = NULL;pNext= NULL;pCurrent = pHeader->next;while (pCurrent != NULL){pNext = pCurrent->next;pCurrent->next = pPrev;pPrev = pCurrent;pCurrent = pNext;}pHeader->next = pPrev;
}
int size_LinkList(struct LinkNode* pHeader)
{if (pHeader == NULL){return;}struct LinkNode* pCurrent = pHeader->next;int num = 0;while (pCurrent != NULL){num++;pCurrent = pCurrent->next;}return num;
}