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

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

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, 12);

    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(!|| j > i)
        
return 0;
    
*= 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(!|| j > i)
        
return 0;
    
*= p->data;

    
return 1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值