首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

双向循环链表容易实现

2013-03-27 
双向循环链表简单实现DLoopLinkList.h//// DLoopLinkList.h//双向循环链表 2013/03//#ifndef DLOOP_LINK_L

双向循环链表简单实现

DLoopLinkList.h

//// DLoopLinkList.h//  双向循环链表 2013/03//#ifndef DLOOP_LINK_LIST_H#define DLOOP_LINK_LIST_Htypedef 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 InsertDLoopLinkListint 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);}

?

热点排行