鏈表是一種常見的數據結構,用于存儲一系列的元素。它由一系列的節點(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;
}
?