序言
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。 所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
双链表表示
typedef struct DNode {
struct DNode *next;
struct DNode *pre;
ELEMENT data;
} DNode, *PDNode;
初始化
void init_dlist(PDNode *pHead) {
*pHead = malloc(sizeof(DNode));
if (*pHead == NULL) {/* 存儲分配失敗 */
exit(OVERFLOW);
}
(*pHead)->next = NULL;
(*pHead)->pre = NULL;
};
获取指定节点
int get_length_dlist(PDNode pHead) {
PDNode tempHead = pHead;
int count = 0;
while (tempHead != NULL) {
tempHead = tempHead->next;
count++;
}
return count;
};
添加
找到pos-1在pos位置插入.图解
//add to list end
bool insert_element_dlist(PDNode pHead, int pos, ELEMENT data) {
PDNode tempHead = pHead;
if (pos < 1 || pos > get_length_dlist(tempHead)) {
return false;
}
if (pos == 1) { //链表没有0位置.要找的是pos-1位置插入.所以pos==1特殊处理
PDNode newNode = malloc(sizeof(DNode));
newNode->next = tempHead->next;
newNode->data = data;
tempHead->next = newNode;
newNode->pre = tempHead;
return true;
}
tempHead = get_element_dlist(tempHead, pos - 1);
PDNode newNode = malloc(sizeof(DNode));
newNode->data = data;
newNode->pre = tempHead;
newNode->next = tempHead->next;
tempHead->next = newNode;
return true;
};
删除
找到pos-1的位置.删除pos
bool del_element_dlist(PDNode pHead, int pos, ELEMENT *data) {
PDNode tempHead = pHead;
if (pos < 1 || pos > get_length_dlist(tempHead) + 1) {
return false;
}
if (pos == 1) {
PDNode freeNode = tempHead->next;
if (freeNode == NULL) {
return false;
}
freeNode->pre->next = freeNode->next;
if (freeNode->next == NULL) {
return false;
}
freeNode->next->pre = freeNode->pre;
return true;
}
tempHead = get_element_dlist(tempHead, pos - 1);
if (tempHead == NULL) {
return false;
}
PDNode freeNode = tempHead->next;
*data = freeNode->data;
freeNode->pre->next = freeNode->next;
if (freeNode->next != NULL) {
freeNode->next->pre = tempHead;
}
free(freeNode);
return true;
}
销毁
void destroy_dlist(PDNode *pHead) {
PDNode q, p = (*pHead)->next; /* p指向第一个结点 */
while (p != *pHead) /* p没到表头 */
{
q = p->next;
free(p);
p = q;
}
free(*pHead);
};
打印
void print_dlist(PDNode pHead) {
PDNode tempNode = pHead->next;
while (tempNode != NULL) {
printf("%d", tempNode->data);
tempNode = tempNode->next;
}
};
github:
https://github.com/HumorSmith/DataStructure/tree/master/link_list
引用:
http://blog.csdn.net/qq490691606/article/details/49948263