| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 654 人关注过本帖
标题:关于通讯录的创建问题
只看楼主 加入收藏
依然惊涛
Rank: 2
来 自:山东 北京
等 级:论坛游民
帖 子:22
专家分:15
注 册:2011-7-5
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
关于通讯录的创建问题
我有一道作业题,题目是这样的:通讯录管理系统
要求:建立通讯录,实现通讯者的插入、删除、查询、以及通讯录表的输出等。
以下是我写的程序,可是运行的时候在创建列表的部分老是跳不出来,跪请各位高手们不吝赐教
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define NULL 0
#define LEN sizeof(struct tongxue)
struct tongxue
{ char xingming[20];
  long dianhua[11];
  char dizhi[50];
  struct tongxue *next;
};
int n;

struct tongxue *creat(void)       /*定义函数,返回一个指向链表头的指针*/
{struct tongxue *head;
 struct tongxue *p1,*p2;
 n=0;
 p1=p2=(struct tongxue *) malloc(LEN);
 scanf("%s,%ld,%s",p1->xingming,&p1->dianhua,p1->dizhi);
 head=NULL;
 while(p1->xingming!=0)
 {n=n+1;
  if(n==1)head=p1;
  else p2->next=p1;
  p2=p1;
  p1=(struct tongxue *)malloc(LEN);
  scanf("%s,%ld,%s",&p1->xingming,&p1->dianhua,p1->dizhi);
 }
 p2->next=NULL;
 return(head);
}
          /*通讯录链表生成函数*/

struct tongxue search(char cha_mingzi[20])
{struct tongxue *p1,*p2,*head;
 head=creat();
 p1=p2=head;
 scanf("%s",cha_mingzi);
 do
 {if(strcmp(cha_mingzi,p1->xingming)==0)
  printf("%s,%ld,%s",p1->xingming,&p1->dianhua,p1->dizhi);
  else p2=p1,p1=p1->next;
 }while(p1->xingming!=0);
 printf("查无此人");
 struct tongxue a;
return(a); }
    /*通讯录成员查询函数*/

void print(struct tongxue *head)
{struct tongxue *p;
printf("\n现在,这%d个人的通讯录为:\n",n);
p=head;
if(head!=NULL)
  do
  {printf("%s,%ld,%s",p->xingming,p->dianhua,p->dizhi);
   p=p->next;
  }while(p!=NULL);
}
     //通讯录链表输出函数

struct tongxue *del(struct tongxue *head,char del_mingzi[50])
{struct tongxue *p1,*p2;
if(head=NULL)  {printf("\n空链表!\n");goto end;}
p1=head;
while(strcmp(del_mingzi,p1->xingming)!=0&&p1->next!=NULL)    /*p1指向的不是要找的结点并且后面还有结点*/
{p2=p1;p1=p1->next;}   /*p1后移一个结点*/
if(strcmp(del_mingzi,p1->xingming)==0)
{if(p1==head)head=p1->next;   /*若p1是首结点,把第二个结点地址赋予head*/
else p2->next=p1->next;   /*否则将下一结点的地址赋予前一结点地址*/
printf("delete:%s\n",del_mingzi);
n=n-1;
}
else printf("没有找到%s\n",del_mingzi);   /*找不到该结点*/
end:
return(head);
}
     /*通讯录成员删除函数*/

struct tongxue *insert(struct tongxue *head,struct tongxue *p0,char *x)    /*p0为插入的结点,x为插入点*/
{struct tongxue *p,*q;
 if(head==NULL)
 {head=p0;
  p0->next=NULL;    /*空表时,直接插入结点*/
 }
 else
 {p=head;
  while(strcmp(x,p->xingming)!=0&&p->next!=NULL)
  {q=p;p=q->next;}
  if(strcmp(x,p->xingming)==0)
  {if(p==head)  head=p0;   /*在表头插入结点*/
  else
      q->next=p0;p0->next=p;/*在表中间插入结点*/
  }
  else
  {p->next=p0;p0->next=NULL;}  /*在表尾插入结点*/
 }
 return(head);
}
         /* 通讯录成员插入函数*/

void main()
{struct tongxue *head,*tx;char name[20];
 char xingming[20],dizhi[50];long dianhua[11];
 char del_mingzi[20],cha_mingzi[20];
 printf("输入通讯录\n");
 head=creat();
 print(head);
 printf("\n输入要查询的名字:");
 scanf("%s",cha_mingzi);
 search(cha_mingzi);
 printf("\n请输入要删除的名字:");
 scanf("%s",del_mingzi);
 while(del_mingzi!=0)
 {head=del(head,del_mingzi);
  print(head);
  printf("\n请输入要删除的名字:");
      printf("%s",del_mingzi);
 }
 printf("\n请输入要插入的成员的信息:");
 tx=(struct tongxue *)malloc(LEN);
 scanf("%s,%ld,%s",xingming,&dianhua,dizhi);
 printf("\n请输入插入点:");
 scanf("%s",name);
 while("tx->xingming!=0")
 {head=insert(head,tx,name);
 print(head);
 printf("\n请输入要插入的成员的信息:");
 tx=(struct tongxue *)malloc(LEN);
 scanf("%s,%ld,%s",xingming,&dianhua,dizhi);
 printf("\n请输入插入点:");
 scanf("%s",name);
 }
}
搜索更多相关主题的帖子: 通讯录 管理系统 long 
2011-07-06 18:04
依然惊涛
Rank: 2
来 自:山东 北京
等 级:论坛游民
帖 子:22
专家分:15
注 册:2011-7-5
收藏
得分:0 
各路大神,救命啊。。。。。。。
2011-07-06 18:47
ppfly
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:297
专家分:1956
注 册:2009-5-17
收藏
得分:14 
定义里面long dianhua[11]指的是一个由11个长整元素组成的数组,而后面scanf("%s,%ld,%s",&p1->xingming,&p1->dianhua,p1->dizhi);意味着只输入此数组的第一个元素,不免矛盾。还有while(p1->xingming!=0)里p1->xingming是一个字符串,你见过字符串!=0这样的语句吗?当然跳不出来了

这么改,结构体定义里面long改为char。scanf("%s,%ld,%s",&p1->xingming,&p1->dianhua,p1->dizhi);改为scanf("%s%ld%s",p1->xingming,p1->dianhua,p1->dizhi);
while(p1->xingming!=0)改为while(strcmp(p1->xingming,"0")!=0)
收到的鲜花

********多贴代码,少说空话*******
2011-07-06 20:08
依然惊涛
Rank: 2
来 自:山东 北京
等 级:论坛游民
帖 子:22
专家分:15
注 册:2011-7-5
收藏
得分:0 
回复 3楼 ppfly
先谢谢三楼大神了,我试试
2011-07-06 20:34
依然惊涛
Rank: 2
来 自:山东 北京
等 级:论坛游民
帖 子:22
专家分:15
注 册:2011-7-5
收藏
得分:0 
还是不行啊,现在在查询时跳不出来了,而且链表输出还有问题,请各位指教。。。。
2011-07-06 20:56
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:6 
学会调试,比什么都强。

我们都在路上。。。。。
2011-07-07 12:25
依然惊涛
Rank: 2
来 自:山东 北京
等 级:论坛游民
帖 子:22
专家分:15
注 册:2011-7-5
收藏
得分:0 
回复 6楼 hellovfp
哦,我刚学C没多久,还是入门阶段,可是这个作业马上要交了。。。。今天又改了一天,还剩最后一点问题了,就是插入部分有问题。。。。。等我再贴上,请帮忙看一下
2011-07-07 18:41
依然惊涛
Rank: 2
来 自:山东 北京
等 级:论坛游民
帖 子:22
专家分:15
注 册:2011-7-5
收藏
得分:0 
今天改了一天的结果是别的问题解决了,插入部分始终没解决,请各位高手赐教,代码如下
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define LEN sizeof(struct tongxue)

struct tongxue
{
    char xingming[20];
    char dianhua[11];
    char dizhi[50];
    struct tongxue *next;
};
int n;

struct tongxue *creat(void)       /*定义函数,返回一个指向链表头的指针*/
{
    struct tongxue *head;
    struct tongxue *p1,*p2;
 
    n=0;
 
    p1=p2=(struct tongxue *) malloc(LEN);
    scanf("%s %s %s",p1->xingming,p1->dianhua,p1->dizhi);
    head=NULL;
    while(strcmp(p1->xingming,"0")!=0)
    {
        n=n+1;
        if(n==1)head=p1;
        else p2->next=p1;
  
        p2=p1;
        p1=(struct tongxue *)malloc(LEN);
        scanf("%s %s %s",p1->xingming,p1->dianhua,p1->dizhi);
    }

    p2->next=NULL;
 
    return(head);
}
          /*通讯录链表生成函数*/



void search(char cha_mingzi[20], struct tongxue* head2)
{   
    struct tongxue *p1,*p2,*head;
   
    head = head2;
    p1=p2=head;
    do
    {
        if(strcmp(cha_mingzi,p1->xingming)==0)
        {
            printf("%s,%s,%s",p1->xingming,p1->dianhua,p1->dizhi);
            return;
        }
        else
        {
            p2=p1;
            p1=p1->next;
        }
    }
    while(strcmp(p1->xingming,"0")!=0);
    printf("查无此人");

}
    /*通讯录成员查询函数*/



void print(struct tongxue *head)
{
    struct tongxue *p;
    printf("\n现在,这%d个人的通讯录为:\n",n);
    p=head;

    if(head!=NULL)
        do
        {
            printf("%s,%s,%s",p->xingming,p->dianhua,p->dizhi);
            p=p->next;
            printf("\n");
        }
        while(p!=NULL);
}
     //通讯录链表输出函数



struct tongxue *del(struct tongxue *head,char del_mingzi[50])
{
    struct tongxue *p1,*p2;
    if(head == NULL)  
    {
        printf("\n空链表!\n");
        goto end;
    }

    p1=head;

    while(strcmp(del_mingzi,p1->xingming)!=0 && p1->next!=NULL)    /*p1指向的不是要找的结点并且后面还有结点*/
    {
        p2=p1;
        p1=p1->next;
    }   
    /*p1后移一个结点*/

    if(strcmp(del_mingzi,p1->xingming)==0)
    {
        if(p1==head)head=p1->next;   /*若p1是首结点,把第二个结点地址赋予head*/
        else p2->next=p1->next;   /*否则将下一结点的地址赋予前一结点地址*/

        printf("delete:%s\n",del_mingzi);
        n=n-1;
    }
    else
    printf("没有找到%s\n",del_mingzi);   /*找不到该结点*/

end:
    return(head);
}
     /*通讯录成员删除函数*/

struct tongxue *insert(struct tongxue *head,struct tongxue *p0,char x[20])    /*p0为插入的结点,x为插入点*/
{
    struct tongxue *p,*q;
    if(head==NULL)
    {
        head=p0;
        p0->next=NULL;    /*空表时,直接插入结点*/
    }
    else
    {
        p=head;
        while(strcmp(x,p->xingming)!=0&&p->next!=NULL)
        {
            q=p;
            p=q->next;
        }

        if(strcmp(x,p->xingming)==0)
        {
            if(p==head)  head=p0;   /*在表头插入结点*/
            else
            q->next=p0;p0->next=p;/*在表中间插入结点*/
        }
        else
        {
            p->next=p0;
            p0->next=NULL;
        }  /*在表尾插入结点*/
    }
 
    return(head);
}
         /* 通讯录成员插入函数*/

void main()
{
    struct tongxue *head,*tx;
    char name[20];
    char xingming[20],dizhi[50];
    long dianhua[11];
    char del_mingzi[20],cha_mingzi[20];   

    printf("输入通讯录(名字 电话号码 地址<输入0 0 0结束>)\n");

    head=creat();
    print(head);

    printf("\n输入要查询的名字:");
    scanf("%s",cha_mingzi);
    search(cha_mingzi,head);

    printf("\n\n请输入要删除的名字:");
    scanf("%s",del_mingzi);

    while(del_mingzi[1] != 0)
    {
        head=del(head,del_mingzi);
        print(head);
        printf("\n请输入要删除的名字:");
        scanf("%s",del_mingzi);
    }

    printf("\n请输入要插入的成员的信息(姓名 电话号码 地址<输入0 0 0结束>):");
    tx=(struct tongxue *)malloc(LEN);
    scanf("%s %s %s",tx->xingming,tx->dianhua,tx->dizhi);
    printf("\n请输入插入点:");
    scanf("%s",name);

    while(strcmp(tx->xingming,"o") != 0)
    {
        head=insert(head,tx,name);
        n=n+1;
        print(head);
        printf("\n请输入要插入的成员的信息(姓名 电话号码 地址<输入0 0 0结束>):");
        tx=(struct tongxue *)malloc(LEN);
        scanf("%s %s %s",tx->xingming,tx->dianhua,tx->dizhi);
        printf("\n请输入插入点:");
        scanf("%s",name);
    }
}
2011-07-07 18:43
快速回复:关于通讯录的创建问题
数据加载中...
 
   



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

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