1. 程式人生 > >c語言實現雙向迴圈連結串列

c語言實現雙向迴圈連結串列

此次工程還是使用了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;
}