双向循环链表(10.2)

1.理论


2.C代码

/*************************************************************************
	> File Name: list.c
	> Author: NULL
	> Mail: 574889524@qq.com
	> Created Time: 2014年11月04日 星期二 20时09分03秒
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
/*双向循环链表,带哨兵(头节点)*/
struct sList{
    int iValue;
    struct sList *pNext;
    struct sList *pPrev;
};
/*********************************************************/
void InitList(struct sList **ppList)
{
    *ppList = (struct sList*)malloc(sizeof(struct sList));
    (*ppList)->pNext = (*ppList)->pPrev = (*ppList);
    /*相当于一个哨兵,其实就是我们所谓的头节点*/
}


void ExitList(struct sList **ppList)
{
    struct sList *p = (*ppList)->pNext;
    struct sList *q;
    while(p!=(*ppList)){
        q = p->pNext;
        free(p);
        p = q;
    }
    free(*ppList);
}

/*********************************************************/
/*查找第一个k元素 并返回指向k元素节点的指针*/
struct sList * ListSearch(struct sList *pHead,int k)
{
    
    struct sList *p = pHead->pNext;
    while(p!=pHead){
        if(p->iValue == k)
            return p;
        else
            p = p->pNext;
    }
    printf("Not find %d\n",k);
    return NULL;/*没有找到k*/
}
/*插入的都在pHead后面的第一位*/
void ListInsert(struct sList *pHead,int x)
{
    struct sList *p = NULL;
    struct sList *pNode = (struct sList*)malloc(sizeof(struct sList));

    pNode->iValue = x;
    
    if(pHead->pNext == pHead){/*为空时*/
        pNode->pPrev = pNode->pNext = pHead;
        pHead->pNext = pHead->pPrev = pNode;
    }else{
        pNode->pPrev = pHead;
        pHead->pNext->pPrev = pNode;
        pNode->pNext = pHead->pNext;
        pHead->pNext = pNode;
    }
}
/*删除第一个元素是x的节点*/
int  ListDelete(struct sList *pHead,int x)
{
    struct sList *pNode = ListSearch(pHead,x);/*找到这个节点指针*/
    if(!pNode){/*未找到*/
        printf("list delete fail\n");
        return -1;
    }
    /*说明只有一个元素,且要删除它*/
    if(pNode->pNext == pHead && pHead->pNext==pNode){
        pHead->pNext = pHead->pPrev = NULL;
        free(pNode);
    }else{
        pNode->pPrev->pNext = pNode->pNext;
        pNode->pNext->pPrev = pNode->pPrev;
        free(pNode);
    }

    return 0;
}

int main()
{
    int i;
    struct sList *pList;
    struct sList *p;
    InitList(&pList);
    for(i = 1;i<10;++i)
        ListInsert(pList,i);
    for(i=1;i<11;i++){
        p = ListSearch(pList,i);
        if(p != NULL)
            printf("%d ",p->iValue);
    }
    ExitList(&pList);
    return 0;
}

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

byd yes

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值