DLoopLinkList.h
//
// DLoopLinkList.h
// 雙向循環鏈表 2013/03
//
#ifndef DLOOP_LINK_LIST_H
#define DLOOP_LINK_LIST_H
typedef int ElemType;
typedef struct DLoopLinkList
{
struct DLoopLinkList *prior;
ElemType data;
struct DLoopLinkList *next;
}DLoopLinkList, *PtrDLoopLinkList;
void InitDLoopLinkList(PtrDLoopLinkList);
void DestoryDLoopLinkList(PtrDLoopLinkList);
void InsertDLoopLinkList(PtrDLoopLinkList, int, ElemType);
void ShowDLoopLinkList(PtrDLoopLinkList);
void Append(PtrDLoopLinkList, ElemType);
void Delete(PtrDLoopLinkList, int, ElemType *);
#endif
DLoopLinkList.c
#include <stdlib.h>
#include <stddef.h>
#include <stdio.h>
#include "DLoopLinkList.h"
void InitDLoopLinkList(PtrDLoopLinkList ptrDLL)
{
ptrDLL->prior = ptrDLL;
ptrDLL->next = ptrDLL;
}
typedef PtrDLoopLinkList PDLLL;
void DestoryDLoopLinkList(PtrDLoopLinkList ptrDll)
{
PDLLL pite; // 用於遍歷的指針
PDLLL temp; // 用於存放要刪除的節點的臨時指針
pite = ptrDll->next; // 指向首元節點
while(pite != ptrDll)
{
temp = pite;
pite = pite->next;
free(temp);
}
ptrDll->prior = NULL;
}
//
// index表示插入到index之前
//
void InsertDLoopLinkList(PDLLL ptrDll, int index, ElemType data)
{
// 構建新節點
PDLLL newNode = NULL;
PDLLL pIte = NULL; // 用來循環的指針
PDLLL pHead = ptrDll; // 頭指針
int i = -1;
newNode = (PDLLL)malloc(sizeof(DLoopLinkList));
newNode->data = data;
pIte = pHead; // 初始化指向首元節點
// 遍歷找到第i-1個節點
while(i < index - 1)
{
pIte = pIte->next;
++i;
}
//printf("i = %d, data = %d", i, pIte->data);
if(i == index - 1)
{
//printf("call insert\n");
newNode->prior = pIte;
pIte->next->prior = newNode;
newNode->next = pIte->next;
pIte->next = newNode;
}
}
void ShowDLoopLinkList(PDLLL dllList)
{
PDLLL pIte;
pIte = dllList->next;
//printf("pIte = %p\n", pIte);
while(pIte != dllList)
{
printf("%-4d",pIte->data);
pIte = pIte->next;
}
printf("\n");
}
void Append(PtrDLoopLinkList pdl, ElemType data)
{
// 創建一個節點
PDLLL newNode = (PDLLL)malloc(sizeof(DLoopLinkList));
newNode->data = data;
newNode->next = pdl->prior->next;
pdl->prior->next = newNode;
newNode->prior = pdl->prior;
pdl->prior = newNode;
}
void Delete(PtrDLoopLinkList pdl, int index, ElemType * pData)
{
int i = 0;
PDLLL pIte = pdl->next;
while(i < index && pIte != pdl)
{
pIte = pIte->next;
++i;
}
if(i == index && pIte != pdl)
{
*pData = pIte->data;
pIte->prior->next = pIte->next;
pIte->next->prior = pIte->prior;
free(pIte);
}
}
main.c
#include <stdio.h>
#include "DLoopLinkList.h"
#define Insert InsertDLoopLinkList
int main(int argc, char* argv[])
{
DLoopLinkList dl;
int i = 0;
ElemType e;
InitDLoopLinkList(&dl);
for(; i < 100; ++i)
{
Append(&dl, i);
}
Insert(&dl, 100, 100);
Insert(&dl, 0, 100);
Insert(&dl, 1, 101);
Delete(&dl, 0, &e);
printf("The element which be deleted:%d\n", e);
Delete(&dl, 101, &e);
printf("The element which be deleted:%d\n", e);
ShowDLoopLinkList(&dl);
printf("<<ShowDLoopLinkList>> ends.\n");
DestoryDLoopLinkList(&dl);
}