双向链表的头插尾插和删除。
关于链表这一块,其实很简单,只要记得操作的时候,先对新的结点操作,再操作前后。
没有编译。可能有问题,仅供参考。
/*****************************************************************************
FileName: 双向链表.c
Author: xx Version : 1.0 Date: 2018.07.21
Description: 双向链表操作
Version: 1.0
History:
<author> <time> <version > <desc>
*******************************************************************************/
typedef struct doubleNode* pNode
typedef struct doubleNode
{
int date;
struct doubleNode* Next;
struct doubleNode* prior;
}Node;
struct doubleNode* linkListInit()
{
struct doubleNode* head = (struct doubleNode*)malloc(struct doubleNode);
head->date = 0;
head->Next = NULL;
head->prior = NULL;
return head;
}
//头插
void insertNode(pNode pHeader,int data)
{
if(pHeader == NULL)
return;
struct doubleNode* newDoubleNode = (struct doubleNode*)malloc(struct doubleNode);
newDoubleNode->date = data;
//先把新结点的前驱后继确定,再连接新结点与前后两个结点
newDoubleNode->prior = head;//新的前驱指向头
newDoubleNode->Next = head->Next;//新的后继指向头的下一个
newDoubleNode->Next->prior = newDoubleNode;//新的下一个节点的前驱指向新
head->Next = newDoubleNode;//头的下一个指向新结点
}
void insertNode2(pNode pHeader,int data)
{
if(pHeader == NULL)
return;
struct doubleNode* newDoubleNode = (struct doubleNode*)malloc(struct doubleNode);
newDoubleNode->date = data;
newDoubleNode->Next = NULL;
struct doubleNode* p = pHeader;
while(p->Next)
{
p = p->Next;
}
p->Next = newDoubleNode;
newDoubleNode->prior = p;
}
void deleteNode(pNode pHeader,int data)
{
if(pHeader == NULL)
return;
struct doubleNode* p = pHeader->Next,q;
while(p)
{
if(p->date == data)
{
q = p;
p = p->Next;
q->prior->Next = q->Next;
q->Next->prior = q->prior;
q->Next = NULL;
q->prior = NULL;
free(q);
continue;
}
p = p->Next;
}
}