数据结构之双向链表操作(二)

时间:2019-02-14
本文章向大家介绍数据结构之双向链表操作(二),主要包括数据结构之双向链表操作(二)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

为了方便删除操作,从而引出了双向链表
1,定义:

typedef struct node
{
    int data;
    struct node * pre;
    struct node * next;
} DNode;

2,尾插

DNode*  InsertTail(DNode* plist, int val)
{
   DNode* pTmp = (DNode*)malloc(sizeof(DNode));
	pTmp->data = val;
	pTmp->next = NULL;
	pTmp->pre = NULL;
	
	DNode* pCur = plist;
	while (NULL != pCur->next)
	{
		pCur = pCur->next;
	}
	pTmp->pre = pCur;		
	pCur->next = pTmp;
	return  plist;
}

3,头插

DNode*  InsertHead(DNode* plist, int val)
{
	DNode* pTmp = (DNode*)malloc(sizeof(DNode));
	pTmp->data = val;
	pTmp->next = NULL;
	pTmp->pre = NULL;
	
	pTmp->next = plist->next;
	pTmp->pre = plist;
	if (NULL != pTmp->next)		//这里的判断一定不能少,读者可以试想去掉这个会发生什么
	{
		pTmp->next->pre = pTmp;		//后一个节点的前驱指向pTmp
	}
	plist->next = pTmp;
	return plist;
}

4,获取链表长度

int GetListLen(DNode* plist)
 {
     DNode* pTmp = plist;
     int iCount = 0; 
     while (NULL != pTmp)
     {
         Count++; 
         pTmp = pTmp->next;
     }
     return iCount;
 }