在实现双端链表的时候,由于图简单,没加哨兵。导致删除节点的时候出现free首节点无法删除。
原因是:引用 这篇博客 http://blog.csdn.net/llhyy17/article/details/5375298
void free(void *ptr)
{
struct mem_control_block *free;
free = ptr - sizeof(struct mem_control_block);
free->is_available = 1;
return;
}
需要将头节点往前移一个数据类型占用的内存大小。然后将这个地方的位置标记为可以使用的。这个时候就出现了内存访问非法了。
#include
#include
#include
#define max_link_length 10
using namespace std;
///定义一个节点
typedef struct Node {
struct Node *pre;
struct Node *next;
int value;
} Node,*DulLink;
///init a link
DulLink init(Node *dulLink) {
if(dulLink == NULL) {
dulLink = (Node*) malloc(sizeof(Node));
dulLink->pre = NULL;
}
printf("%d,",dulLink->value);
Node* list = dulLink;
for(int i =1;i < max_link_length;i++) {
Node* tmp = (Node*) malloc (sizeof(Node));
list->next = tmp;
tmp->value = i;
tmp->pre = list;
tmp->next=NULL;
printf("%d,",tmp->value);
list = tmp;
}
return dulLink;
}
///init a link
void destory(Node* dulLink) {
if(dulLink == NULL) {
return;
}
Node* list=dulLink;
list->pre = NULL;
while(dulLink != NULL) {
list = dulLink;
dulLink=dulLink->next;
list->pre = NULL;
list->next = NULL;
printf("%d,",list->value);
free(list);
}
printf("\n");
}
///init a link
DulLink ergodic(Node *dulLink) {
if(dulLink == NULL) {
return dulLink;
}
Node* list = dulLink;
while(list) {
printf("%d,",list->value);
list=list->next;
}
printf("\n");
}
DulLink insert (Node* dulLink, int i,int value) {
if(dulLink == NULL) {
return dulLink;
}
Node * tmp = (Node*) malloc(sizeof(Node));
tmp->value = value;
tmp->next = NULL;
if(i == 0) {
tmp->next = dulLink;
dulLink->pre=tmp;
dulLink = tmp;
return tmp;
}
///找插入点的前驱
Node* preList = dulLink;
while(preList && --i > 0) {
preList = preList->next;
}
///如果位置找的不对就直接退出
if(preList == NULL|| i > 0) {
return dulLink;
}
if(preList->next) {
tmp->next = preList->next;
preList->next->pre = tmp;
}
preList->next = tmp;
tmp->pre = preList;
return dulLink;
}
DulLink deleteOneElem (Node* dulLink, int i) {
if(dulLink == NULL) {
return dulLink;
}
///找删除点
Node* preList = dulLink;
while(preList && --i >= 0) {
preList = preList->next;
}
///如果位置找的不对就直接退出
if(preList == NULL|| i >= 0) {
return dulLink;
}
if(preList->pre && preList->next) {
preList->next->pre = preList->pre;
preList->pre->next = preList->next;
}
if(preList->pre && preList->next == NULL) {
preList->pre->next = NULL;
}
if(preList->pre ==NULL && preList->next) {
dulLink = preList ->next;
dulLink->pre = NULL;
}
free(preList);
return dulLink;
}
DulLink updateOneElem (Node* dulLink, int i, int value) {
if(dulLink == NULL) {
return dulLink;
}
///找删除点
Node* preList = dulLink;
while(preList && --i >= 0) {
preList = preList->next;
}
///如果位置找的不对就直接退出
if(preList == NULL|| i >= 0) {
return dulLink;
}
preList->value = value;
return dulLink;
}
///查询一个元素
DulLink selectOneElem (Node* dulLink, int i) {
if(dulLink == NULL) {
return NULL;
}
///找删除点
Node* preList = dulLink;
while(preList && --i >= 0) {
preList = preList->next;
}
///如果位置找的不对就直接退出
if(preList == NULL|| i >= 0) {
return NULL;
}
return preList;
}
Node* revertDulLink(Node* list) {
if(list == NULL) {
return list;
}
Node* tmp=list->next,*now ;
while(tmp->next ) {
now = tmp->next;
tmp->next = now->next;
if(now->next) {
now->next->pre = tmp;
}
now->next = list->next;
list->next->pre = now;
list->next = now;
now->pre = list;
}
return list;
}
int main()
{
Node* dulLink=NULL;
dulLink = init(dulLink);
ergodic(dulLink);
dulLink = insert(dulLink, 20, 888);
ergodic(dulLink);
dulLink = deleteOneElem(dulLink,20);
ergodic(dulLink);
updateOneElem(dulLink, 5, 999);
Node* now = selectOneElem(dulLink,5);
if(now){
printf("%d\n",now->value);
}
ergodic(dulLink);
dulLink = revertDulLink(dulLink);
ergodic(dulLink);
destory(dulLink->next);
ergodic(dulLink);
return 0;
}