看欧立奇的《程序员面试宝典》的双向链表部分,发现其中创建双向链表和删除链表中得某一点的程序存在问题,现将已经调试通过的程序贴在下面:
#include <iostream>
using namespace std;
#define LEN sizeof(DNode)
typedef struct DoubleNode
{
int data;
struct DoubleNode *next;
struct DoubleNode *pre;
}DNode;
DNode *create()
{
DNode *head,*p_new, *p_old;
int cycle=1;
int n=0;
int data;
head = (DNode*)malloc(sizeof(DNode));
p_old = head;
while(cycle)
{
cout<<"Please input the num"<<endl;
cin>>data;
if(data != 0)
{
n=n+1;
if (n==1)
{
p_old->data=data;
p_old->next=NULL;
p_old->pre=NULL;
}
else
{
p_new = (DNode*)malloc(sizeof(DNode));
p_new->data =data;
p_old->next = p_new;
p_new->pre = p_old;
p_old = p_new;
}
}
else
{
cycle = 0;
}
}
p_old->next = NULL;
head ->pre = NULL;
return head;
}
DNode *del(DNode *head,int num)
{
DNode *p;
p = (DNode*)malloc(sizeof(DNode));
p=head;
while(num != p->data && p->next !=NULL)
{
p =p->next;
}
if(num == p->data)
{
if(p == head)
{
free(head);
p = p->next;
head = p;
}
else if(p->next ==NULL)
{
p->pre->next=NULL;
free(p);
}
else
{
p->pre->next = p->next;
p->next->pre =p->pre;
free(p);
}
}
else
{
cout<<"cann't find the num"<<endl;
}
return head;
}
DNode *insert(DNode *head,int num)
{
DNode *p,*p_new;
p=(DNode*)malloc(LEN);
p_new=(DNode*)malloc(LEN);
p_new->data = num;
p=head;
while(num > p->data && p->next !=NULL)
{
p = p->next;
}
if(num <= p->data)
{
if(head == p)
{
p_new->next =p;
p->pre = p_new;
head = p_new;
head ->pre = NULL;
}
else
{
p->pre->next = p_new;
p_new->next = p;
p->pre = p_new;
p_new->pre = p->pre;
}
}
else
{
p->next = p_new;
p_new->pre = p;
p_new->next = NULL;
}
return head;
}
void main()
{
DNode *head;
head = (DNode*)malloc(LEN);
head =create();
int num;
num = head->next->next->pre->data;
//int num1=17;
//head=del(head,17);
//int num2=head->next->data;
head = insert(head ,21);
int num3=head->next->next->next->next->data;
}