带头结点链表c语言,c语言带头结点的双向循环链表

淡淡的烟草味﹌ 2022-10-15 00:41 363阅读 0赞

//头文件

#include

typedef enum Status

{

StatusFail,

StatusOk

}Status;

typedef struct ElemType

{

int m_pid;

int m_exit;

}ElemType;

typedef struct DuLNode

{

ElemType data;

struct DuLNode *pre;

struct DuLNode *next;

}DuLNode, *DuLinkList, *PNode;

//辅助函数

int CompareElem(ElemType *a, ElemType *b);

int CopyElem(ElemType*dest, ElemType *source);

//public接口

Status InitList(DuLinkList *L);

Status DestroyList(DuLinkList *L);

Status ClearList(DuLinkList L);

Status ListInsert(DuLinkList L, PNode node, ElemType e);

PNode ListDelete(DuLinkList L, PNode node, ElemType *e);

PNode ListFind(DuLinkList L, ElemType e);

void ListTraverse(DuLinkList L, void(*visit)(ElemType *e) );

//private接口

//cpp文件

#include”doubleLinkList.h”

#include

int CompareElem(ElemType *a, ElemType *b)

{

if(a->m_pid == b->m_pid

&& a->m_exit == b->m_exit)

{

return 0;

}

else

{

return 1;

}

}

int CopyElem(ElemType*dest, ElemType *source)

{

dest->m_pid = source->m_pid;

dest->m_exit = source->m_exit;

}

//public接口

Status InitList(DuLinkList *L)

{

*L = (DuLinkList)malloc(sizeof(DuLNode));

if(*L == NULL)

{

return StatusFail;

}

else

{

(*L)->pre = (*L)->next = *L;

return StatusOk;

}

}

Status DestroyList(DuLinkList *L)

{

ClearList(*L);

free(*L);

*L=NULL;

return StatusOk;

}

Status ListInsert(DuLinkList L, PNode node, ElemType e)

{

PNode pe = (PNode)malloc(sizeof(DuLNode));

if(pe == NULL)

{

return StatusFail;

}

//pe->data = e;

CopyElem(&(pe->data), &e);

pe->pre = node->pre; node->pre->next = pe;

pe->next = node; node->pre = pe;

return StatusOk;

}

//必须保证node不是头结点

PNode ListDelete(DuLinkList L, PNode node, ElemType *e)

{

//*e = p->data;

CopyElem(&(node->data), e);

node->pre->next = node->next;

node->next->pre = node->pre;

free(node);

return node->next;

}

PNode ListFind(DuLinkList L, ElemType e)

{

PNode ret = L->next;

while(ret != L)

{

if(CompareElem(&(ret->data), &e) == 0)

{

return ret;

}

ret = ret->next;

}

return NULL;

}

Status ClearList(DuLinkList L)

{

PNode q, p = L->next;

while(p != L)

{

q = p->next;

free(p);

p = q;

}

L->pre = L->next = L;

return StatusOk;

}

void ListTraverse(DuLinkList L, void (*visit)(ElemType *e))

{

PNode p= L->next; // p指向头结点

while(p != L)

{

visit(&(p->data));

p=p->next;

}

printf(“\n”);

}

//测试代码

#include”DoubleLinkList.c”

void print(ElemType *e)

{

printf(“%d, %d\n”, e->m_pid, e->m_exit);

}

int main()

{

ElemType a = {1, 0};

ElemType b = {2, 0};

ElemType c = {3, 0};

ElemType d = {4, 0};

DuLinkList L;

InitList(&L);

printf(“\nListInsert\n”);

ListInsert(L, L, a);

ListInsert(L, L, b);

ListInsert(L, L, c);

ListTraverse(L, print);

printf(“\nListFind\n”);

PNode pb = ListFind(L, b);

pb->data.m_exit = 1;

printf(“%d, %d\n”, pb->data.m_pid, pb->data.m_exit);

printf(“\nListDelete\n”);

ListDelete(L, pb, &d);

ListTraverse(L, print);

printf(“\nListFind\n”);

PNode pd = ListFind(L, d);

(pd == NULL)? printf(“NULL\n”) : printf(“\n%d, %d\n”, pd->data.m_pid, pd->data.m_exit);

printf(“\nClearList\n”);

ClearList(L);

ListTraverse(L, print);

printf(“\nDestroyList\n”);

DestroyList(&L);

system(“pause”);

return 0;

}

匆忙完成,如果疏漏请各位指正。

发表评论

表情:
评论列表 (有 0 条评论,363人围观)

还没有评论,来说两句吧...

相关阅读