Chinaunix首页 | 论坛 | 博客
  • 博客访问: 836861
  • 博文数量: 489
  • 博客积分: 475
  • 博客等级: 下士
  • 技术积分: 3087
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 16:28
文章分类

全部博文(489)

文章存档

2013年(7)

2012年(301)

2011年(181)

分类:

2011-12-22 22:06:30

原文地址: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

阅读(769) | 评论(0) | 转发(0) |
0

上一篇:链表排序

下一篇:队列应用编程

给主人留下些什么吧!~~