无头单向非循环链表的实现
常见的单链表面试题
DLinkList.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int DLDataType;
typedef struct ListNode {
DLDataType data;
struct ListNode *prev;
struct ListNode *next;
}ListNode;
typedef struct List {
struct ListNode *head;
}List;
void ListInit(List *plist);
void ListDestory(List *plist);
ListNode* BuyNode(DLDataType data);
void ListPrint(List *plist);
void ListPushBack(List *plist, DLDataType data);
void ListPopBack(List *plist);
void ListPushFront(List *plist, DLDataType data);
void ListPopFront(List *plist);
ListNode* ListFind(List *plist, DLDataType data);
void ListInsert(ListNode* pos, DLDataType data);//在指定位置前插入元素
void ListErase(ListNode* pos);
DLinkList.c
#include"DLinkList.h"
void ListInit(List *plist)
{
assert(plist);
plist->head = BuyNode(0);
plist->head->prev = plist->head;
plist->head->next = plist->head;
}
ListNode* BuyNode(DLDataType data)
{
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
node->data = data;
node->prev = NULL;
node->next = NULL;
return node;
}
void ListDestory(List *plist)
{
assert(plist);
ListNode* cur = plist->head->next;
while (cur != plist->head)
{
ListNode* next = cur->next;
free(cur);
cur = next;
}
free(plist->head);
plist->head = NULL;
}
void ListPrint(List *plist)
{
assert(plist);
ListNode* cur = plist->head->next;
while (cur != plist->head)
{
printf("%d <=> ", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
void ListPushBack(List *plist, DLDataType data)
{
assert(plist);
ListNode* node = BuyNode(data);
ListNode* cur = plist->head;
ListNode* tail = plist->head->prev;
tail->next = node;
node->next = cur;
node->prev = tail;
cur->prev = node;
}
void ListPopBack(List *plist)
{
assert(plist);
ListNode* cur = plist->head;
ListNode* tail = cur->prev;
ListNode* prev = tail->prev;
cur->prev = prev;
prev->next = cur;
free(tail);
}
void ListPushFront(List* plist, DLDataType data)
{
assert(plist);
ListNode* cur = plist->head;
ListNode* next = cur->next;
ListNode* node = BuyNode(data);
cur->next = node;
next->prev = node;
node->next = next;
node->prev = cur;
}
void ListPopFront(List* plist)
{
assert(plist);
ListNode* prev = plist->head;
ListNode* cur = prev->next;
ListNode* next = cur->next;
//链表中只有头节点时,不做处理
if (prev == cur)
return;
prev->next = next;
next->prev = prev;
free(cur);
cur = NULL;
}
ListNode* ListFind(List *plist, DLDataType data)
{
assert(plist);
ListNode* cur = plist->head->next;
while (cur != plist->head)
{
if (cur->data == data)
return cur;
else
cur = cur->next;
}
return NULL;
}
void ListInsert(ListNode* pos, DLDataType data)
{
assert(pos);
ListNode* prev = pos->prev;
ListNode* node = BuyNode(data);
prev->next = node;
node->next = pos;
node->prev = prev;
pos->prev = node;
}
void ListErase(ListNode* pos)
{
assert(pos);
ListNode* prev = pos->prev;
ListNode* next = pos->next;
prev->next = next;
next->prev = prev;
free(pos);
pos = NULL;
}