当前位置: 代码迷 >> C语言 >> [讨论]还是关于链表的问题
  详细解决方案

[讨论]还是关于链表的问题

热度:152   发布时间:2007-03-30 20:14:44.0
[讨论]还是关于链表的问题

程序如下:
# include<stdio.h>
# include<malloc.h>
# include<stdlib.h>
struct list
{
int data;
struct list *next;
};
void print(struct list *head);
void insert(struct list *head);


void print(struct list *head)//打印链表
{
struct list *p;
p=head;
while(p)
{
printf("%3d",p->data);
p=p->next;
}
}
void insert(struct list *head)//插入链表
{
struct list *pnew,*p;
int m;
char f,f1;
p=head;
aa:printf("Enter the number of you want:\n");
scanf("%d",&m);
pnew=(struct list*)malloc(sizeof(struct list));
if (pnew==NULL)
{
printf("NO MEMORY!\n");
return ;
}
pnew->data=m;
pnew->next=NULL;

for (p=head;p!=NULL;p=p->next)
if (p->next==NULL||p->next->data>pnew->data)
{
pnew->next=p->next;
p->next=pnew;
break;
}

while (1)
{
printf("是否继续操作(y/n):");
f=getchar();
if((f=='y')||(f=='Y')||(f=='N')||(f=='n'))
{
if((f=='y')||(f=='Y'))
{
printf("操作继续.\n");
goto aa;
}

else
{
printf("操作结束。\n");
break;
}

}
else
{
printf("输入错误。\n");
}
}
while (1)
{
printf("是否继续打印操作(y/n):");
f1=getchar();
if((f1=='y')||(f1=='Y')||(f1=='N')||(f1=='n'))
{
if((f1=='y')||(f1=='Y'))
{
printf("操作继续.\n");
print(head->next);
}

else
{
printf("操作结束。\n");
break;
}

}
else
{
printf("输入错误。\n");
}
}

}

void main()
{
struct list *head,*p,*rear;
int x,n,t=1;
printf("*********主菜单*********\n");
printf("*********1.插入链表*******\n");
printf("*********2.打印链表*******\n");

head=(struct list*)malloc(sizeof(struct list));
if (head==NULL)
{
printf("NO MEMORY!\n");
exit(-1);
}
head->next=NULL;
rear=head;
printf("Please input the date:\n");
while(t)
{
scanf("%d",&x);
p=(struct list*)malloc(sizeof(struct list));
if (p==NULL)
{
printf("NO MEMORY!\n");
exit(-1);
}
p->data=x;
p->next=NULL;
rear->next=p;
rear=p;
}

printf("请输入需要操作的序号:\n");
scanf("%d",&n);
switch(n)
{
case 1:void insert(struct list *head);break;
case 2:void print(struct list *head);
default:printf("输入错误!\n");break;
}
}

首先程序会提示:
*********主菜单***********
*********1.插入链表*******
*********2.打印链表*******
Please input the date:
然后我输入:1 2 3 4 5 6时
程序应该提示
请输入需要操作的序号:
可是我这个到这就没有了.我想请问这是为什么呀?
我对链表一直不懂!

搜索更多相关的解决方案: 链表  

----------------解决方案--------------------------------------------------------
t=1
while(t) <==死循环

btw,lz你确定贴对代码了嘛?
----------------解决方案--------------------------------------------------------

这个代码应该不对,所以拜托你们了。


----------------解决方案--------------------------------------------------------
到这里怎么退出循环
while(t)
{
scanf("%d",&x);
p=(struct list*)malloc(sizeof(struct list));
if (p==NULL)
{
printf("NO MEMORY!\n");
exit(-1);
}
p->data=x;
p->next=NULL;
rear->next=p;
rear=p;
}

----------------解决方案--------------------------------------------------------
exit(-1);就是退出
----------------解决方案--------------------------------------------------------
等下我到机房再给你看,现在没时间
----------------解决方案--------------------------------------------------------
continue:退出本次循环,执行下一次循环。
break:退出循环语句,执行循环语句后面的代码。
exit:退出程序,也就是退出main()函数,(也可能是Winmain()函数)。
----------------解决方案--------------------------------------------------------

绿色的是修改过的地方 主要的问题是你没有用键盘清空函数 fflush(stdin);以后要注意了 ,鼓捣链表这个很重要的!
# include<stdio.h>
# include<malloc.h>
# include<stdlib.h>
struct list
{
int data;
struct list *next;
};
void print(struct list *head);
void insert(struct list *head);


void print(struct list *head)//打印链表
{
struct list *p;
p=head->next;
while(p)
{
printf("%3d",p->data);
p=p->next;
}
}
void insert(struct list *head)//插入链表
{
struct list *pnew,*p;
int m;
char f,f1;
p=head;
aa:printf("Enter the number of you want:\n");
fflush(stdin);
scanf("%d",&m);
fflush(stdin);
pnew=(struct list*)malloc(sizeof(struct list));
if (pnew==NULL)
{
printf("NO MEMORY!\n");
return ;
}
pnew->data=m;
pnew->next=NULL;

for (p=head;p!=NULL;p=p->next)
if (p->next==NULL||p->next->data>pnew->data)
{
pnew->next=p->next;
p->next=pnew;
break;
}

while (1)
{
printf("是否继续操作(y/n):");
f=getchar();
if((f=='y')||(f=='Y')||(f=='N')||(f=='n'))
{
if((f=='y')||(f=='Y'))
{
printf("操作继续.\n");
goto aa;
}

else
{
printf("操作结束。\n");
break;
}

}
else
{
printf("输入错误。\n");
}
}
while (1)
{ fflush(stdin);
printf("是否继续打印操作(y/n):");
f1=getchar();
if((f1=='y')||(f1=='Y')||(f1=='N')||(f1=='n'))
{
if((f1=='y')||(f1=='Y'))
{
printf("操作继续.\n");
print(head);
}

else
{
printf("操作结束。\n");
break;
}

}
else
{
printf("输入错误。\n");
}
}

}

void main()
{
struct list *head,*p,*rear;
int x,n;
printf("*********主菜单*********\n");
printf("*********1.插入链表*******\n");
printf("*********2.打印链表*******\n");

head=(struct list*)malloc(sizeof(struct list));
if (head==NULL)
{
printf("NO MEMORY!\n");
exit(-1);
}
head->next=NULL;
rear=head;
printf("Please input the date:\n");
scanf("%d",&x);
while(x)
{

p=(struct list*)malloc(sizeof(struct list));
if (p==NULL)
{
printf("NO MEMORY!\n");
exit(-1);
}
p->data=x;
rear->next=p;
rear=p;
scanf("%d",&x);
}
p->next=NULL;
fflush(stdin);

printf("请输入需要操作的序号:\n");
scanf("%d",&n);
switch(n)
{
case 1:insert(head);break;
case 2:print(head);break;
default:printf("输入错误!\n");break;
}
}


----------------解决方案--------------------------------------------------------
这个fflush(stdin),我的老师没有给讲过,自然就不知道怎么用了。
这个函数到底怎么用,什么时候用,需要注意哪些问题。
拜托各位在费费神。
呵呵呵。。。。。
辛苦你们了!
----------------解决方案--------------------------------------------------------
就是清空键盘缓冲区。。。。
scanf("%d",&x);你在对这个X输入值的时候是 :1 空格2 回车 ,次时2就留在了键盘缓冲区里了 需要fflush(stdin)来清空。
----------------解决方案--------------------------------------------------------
  相关解决方案