使用双向链表实现:定义双向链表中节点的结构,头删,尾删,查找,头插,尾插,在pos位置之后插入数据,删除pos位置的数据,删除数据。
在ListNode.h中写出所需函数和定义双向链表中节点的结构。
在ListNode.c中定义各种函数。
在main.c中对函数进行测试。
ListNode.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int LTDataType;
typedef struct ListNode
{
LTDataType data;
struct ListNode* next;
struct ListNode* prev;
}LTNode;
LTNode* LTInit();
void LTDestroy(LTNode* phead);
void LTPrint(LTNode* phead);
void LTPushBack(LTNode* phead, LTDataType x);
void LTPopBack(LTNode* phead);
void LTPushFront(LTNode* phead, LTDataType x);
void LTPopFront(LTNode* phead);
//在pos位置之后插入数据
void LTInsert(LTNode* pos, LTDataType x);
void LTErase(LTNode* pos);
LTNode* LTFind(LTNode* phead, LTDataType x);
ListNode.c
#include"ListNode.h"
LTNode* NewNode(LTDataType val)
{
LTNode* pnew = (LTNode*)malloc(sizeof(LTNode));
if (pnew == NULL) {
perror("malloc fail!");
exit(1);
}
pnew->data = val;
pnew->next = pnew->prev = pnew;
return pnew;
}
LTNode* LTInit()
{
LTNode* head = NewNode(-1);
return head;
}
void LTDestroy(LTNode* phead)
{
assert(phead);
LTNode* pcur = phead->next;
while (pcur != phead)
{
LTNode* next = pcur->next;
free(pcur);
pcur = next;
}
free(phead);
phead = NULL;
}
void LTPrint(LTNode* phead)
{
LTNode* pcur = phead->next;
while (pcur != phead)
{
printf("%d->", pcur->data);
pcur = pcur->next;
}
}
void LTPushBack(LTNode* phead, LTDataType x)
{
assert(phead);
LTNode* pnew = NewNode(x);
pnew->next = phead;
pnew->prev = phead->prev;
phead->prev->next = pnew;
phead->prev = pnew;
}
void LTPopBack(LTNode* phead)
{
assert(phead);
assert(phead->next != phead);
LTNode* del = phead->prev;
phead->prev->prev->next = phead;
phead->prev = phead->prev->prev;
free(del);
del = NULL;
}
void LTPushFront(LTNode* phead, LTDataType x)
{
assert(phead);
LTNode* pnew = NewNode(x);
pnew->next = phead->next;
pnew->prev = phead;
phead->next->prev = pnew;
phead->next = pnew;
}
void LTPopFront(LTNode* phead)
{
assert(phead);
assert(phead->next!=phead);
LTNode* tmp = phead->next;
phead->next->next->prev = phead;
phead->next = phead->next->next;
free(tmp);
tmp = NULL;
}
//在pos位置之后插入数据
void LTInsert(LTNode* pos, LTDataType x)
{
LTNode* pnew = NewNode(x);
pnew->next = pos->next;
pnew->prev = pos;
pos->next->prev = pnew;
pos->next = pnew;
}
void LTErase(LTNode* pos)
{
LTNode* tmp = pos;
pos->prev->next = pos->next;
pos->next->prev = pos->prev;
free(tmp);
tmp = NULL;
}
LTNode* LTFind(LTNode* phead, LTDataType x)
{
assert(phead);
assert(phead->next!=phead);
LTNode* pcur = phead->next;
while (pcur != phead)
{
if (pcur->data == x)
{
return pcur;
}
pcur = pcur->next;
}
return NULL;
}
main.c
#include"ListNode.h"
int main()
{
LTNode* head = LTInit();
LTPushBack(head, 2);
LTPushBack(head, 5);
LTPushBack(head, 9);
LTPushBack(head, 3);
LTPushFront(head, 10);
LTPushFront(head, 18);
LTPushFront(head, 11);
LTErase(LTFind(head, 18));
LTInsert(LTFind(head, 10), 55);
LTPrint(head);
LTDestroy(head);
return 0;
}