您的位置:首页 > 理论基础 > 数据结构算法

数据结构——基本数据结构之链表

2008-01-23 11:43 651 查看
双向循环链表
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

DuLinkListMain.c


#include <stdio.h>


#include <stdlib.h>


#include "linklist.h"






/**//*简单测试程序*/


int main(int argc, char **argv)




...{


ElemType elem;


LinkList pDuList;




InitList(&pDuList);




ListInsert(&pDuList, 1, 2);




printf("%d %d ", pDuList->data, pDuList->next->data);




ListDelete(&pDuList, 1, &elem);


printf("The delete element is %d ", elem);




DestroyList(&pDuList);




return 0;


}

linklist.h


#ifndef _LINKLIST_H


#define _LINKLIST_H




typedef int ElemType;




typedef struct DuLinkNode...{


ElemType data;


struct DuLinkNode *prior;


struct DuLinkNode *next;


}LNode, *LinkList;




int InitList(LinkList *head);


int DestroyList(LinkList *head);


int ListInsert(LinkList *head, int i, ElemType e);


int ListDelete(LinkList *head, int i, ElemType *e);


int ListSearch(LinkList head, ElemType e);


int GetElem(LinkList head, int i, ElemType *e);




#endif

linklist.c


#include <stdio.h>


#include <stdlib.h>


#include "linklist.h"






/**//*产生头结点为head的空双向链表*/


int InitList(LinkList *head)




...{


*head = (LinkList)malloc(sizeof(LNode));


if(!(*head))


return 0;


(*head)->next = *head;


(*head)->prior = *head;




(*head)->data = 0; /**//*链表长度*/




return 1;


}






/**//*操作结果:销毁头结点为head双向链表*/


int DestroyList(LinkList *head)




...{


LinkList p, q;




p = (*head)->next;


while(p != *head)




...{


q = p->next;


free(p);


p = q;


}


free(*head);


*head = NULL;




return 1;


}






/**//*在头结点为head的双链线性表中第i个位置之前插入元素e,i的合法值为1≤i≤表长+1*/


int ListInsert(LinkList *head, int i, ElemType e)




...{


int j;


LinkList p, s;




j = 1;


p = (*head)->next;


while(p && j < i)




...{


p = p->next;


j++;


}


if(!(s = (LinkList)malloc(sizeof(LNode))))


return 0;


s->data = e;


s->prior = p->prior;


p->prior->next = s;


s->next = p;


p->prior = s;




return 1;


}






/**//*删除带头结点的双链线性表的第i个元素,i的合法值为1≤i≤表长*/


int ListDelete(LinkList *head, int i, ElemType *e)




...{


int j;


LinkList p;




j = 1;


p = (*head)->next;


while(p && j < i)




...{


p = p->next;


j++;


}


if(!p || j > i)


return 0;


*e = p->data;


p->prior->next = p->next;


p->next->prior = p->prior;


free(p);




return 1;


}






/**//*带头结点的双链线性表中查找是否含有值为e的节点*/


int ListSearch(LinkList head, ElemType e)




...{


LinkList p;




p = head->next;


while(p != NULL && p->data != e)




...{


p = p->next;


}


if(p != NULL)


return 1;


else


return 0;


}






/**//*当第i个元素存在时,其值赋给e并返回1,否则返回0*/


int GetElem(LinkList head, int i, ElemType *e)




...{


int j;


LinkList p;




p = head->next;


j = 1;


while(p && j < i)




...{


p = p->next;


j++;


}


if(!p || j > i)


return 0;


*e = p->data;




return 1;


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: