双向链表的头插尾插和删除。
关于链表这一块,其实很简单,只要记得操作的时候,先对新的结点操作,再操作前后。
没有编译。可能有问题,仅供参考。
/***************************************************************************** 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; } }