|
|
#2
obstratiker2012-07-20 02:25
我给你改了一点,运行过是没问题,用//&&&&&&&注释的是我写的
#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"); //&&&&&&& } |
目前只能在 链表为空的时候插入 小弟新手求大神们帮 看看
#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);
}