2012年(1008)
分类:
2012-08-01 11:19:11
原文地址:C_双向循环链表 作者:luozhiyong131
/*
* 双向循环链表实现函数
* Lzy 2011-5-17
*/
#include
typedef struct person
{
int id; /*编号*/
char name[10]; /*姓名*/
}ElemType;
typedef struct dnode
{
ElemType data; /*个人信息*/
struct dnode *prior; /*前驱指针*/
struct dnode *next; /*后继指针*/
}DNode,*DuLinkList;
void DLinkListInit(DuLinkList *DL) /*初始化表头*/
{
(*DL) = (DNode *)malloc(sizeof(DNode));
(*DL)->next = (*DL)->prior = (*DL); /*指向自身*/
}
int DLinkListCreat(DuLinkList DL) /*创建双向循环链表*/
{
DNode *p1, *p2;
p1 = DL;
printf("输入编号 姓名(编号为0结束输入): \n");
while(1)
{
p2 = (DNode *)malloc(sizeof(DNode)); /*创建新节点*/
scanf("%d %s",&p2->data.id, p2->data.name);
if(p2->data.id == 0) /*是否结束输入*/
{
free(p2);
break;
}
p1->next = p2; /*添加到链表未尾*/
p2->prior = p1; /*前驱指针保存前一个节点的地址*/
p1 = p2;
}
p1->next = DL; /*链表后继尾指针指向头节点*/
DL->prior = p1; /*链表头前驱指针指向尾节点*/
return 0;
}
int DLinkListGetlen(DuLinkList DL) /*返回双向链表长度*/
{
int num = 0;
DNode *p;
p = DL->next;
while(p != DL)
{
num++;
p = p->next;
}
return num;
}
DNode *DLinkListGetelembyNum(DuLinkList DL,int n) /*按序号取元素*/
{
if(n < 1 || n > DLinkListGetlen(DL)) /*检查要找的序号是否合法*/
{
printf("查找序号有误:!\n");
return NULL;
}
while(n--) /*定位到第n个节点*/
DL = DL->next;
return DL;
}
int DLinkListInsert(DuLinkList DL,int n) /*在第n个元素后插入元素*/
{
DNode *p, *p2, *p1;
p = DLinkListGetelembyNum(DL,n);
if(p == NULL)
return -1;
p1 = p->next;
p2 = (DNode *)malloc(sizeof(DNode)); /*创建新节点*/
printf("输入编号 姓名:");
scanf("%d %s",&p2->data.id, p2->data.name); /*数据输入*/
p2->prior = p; /*新节点前驱指向第n个节点*/
p2->next = p->next; /*把第n个节点后继指针指向的地址贼给新节点*/
p->next = p2; /*更改第n个节点后继节点指向新节点*/
p1->prior = p2; /*把插入点之后的节点的前驱指针指向新节点*/
return 0;
}
int DLinkListDelelem(DuLinkList DL,int n) /*删除第n个节点*/
{
DNode *p, *p1, *p2;
p = DLinkListGetelembyNum(DL,n);
if(p == NULL)
return -1;
p1 = p->prior; /*找到第n-1个节点*/
p1->next = p->next; /*第n-1个节点的后继指针指向n+1*/
p2 = p->next; /*找到第n+1个节点*/
p2->prior = p1; /*第n+1个节点的前驱指针指向n-1*/
free(p); /*释放第n个节点*/
return 0;
}
void DLinkListDisp(DuLinkList DL) /*链表元素输出*/
{
DNode *p;
p = DL->next;
while(p != DL)
{
printf("%d %s\n",p->data.id,p->data.name);
p = p->next;
}
}
——第二部分:Linux C