| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 691 人关注过本帖
标题:双向链表的插入操作。。。求大神帮忙操作
只看楼主 加入收藏
doing8
Rank: 1
等 级:新手上路
帖 子:20
专家分:3
注 册:2012-6-15
结帖率:50%
收藏
已结贴  问题点数:10 回复次数:2 
双向链表的插入操作。。。求大神帮忙操作

目前只能在 链表为空的时候插入 小弟新手求大神们帮 看看


#include<stdio.h>
 #include<malloc.h>
 
typedef struct list
{
     int value;
     struct list *fwd;
     struct list *bwd;
 }LIST;
 
LIST *creat()
 {
     LIST *head,*p1,*p2;
     head=(LIST *)malloc(sizeof(LIST ));
     scanf("%d",&head->value);
     if(head->value!=0)
     {
         head->fwd = NULL;
         head->bwd = NULL;
         p2=head;   
    }
     else
     {
         return NULL;
     }
     p1=(LIST *)malloc(sizeof(LIST ));
     scanf("%d",&p1->value);
     while(p1->value!=0)       // 输入为0的时候结束
     {
         p2->fwd=p1;
         p1->bwd=p2;        
         p2=p1;
         p1 = (LIST *)malloc(sizeof(LIST ));
         scanf("%d",&p1->value );
         
     }
     p2->fwd=NULL;   
    return head;
 }
 
LIST *insert(LIST *head,int m)
 {
     LIST *s,*p1,*p2,*p3;                    // s为待插入节点
     
    s = (LIST * )malloc(sizeof(LIST) );
     s->value=m;
     if(NULL == head)                        //链表为空直接插入
     {
         head = s ;
         s->bwd = NULL ;
         s->fwd = NULL ;
         return head;
     }
     p1=head;
     while(p1 != NULL && p1->value>s->value )      //判断移动 p2 记录 p1的位置
     {
         p2=p1 ;
         p1=p1->fwd ;
     }
     if(p1->value<=s->value)                     
     {
         if(head == p1)                           //插入头节点之后。。
         {
             p3 = (LIST * )malloc(sizeof(LIST) );   //在头结点后 建一个空节点 用于插入新节点
             p3->fwd=head;
             head=p3;
             head=s;
             s->fwd=p1;
             s->bwd=NULL;
             p1->bwd=s;
         }
         else                         // 在链表中部插入 。。。
         {
             p2->fwd = s;
             s->fwd = p1;
             s->bwd = p2;
             p1->bwd= s;   
        }
     }
     p1->fwd=s;                        //链表的 尾部插入
    s->bwd=p1;
     s->fwd=NULL;
     head->bwd=s;
     
    return head;
     
}
 

void print(LIST *head)
 {
     if(head==NULL)
     {
         printf("list null\n");   
    }
     while(head!=NULL)
     {
         printf("%3d",head->value);
         head=head->fwd;
     }
 }
 
void main()
 {
     LIST * head;
     int m;
     printf("please input dlist record\n");
     head = creat();
     print(head);
     scanf("%d",&m);
     head=insert(head,m);
     print(head);
 }
搜索更多相关主题的帖子: head include return 
2012-07-15 17:31
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:5 
我给你改了一点,运行过是没问题,用//&&&&&&&注释的是我写的


 #include<stdio.h>
#include<malloc.h>

typedef struct list
{
     int value;
     struct list *fwd;
     struct list *bwd;
}LIST;

LIST *creat()
{
     LIST *head,*p1,*p2;
     head=(LIST *)malloc(sizeof(LIST ));
     scanf("%d",&head->value);
     if(head->value!=0)
     {
         head->fwd = NULL;
         head->bwd = NULL;
         p2=head;   
    }
     else
     {
         return NULL;
     }
     p1=(LIST *)malloc(sizeof(LIST ));
     scanf("%d",&p1->value);
     while(p1->value!=0)       // 输入为0的时候结束
     {
         p2->fwd=p1;
         p1->bwd=p2;        
         p2=p1;
         p1 = (LIST *)malloc(sizeof(LIST ));
         scanf("%d",&p1->value );
         
     }
     p2->fwd=NULL;   
    return head;
}

LIST *insert(LIST *head,int m)
{
     LIST *s,*p1,*p2,*p3;                    // s为待插入节点
     
    s = (LIST * )malloc(sizeof(LIST) );
     s->value=m;
     if(NULL == head)                        //链表为空直接插入
     {
         head = s ;
         s->bwd = NULL ;
         s->fwd = NULL ;
         return head;
     }
     p1=head;
     while(p1 != NULL && p1->value>s->value )      //判断移动 p2 记录 p1的位置
     {
         p2=p1 ;
         p1=p1->fwd ;
     }
     //if(p1->value<=s->value)                     //&&&&&&&这个判断不需要了因为上头while已经判断过了
    // {
         if(head == p1)                           //插入头节点之后。。
         {
     //        p3 = (LIST * )malloc(sizeof(LIST) );   //在头结点后 建一个空节点 用于插入新节点
     //        p3->fwd=head;                            //&&&&&&&&这三句没意思
     //        head=p3;
             head=s;
             s->fwd=p1;
             s->bwd=NULL;
             p1->bwd=s;
         }
         else if (p1==NULL)                  //&&&&&&&&链表的 尾部插入
         {                                    //&&&&&&&&
            p2->fwd=s;                        //&&&&&&&&
            s->fwd=NULL;                    //&&&&&&&&
            s->bwd=p2;                        //&&&&&&&&
         }                                    //&&&&&&&&&
         else                        // 在链表中部插入 。。。
         {
             p2->fwd = s;
             s->fwd = p1;
             s->bwd = p2;
             p1->bwd= s;   
        }
     //}
    // p1->fwd=s;                        //链表的 尾部插入
    //s->bwd=p1;                        //&&&&&&&&可能你的问题出在这里,这个尾部插入不和前面两类插入匹配
    // s->fwd=NULL;                        //&&&&&&&&是独立的一段语句,相当于你前面怎么写,结果都会被这几句冲掉
    // head->bwd=s;
     
    return head;
     
}


void print(LIST *head)
{
     if(head==NULL)
     {
         printf("list null\n");   
    }
     while(head!=NULL)
     {
         printf("%3d",head->value);
         head=head->fwd;
     }
}

void main()
{
     LIST * head;
     int m;
     printf("please input dlist record\n");
     head = creat();
     print(head);
     printf("\nplease insert a number:");      //&&&&&&&修饰一下输出嘛的
     scanf("%d",&m);                        //&&&&&&
     head=insert(head,m);
     print(head);
     printf("\n");                            //&&&&&&&
}
2012-07-20 02:25
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
收藏
得分:5 
回复 楼主 doing8
汗写得真够长的
Status ListInsert(DuLinkList &L,int i,ElemType e)
{
    DuLinkList p,s;
    int j;
    if(i<1||i>ListLength(L))//插入位置1———表长加1
        return ERROR;
    s=(DuLinkList)malloc(sizeof(DuLNode));
    if(!s)
        exit(OVERFLOW);
    for(j=1,p=L;j<i;j++,p=p->next);//找到第i-1个结点
    s->next=p->next;
    s->prior=p;
    p->next->prior=s;
    p->next=s;
    return OK;
}

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2012-07-22 17:25
快速回复:双向链表的插入操作。。。求大神帮忙操作
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019859 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved