c语言实现双链表

45 篇文章 1 订阅
38 篇文章 27 订阅
#include <assert.h>  
#include <stdlib.h>  
#include <stdio.h>  
  
  
typedef struct myList  DNode;  
struct myList  
{  
    DNode *next;  
    DNode *prev;  
    int data;  
};  
DNode* init(int data);  
void insertLastNode(DNode* L,int data);  
void insertNode(DNode* L,int data);  
DNode* findPrev(DNode* L,int data);  
void deleNode(DNode* L,int data);  
DNode* findCur(DNode* L,int data);  
  
/************************************************************************/  
/* 初始化第一个节点                                                     */  
/************************************************************************/  
DNode* init(int data)  
{  
    DNode* headNode=(DNode*)malloc(sizeof(DNode));  
    assert(headNode);  
    headNode->next = NULL;  
    headNode->prev = NULL;  
    headNode->data = data;  
    return headNode;  
}  
  
int isEmpty(DNode* L)  
{  
    return L->next ==NULL;  
}  
  
int isLast(DNode* L,DNode* p)  
{  
    return p->next==NULL;  
}  
  
DNode* findCur(DNode* L,int data)  
{  
    DNode* curNode;  
  
    curNode = L->next;  
  
    while(curNode !=NULL&& curNode->data!=data)  
        curNode = curNode->next;  
  
    return curNode;  
}  
/************************************************************************/  
/* 将节点插入到队列后端                                                 */  
/************************************************************************/  
void insertLastNode(DNode* L,int data)  
{  
    assert(L);  
    DNode* oNode=(DNode*)malloc(sizeof(DNode));  
    oNode->data = data;  
    L->next = oNode;  
    oNode->prev = L;  
}  
/** 
    插入到链表指定位置 
**/  
void insertNode(DNode* L,int data)  
{  
    assert(L);  
    DNode* qNode=(DNode*)malloc(sizeof(DNode));  
    DNode* prevNode= findPrev(L,data);  
  
  
      
    qNode->next = prevNode->next;  
    prevNode->next->prev = qNode;  
      
    prevNode->next = qNode;  
    qNode->prev = prevNode;  
    return;  
}  
  
DNode* findPrev(DNode* L,int data)  
{  
    assert(L);  
    DNode* tmpNode;   
    tmpNode = L;  
  
    while (tmpNode->next!=NULL&&tmpNode->next->data!=data)  
    {  
        tmpNode = tmpNode->next;  
    }  
    return tmpNode;  
}  
  
void deleNode(DNode* L,int data)  
{  
   DNode* tmpNode = findCur(L,data);  
   if (tmpNode==NULL)  
   {  
       return ;  
   }  
   if (isLast(L,tmpNode))  
   {  
       tmpNode->prev =NULL;  
        tmpNode->prev->next =NULL;  
        free(tmpNode);  
   }  
  
    tmpNode ->prev->next = tmpNode->next;  
    tmpNode->next->prev = tmpNode->prev;  
    free(tmpNode);  
   return ;  
}  
int _tmain(int argc, _TCHAR* argv[])  
{  
    DNode* myDNode;  
    myDNode = init(1);  
    return 0;  
}  


这篇文章来自csdn以博主的分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值