很头痛的链表有关问题
很头痛的链表问题
建立链表都没什么问题,就是到main()程序中,做删除、插入处理时候,输入插入数据
的时候出现问题。如下源程序中,我要求输入删除结点数据data2,在dos屏幕下,我输入一个数据之后,程序并没有直接运行删除子程序依然停留在输入状态下,再输入一个数据才运行下去,结果这个数据影响到下面插入数据的输入,譬如第一个输入是data2,再输入一个数据就直接给插入数据nd1给赋值了,使得最后输出结果出错。不清楚到底是子程序有错还是main()中输入程序出错,请大家指点,帮忙,非常感谢!
源程序如下:
#include <iostream.h>
#include <stdio.h>
#define NULL 0
typedef int datatype;
typedef struct node{
datatype info;
node *next;
}LINKLIST;
LINKLIST *create(void)
{
datatype i,data;
LINKLIST *head,*tail,*node;
head = new(LINKLIST);
tail=head;
scanf( "%d ",&data);
while(data!=0)
{
node = new(LINKLIST);
node-> info = data;
tail-> next = node;
tail = node;
scanf( "%d ",&data);
}
tail-> next = NULL;
return head;
}
LINKLIST *search1(LINKLIST *head,datatype x)
{
LINKLIST *p;
datatype i;
i=x;
p = head-> next;
while(p != NULL)
{
if(p-> info==i)
{
printf( "查到数据: ");
printf( "%d\n ",p-> info);
return (p);
}
else
p = p-> next;
}
if(p==NULL)
printf( "没有查到该数据 ");
//return NULL;
}
void insert(LINKLIST *p,datatype x)
{
LINKLIST *newp=new(LINKLIST);
newp-> info = x;
newp-> next = p-> next;
p-> next = newp;
}
void del(LINKLIST *p)//删除单向链表结点*p后面的结点
{
LINKLIST *temp;
temp = p-> next;
p-> next=p-> next-> next;
delete(temp);
}
void outputlist(LINKLIST *head)
{
LINKLIST *current = head-> next;
while(current != NULL)
{
printf( "%d\n ",current-> info);
current = current-> next;
}
printf( "----------------------------------------\n ");
}
main(void)
{
datatype data1,data2,nd1;
LINKLIST *head,*p,*q;
head = create();
outputlist(head);
printf( "要删除的数据: ");
scanf( "%d\n ",&data2);
printf( "data2= %d ",data2);
p=search1(head,data2);//寻找删除结点位置
printf( "p-> info= %d\n ",p-> info);
del(p);
outputlist(head);
printf( "要插入的前一个结点info: ");
scanf( "%d\n ",&nd1);
printf( "nd1= %d\n ",nd1);
printf( "要插入的数据: ");
scanf( "%d\n ",&data1);
printf( "data1= %d\n ",data1);
q=search1(head,nd1);//寻找插入结点位置
printf( "q-> info= %d\n ",q-> info);
insert(q,data1);
outputlist(head);
建立链表都没什么问题,就是到main()程序中,做删除、插入处理时候,输入插入数据
的时候出现问题。如下源程序中,我要求输入删除结点数据data2,在dos屏幕下,我输入一个数据之后,程序并没有直接运行删除子程序依然停留在输入状态下,再输入一个数据才运行下去,结果这个数据影响到下面插入数据的输入,譬如第一个输入是data2,再输入一个数据就直接给插入数据nd1给赋值了,使得最后输出结果出错。不清楚到底是子程序有错还是main()中输入程序出错,请大家指点,帮忙,非常感谢!
源程序如下:
#include <iostream.h>
#include <stdio.h>
#define NULL 0
typedef int datatype;
typedef struct node{
datatype info;
node *next;
}LINKLIST;
LINKLIST *create(void)
{
datatype i,data;
LINKLIST *head,*tail,*node;
head = new(LINKLIST);
tail=head;
scanf( "%d ",&data);
while(data!=0)
{
node = new(LINKLIST);
node-> info = data;
tail-> next = node;
tail = node;
scanf( "%d ",&data);
}
tail-> next = NULL;
return head;
}
LINKLIST *search1(LINKLIST *head,datatype x)
{
LINKLIST *p;
datatype i;
i=x;
p = head-> next;
while(p != NULL)
{
if(p-> info==i)
{
printf( "查到数据: ");
printf( "%d\n ",p-> info);
return (p);
}
else
p = p-> next;
}
if(p==NULL)
printf( "没有查到该数据 ");
//return NULL;
}
void insert(LINKLIST *p,datatype x)
{
LINKLIST *newp=new(LINKLIST);
newp-> info = x;
newp-> next = p-> next;
p-> next = newp;
}
void del(LINKLIST *p)//删除单向链表结点*p后面的结点
{
LINKLIST *temp;
temp = p-> next;
p-> next=p-> next-> next;
delete(temp);
}
void outputlist(LINKLIST *head)
{
LINKLIST *current = head-> next;
while(current != NULL)
{
printf( "%d\n ",current-> info);
current = current-> next;
}
printf( "----------------------------------------\n ");
}
main(void)
{
datatype data1,data2,nd1;
LINKLIST *head,*p,*q;
head = create();
outputlist(head);
printf( "要删除的数据: ");
scanf( "%d\n ",&data2);
printf( "data2= %d ",data2);
p=search1(head,data2);//寻找删除结点位置
printf( "p-> info= %d\n ",p-> info);
del(p);
outputlist(head);
printf( "要插入的前一个结点info: ");
scanf( "%d\n ",&nd1);
printf( "nd1= %d\n ",nd1);
printf( "要插入的数据: ");
scanf( "%d\n ",&data1);
printf( "data1= %d\n ",data1);
q=search1(head,nd1);//寻找插入结点位置
printf( "q-> info= %d\n ",q-> info);
insert(q,data1);
outputlist(head);