双向链表插入与删除
2014-08-27 10:59
260 查看
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct node { int data; struct node *pre; struct node *next; }dnode; /* 双向链表删除结点 */ dnode *Del_Node(dnode *Head, int num) { dnode *p1,*p2; p1 = Head; // 遍历到num结点 while( num != p1->data && p1->next != NULL) { p1 = p1->next; } // 找到了数据域为data的结点 if(num == p1->data) { if( p1 == Head ) // 要删除的结点是头结点 { Head = Head->next; // 更新头结点位置及其指针域 Head->pre = NULL; free(p1); } else if(p1->next == NULL) // 要删除的是最后一个结点 { p1->pre->next = NULL; free(p1); } else // 中间结点 { p1->next->pre = p1->pre; p1->pre->next = p1->next; free(p1); } } else { printf("%d cound not been found",num); } return Head; } /* 双向链表插入结点 */ dnode *Insert_Sort(dnode *Head, int num) { dnode *p0,*p1; p1 = Head; p0 = (dnode *)malloc( sizeof(dnode) ); p0->next = NULL; p0->pre = NULL; p0->data = num; if(p1 == NULL) { Head = p0; return Head; } // 遍历 while( (p0->data > p1->data) && (p1->next != NULL) ) { p1 = p1->next; } if(p0->data <= p1->data) { if(Head == p1) // 头结点 { p0->next = p1; p1->pre = p0; Head = p0; } else { p1->pre->next = p0; p0->next = p1; p0->pre = p1->pre; p1->pre = p0; } } else // 最后一个结点 { p1->next = p0; p0->pre = p1; p0->next = NULL; } return Head; } /* print list item->name */ void print_list(dnode *Head) { dnode *temp = Head; while(temp) { printf("-------- %d\n",temp->data); temp = temp->next; } } void main() { dnode *Head = NULL; int i = 0; while( i++ < 10 ) { Head = Insert_Sort(Head,i); } print_list(Head); printf("------------------------------\n"); Head = Del_Node(Head,1); Head = Del_Node(Head,5); Head = Del_Node(Head,10); print_list(Head); }
相关文章推荐
- 数据结构--双向循环链表--插入和删除
- 双向链表的创建/插入/删除
- 单链表,双向链表的插入,查询,创建,删除,输出
- 双向链表的插入、删除、遍历
- [原]C语言实现双向链表删除节点、插入节点、双向输出等操作
- (C++版)链表(四)——实现双向循环链表创建、插入、删除等简单操作
- c/c++ 双向链表 创建 插入 删除
- 双向链表的插入与删除
- 双向链表实现 插入删除
- 双向循环链表的插入和删除
- 双向链表的初始化,建立,添加节点和删除节点(注意插入和删除要分三种情况)
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
- 实现双向链表删除一个节点P,在节点P后插入一个节点
- 如何使用c语言实现双向链表的插入删除操作
- 双向链表建立、插入删除
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- C语言实现双向链表删除、插入、双向输出
- 笔试题 实现双向链表的插入和删除
- 双向链表的创建、打印、求长、插入、删除、查值、清空、销毁
- 双向非循环递增链表——插入,删除,清空