回 帖 发 新 帖 刷新版面

主题:C语言的变成问题 和链表有关哈

请问这个程序要怎么改才比较好用额...
一个问题是输入函数 我最后打"0"了 但是 它也不结束   
还有一个就是   说主函数里面  我调用的时候有问题  不会改了
实现的情况就是  输入姓名 电话号码还有地址  然后  最后会出现和通讯录的列表  就是这样  

#include<stdio.h>
#include<malloc.h>
#define NULL 0
#define LEN sizeof(struct linkman)
struct linkman  //联系人结构体
{
 char name[20];  //姓名
 long num;      //电话号码
 char add[100];//地址
 struct linkman * next;
};
int n;
struct linkman * creat(void)  //创建空间(联系人)的函数
{
 struct linkman * head;
 struct linkman * p1,* p2;
 n=0;
 p1=p2=(struct linkman *)malloc(LEN);
 printf("Add linkman's name telephone number and address please!\n");
 scanf("%s,%ld,%s",p1->name,&p1->num,p1->add);
 head=NULL;
 while(p1->name!=0)
 {
  n=n+1;
  if(n==1)head=p1;
  else p2->next=p1;
  p2=p1;
  p1=(struct linkman *)malloc(LEN);
  scanf("%s,%ld,%s",p1->name,&p1->num,p1->add);
 }
 p2->next=NULL;
 return(head);
}
void print(struct linkman * head)  //输出结果的函数
{
 struct linkman * p;
 printf("**->address book<-**\n");
 p=head;
 if(head!=NULL)
  do{
   printf("%s,%ld,%s\n",p->name,p->num,p->add);
   p=p->next;
  }while(p!=NULL);
}
void main()
{
 creat();
 print();
}

回复列表 (共5个回复)

沙发


[code=c]
print();//少参数改为print(creat());

while(p1->name!=0)
这个判断条件有问题 指针=0 ?你想判断name是否为空?
你没办法让name为空 因为name内存分配以后内存以前是什么样子的谁都不清楚 是不确定的
scanf(" %s, %ld, %s",p1->name,&p1->num,p1->add);
建议在%号前面加空格,像上面,这样可能滤掉空字符

[/code]

板凳

while(p1->name!=0)
这里你这么判断的话输入0当然不会结束,如果要输入0做结束的话应该判断[0]!='0'

3 楼

scanf("%s,%ld,%s",p1->name,&p1->num,p1->add);

这个读字符串也有问题 这样要格式化输入就是要加入“,” 可加入“,”号这样 “,”号也会被当字符读入 后面还会出更多问题 
建议改成scanf(" %s %ld %s",p1->name,&p1->num,p1->add);

4 楼

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define NULL 0
#define LEN sizeof(struct linkman)
struct linkman
{
    int num;
    char name[20];
    long tel;
    char add[100];
    struct linkman * next;
};
int n;
struct linkman * creat(void)
{
    struct linkman * head;
    struct linkman * p1,* p2;
    n=0;
    p1=p2=(struct linkman *)malloc(LEN);
    printf("Add linkman's name telephone number and address please!\n\n");
    printf("num name   tel     add\n");
    scanf("%d,%s,%ld,%s",&p1->num,p1->name,&p1->tel,p1->add);
    head=NULL;
    while(p1->num!=0)
    {
        n=n+1;
        if(n==1)head=p1;
        else p2->next=p1;
        p2=p1;
        p1=(struct linkman *)malloc(LEN);
        scanf("%d,%s,%ld,%s",&p1->num,p1->name,&p1->tel,p1->add);
    }
    p2->next=NULL;
    return(head);
}
void print(struct linkman * head)
{
    struct linkman * p;
    printf("**->address book<-**\n");
    p=head;
    if(head!=NULL)
        do{
            printf("%d,%s,%ld,%s",p->num,p->name,p->tel,p->add);
            p=p->next;
        }while(p!=NULL);
}
void main()
{
    struct linkman * head=creat();
    print(head);
}


这次是输出有乱码现象

5 楼

尝试在负责输入的while循环第一句加上fflush(stdin);吸收掉不该有的回车
虽然不是标准方法,但是确实管用

我来回复

您尚未登录,请登录后再回复。点此登录或注册