双链表基本操作

       看欧立奇的《程序员面试宝典》的双向链表部分,发现其中创建双向链表和删除链表中得某一点的程序存在问题,现将已经调试通过的程序贴在下面:

#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;

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值