链表在数据管理中应用广泛,现给出单链表的使用范例以供参考:
#include "stdio.h"
#include <cstdlib>
typedef int STLDataType;
typedef struct SListNode {
STLDataType data;
struct SListNode *next;
} SLTNode;
// 创建链表节点
SLTNode *SListCreateNode(STLDataType x)
{
SLTNode *nextNode = (SLTNode *)malloc(sizeof(SLTNode));
nextNode->data = x;
nextNode->next = NULL;
return nextNode;
}
// 尾插节点
void SListPushBack(SLTNode **phead, STLDataType x)
{
SLTNode *nextNode = SListCreateNode(x);
if (*phead == NULL) { // 1、头节点为空,即整个链表没有元素,直接将待插入元素的地址赋值给头结点即可
*phead = nextNode;
} else { // 找到尾节点
SLTNode *tail = *phead;
while (tail->next != NULL) { // 2、如果只有一个节点,即head->next为NULL,此时如果不判空,直接访问,则会崩溃
tail = tail->next; // 3、找到链表的尾节点
}
tail->next = nextNode;
}
}
// 头插节点
void SListPushFront(SLTNode **phead, STLDataType x)
{
SLTNode *nextNode = SListCreateNode(x);
nextNode->next = *phead;
*phead = nextNode;
}
// 尾删节点
void SListPopBack(SLTNode **phead)
{
if (*phead == NULL) {
return;
} else if ((*phead)->next == NULL) { // 如果只有一个节点
free(*phead);
*phead = NULL;
} else {
SLTNode *prev = NULL;
SLTNode *tail = *phead;
while (tail->next != NULL) { // 找到最后一个节点以及前一个节点,将最后节点释放掉,并将前一个节点的指针域置空
prev = tail;
tail = tail->next;
}
free(tail);
prev->next = NULL;
}
}
// 头删节点
void SListPopFront(SLTNode **phead)
{
if (*phead == NULL) {
return;
}
SLTNode *nextNode = (*phead)->next; // 先把头节点的下个节点取出来
free(*phead);
*phead = nextNode;
}
// 查找data为x的节点,并返回该节点
SLTNode *SListFind(SLTNode *phead, STLDataType x)
{
SLTNode *cur = phead;
while (cur != NULL) {
if (cur->data == x) {
return cur;
}
cur = cur->next;
}
return NULL;
}
// 在指定节点前插入新节点
void SListInsert(SLTNode **phead, SLTNode *pos, STLDataType x)
{
if (*phead == pos) { // 相当于头插节点
SListPushFront(phead, x);
} else {
SLTNode *newCode = SListCreateNode(x);
SListNode *prev = *phead;
while (prev->next != pos) { // 找到pos的前面节点
prev = prev->next;
}
prev->next = newCode;
newCode->next = pos;
}
}
// 删除指定节点pos
void SListErease(SLTNode **phead, SLTNode *pos)
{
if (*phead == pos) { // 相当于删除头结点
SListPopFront(phead);
} else {
SLTNode *prev = *phead;
while (prev->next != pos) {
prev = prev->next;
}
prev->next = pos->next;
free(pos);
}
}
// 遍历链表
void SListPrint(SLTNode *phead)
{
SLTNode *cur = phead;
while (cur != NULL) {
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
// 清空链表
void SListClear(SLTNode **phead)
{
SLTNode *cur = *phead;
SLTNode *next = NULL;
while (cur != NULL) {
next = cur->next;
free(cur);
cur = next;
}
*phead = NULL;
}