c語言實現雙向迴圈連結串列
阿新 • • 發佈:2018-12-16
此次工程還是使用了3個原始檔list.h(標頭檔案原始碼),main.c(實現介面的具體程式碼),list.c(單鏈表邏輯)
list.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int LTDataType;
typedef struct ListNode
{
LTDataType _data;
struct ListNode* _next;
struct ListNode* _prev;
}ListNode;
typedef struct List
{
struct ListNode* _head;
}List;
void ListInit(List* plist);
void ListDestory(List* plist);
ListNode* BuyListNode(LTDataType x);
void ListPushBack(List* plist, LTDataType x);
void ListPrint(List* plist);
void ListPopBack(List* plist);
void ListPushFront(List* plist, LTDataType x) ;
void ListPopFront(List* plist);
ListNode* ListFind(List* plist, LTDataType x);
void ListInsert(ListNode* pos, LTDataType x);
void ListErase(List* plist,ListNode* pos);
void ListRemove(List* plist, LTDataType x);
main.c
#include"list.h"
void ListInit(List* plist)
{
ListNode* head = BuyListNode (-1);
assert(plist);
head ->_next = head;
head ->_prev = head;
plist ->_head = head;
}
ListNode* BuyListNode(LTDataType x)
{
ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
newnode ->_next = NULL;
newnode ->_prev = NULL;
newnode ->_data = x;
return newnode;
}
void ListPrint(List* plist)
{
ListNode* cur = plist ->_head ->_next ;
printf("<-head->");
while(cur != plist ->_head )
{
printf("<-%d->",cur->_data);
cur = cur ->_next ;
}
printf("\n");
}
void ListDestory(List* plist)
{
ListNode* cur = plist ->_head ->_next;
ListNode* next;
while(cur != plist ->_head)
{
next = cur -> _next;
free(cur);
cur = next;
}
free(plist ->_head);
plist ->_head = NULL;
}
void ListPushBack(List* plist, LTDataType x)
{
//ListNode* newnode = BuyListNode(x);
//ListNode* prev = plist ->_head ->_prev;
//prev ->_next = newnode;
//newnode ->_prev = prev;
//newnode ->_next = plist->_head;
//plist ->_head ->_prev = newnode;
ListInsert(plist ->_head, x);
}
void ListPopBack(List* plist)
{
//ListNode* head = plist ->_head;
//ListNode* prev = head ->_prev ;
//ListNode* prevprev = prev ->_prev ;
//assert(plist && plist ->_head ->_next != plist ->_head );
//free(prev);
//prevprev ->_next = head;
//head ->_prev = prevprev;
ListErase(plist,plist ->_head ->_prev );
}
void ListPushFront(List* plist, LTDataType x)
{
//ListNode* newnode = BuyListNode(x);
//ListNode* head = plist ->_head;
//ListNode* next = head ->_next;
//assert(plist);
//head ->_next = newnode;
//newnode ->_prev = head;
//next ->_prev = newnode;
//newnode ->_next = next;
ListInsert(plist ->_head ->_next , x);
}
void ListPopFront(List* plist)
{
//ListNode* head = plist ->_head ;
//ListNode* del = head ->_next ;
//ListNode* next = head ->_next ->_next ;
//assert(plist && plist ->_head ->_next != plist ->_head );
//free(del);
//head ->_next = next;
//next ->_prev = head;
ListErase(plist,plist ->_head ->_next);
}
ListNode* ListFind(List* plist, LTDataType x)
{
ListNode* head = plist ->_head;
ListNode* cur = head ->_next;
assert(plist && plist ->_head ->_next != plist ->_head );
while(cur != head)
{
if(cur ->_data == x)
{
return cur;
}
cur = cur ->_next ;
}
return NULL;
}
void ListInsert(ListNode* pos, LTDataType x)
{
ListNode* newnode = BuyListNode(x);
ListNode* prev = pos ->_prev;
assert(pos);
prev ->_next = newnode;
newnode ->_prev = prev;
newnode ->_next = pos;
pos ->_prev = newnode;
}
void ListErase(List* plist,ListNode* pos)
{
ListNode* prev = pos ->_prev;
ListNode* next = pos ->_next;
assert(pos && plist ->_head ->_next != plist ->_head);
prev ->_next = next;
next ->_prev = prev;
}
void ListRemove(List* plist, LTDataType x)
{
ListNode* pos = ListFind(plist,x);
if(pos)
{
ListErase(plist, pos);
}
else
{
return;
}
}
list.h
#include"list.h"
int main()
{
List list;
ListNode* pos = NULL;
ListInit(&list);
ListPushBack(&list,1);
ListPushBack(&list,2);
ListPushBack(&list,3);
ListPushBack(&list,4);
ListPrint(&list);
ListPopBack(&list);
ListPrint(&list);
ListPushFront(&list,5);
ListPrint(&list);
ListPopFront(&list);
ListPrint(&list);
ListFind(&list,2);
//printf("%d",ListFind(&list,2));//列印一個位置
pos = ListFind(&list,2);
ListInsert(pos,6);
ListPrint(&list);
ListErase(&list,pos);
ListPrint(&list);
ListRemove(&list,3);
ListPrint(&list);
ListDestory(&list);
return 0;
}