List.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <malloc.h>
typedef int DataType;
typedef struct ListNode
{
DataType data;
struct ListNode* next;
struct ListNode* prev;
} ListNode;
ListNode *ListInitList();
ListNode *BuyNode(DataType x);
void ListPrintList(ListNode *PList);
void ListPushBack(ListNode *PList, DataType x);
void ListPushFront(ListNode *PList, DataType x);
void ListPopBack(ListNode *PList);
void ListPopFront(ListNode *PList);
ListNode *ListFindList(ListNode *PList, DataType x);
void ListInsert(ListNode *pos, DataType x);
void ListErase(ListNode *pos);
void DeleteList(ListNode *PList);
List.c
#include "List.h"
ListNode *ListInitList()
{
DataType x = 0;
ListNode *head = BuyNode(x);
head->next = head;
head->prev = head;
return head;
}
ListNode *BuyNode(DataType x)
{
ListNode *newnode = (ListNode*)malloc(sizeof(ListNode));
if (newnode == NULL)
return NULL;
newnode->data = x;
newnode->next = NULL;
newnode->prev = NULL;
return newnode;
}
void ListPrintList(ListNode *PList)
{
assert(PList);
ListNode *cur = PList->next;
while (cur != PList)
{
printf("%d -> ", cur->data);
cur = cur->next;
}
printf("N\n");
}
void ListPushBack(ListNode *PList, DataType x)
{
ListNode *head = PList;
ListNode *tail = head->prev;
ListNode *newnode = BuyNode(x);
tail->next = newnode;
newnode->prev = tail;
newnode->next = head;
head->prev = newnode;
}
void ListPushFront(ListNode *PList, DataType x)
{
ListNode *first = PList->next;
ListNode *newnode = BuyNode(x);
PList->next = newnode;
newnode->prev = PList;
newnode->next = first;
first->prev = newnode;
}
void ListPopBack(ListNode *PList)
{
ListNode *tail = NULL;
ListNode *prev = NULL;
assert(PList&&PList->next != NULL);
ListErase(PList->prev);
}
void ListPopFront(ListNode *PList)
{
ListNode *first = NULL;
ListNode *next = NULL;
assert(PList&&PList->next != NULL);
ListErase(PList->next);
}
ListNode *ListFindList(ListNode *PList, DataType x)
{
ListNode *cur = NULL;
assert(PList);
cur = PList->next;
while (cur != PList)
{
if (cur->data == x)
return cur;
cur = cur->next;
}
return NULL;
}
void ListInsert(ListNode *pos, DataType x)
{
ListNode *newnode = NULL;
ListNode *prev = NULL;
assert(pos);
prev = pos->prev;
newnode = BuyNode(x);
prev->next = newnode;
newnode->prev = prev;
newnode->next = pos;
pos->prev = newnode;
}
void ListErase(ListNode *pos)
{
ListNode *prev = NULL;
ListNode *next = NULL;
assert(pos);
prev = pos->prev;
next = pos->next;
prev->next = next;
next->prev = prev;
free(pos);
pos = NULL;
}
void DeleteList(ListNode *PList)
{
assert(PList);
ListNode *cur = PList->next;
ListNode *next = NULL;
while (cur != PList)
{
next = cur->next;
free(cur);
cur = NULL;
cur = next;
}
}
main.c
#include "List.h"
void text()
{
ListNode *plist = ListInitList();
ListPushBack(plist, 1);
ListPushBack(plist, 2);
ListPushBack(plist, 3);
ListPushBack(plist, 4);
ListPushFront(plist, 1);
ListPushFront(plist, 2);
ListPushFront(plist, 3);
ListPushFront(plist, 4);
ListPrintList(plist);
ListNode *pos1 = ListFindList(plist, 3);
if (pos1 == NULL)
printf("pos1没找到\n");
else
printf("pos1找到了: %d\n", pos1->data);
ListNode *pos2 = ListFindList(plist, 5);
if (pos2 == NULL)
printf("pos2没找到\n");
else
printf("pos2找到了: %d\n", pos2->data);
ListPopBack(plist);
ListPrintList(plist);
ListPopBack(plist);
ListPrintList(plist);
ListPopFront(plist);
ListPrintList(plist);
ListNode *pos = ListFindList(plist, 3);
if (pos == NULL)
printf("没找到\n");
else
{
ListInsert(pos, 4);
ListPrintList(plist);
ListErase(pos);
ListPrintList(plist);
}
DeleteList(plist);
}
int main()
{
text();
system("pause");
return 0;
}