| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 516 人关注过本帖
标题:关于单链表的问题~ 编译没错 但无法实现功能~ 求帮忙~~
只看楼主 加入收藏
yhlm_1994
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2013-9-26
结帖率:33.33%
收藏
已结贴  问题点数:10 回复次数:5 
关于单链表的问题~ 编译没错 但无法实现功能~ 求帮忙~~
题目为:将若干城市的信息输入一个带头结点的单链表,结点中的城市信息包括城市名称,城市的位置坐标,要求:(1)给定一个城市名,返回位置坐标;(2)给定一个位置坐标P和一个距离D,返回所有与P得距离小于等于D的城市。
写的代码为:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
typedef struct city  //用结构体定义单链表
{
char name;     //城市名(字符串类型,c语言中没有string类,字符串依赖数组实现)
int hengzuobiao;     //城市横坐标
int zongzuobiao;   //城市纵坐标
struct city *next;  //指向自己的指针next
}city,*LinkList;      //struct city类的别名city,LinkList为结构指针类型
void InitList(LinkList *H)  //初始化单链表
{
*H=(LinkList)malloc(sizeof(city));//建立头结点
(*H)->next=NULL;  //建立空的单链表H
}
void CreatFromTail(LinkList H)//尾插法建表
{
city *r,*s;
char n;
int x,y;
int flag=1;  //设置一个标志,初值为1,当输入“$”时,flag=0,建表结束
r=H;  //r指针动态指向链表的当前结尾,以便于做尾插入,其初值指向头结点
while(flag) //循环输入表中元素值,将建立新结点s插入表尾
{
printf("输入城市名(若想终止存入信息,请输入$):\n");
scanf("%s",&n);//读入字符串
getchar();   //一开始没有加getchar()函数时,scanf("%s",&n)会直接被跳过,输出"输入城市名(若想终止存入信息,请输入$):"后就直接输出"输入城市坐标:"。为什么!!!!
if(n!='$')
{
printf("输入城市坐标:\n");
            scanf("%d%d",&x,&y); //输入城市的横纵坐标
s=(city *)malloc(sizeof(city));  //申请新结点
s->name=n;
s->hengzuobiao=x;
s->zongzuobiao=y;
r->next=s;
r=s;      //r始终指向单链表的表尾
}
else
{
flag=0;
r->next=NULL; //将最后一个结点的next链域置为空,表示链表的结束
}
}
}
void search()  //查询城市坐标
{
LinkList L;//在带头结点的单链表L中查找其结点值等于key的结点,若找到则返回城市坐标;否则返回NULL
CreatFromTail(L);
char key;
city *p;
printf("请输入要查询的城市名:");
scanf("%d",&key);
p=L->next;  //从表中第一个结点比较
while(p!=NULL)
if(p->name!=key)
p=p->next;  //p指向下一结点
else
{
printf("该城市坐标为:",p->hengzuobiao,p->zongzuobiao);
break; //找到结点key,退出循环
}
}
void calculate()  //计算距离
{
LinkList L;
CreatFromTail(L);
int m,n,D;
city *p;
printf("请输入坐标P:");
scanf("%d%d",&m,&n);
printf("请输入距离D:");
scanf("%d",&D);
p=L->next;  //从表中第一个结点比较
    while(p!=NULL)
if((m-p->hengzuobiao)*(m-p->hengzuobiao)+(n-p->zongzuobiao)*(n-p->zongzuobiao)<=(D*D))
{
printf("此城市符合条件:",p->name);
}
else
p=p->next;   //继续比较下一个结点
}
void main()
{
int number;
printf("请选择序号:1.查询城市坐标   2.输出符合距离条件的城市   3.退出系统\n");
    scanf("%d",&number);
switch(number)
{
case 1:
search();
break;
case 2:
calculate();
break;
case 3:
printf("已成功退出系统!欢迎再次使用!");
break;
default:
printf("输入错误,请重新输入");
break;
}
system("pause");
}
帮忙看看程序应该怎么修改~~~~~~~
搜索更多相关主题的帖子: include 结构体 字符串 c语言 信息 
2013-10-17 18:47
heroinearth
Rank: 10Rank: 10Rank: 10
来 自:云南曲靖
等 级:青峰侠
帖 子:430
专家分:1506
注 册:2011-10-24
收藏
得分:4 
不带缩进的代码看得伤眼伤神
2013-10-17 19:06
yhlm_1994
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2013-9-26
收藏
得分:0 
回复 2楼 heroinearth
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
typedef struct city  //用结构体定义单链表
{
    char name;     //城市名(字符串类型,c语言中没有string类,字符串依赖数组实现)
    int hengzuobiao;     //城市横坐标
    int zongzuobiao;   //城市纵坐标
    struct city *next;  //指向自己的指针next
}city,*LinkList;      //struct city类的别名city,LinkList为结构指针类型
void InitList(LinkList *H)  //初始化单链表
{
    *H=(LinkList)malloc(sizeof(city));//建立头结点
    (*H)->next=NULL;  //建立空的单链表H
}
void CreatFromTail(LinkList H)//尾插法建表
{
    city *r,*s;
    char n;
    int x,y;
    int flag=1;  //设置一个标志,初值为1,当输入“$”时,flag=0,建表结束
    r=H;  //r指针动态指向链表的当前结尾,以便于做尾插入,其初值指向头结点
    while(flag) //循环输入表中元素值,将建立新结点s插入表尾
    {
        printf("输入城市名(若想终止存入信息,请输入$):\n");
        scanf("%s",&n);//读入字符串
        getchar();  
        if(n!='$')
        {
            printf("输入城市坐标:\n");
                        scanf("%d%d",&x,&y); //输入城市的横纵坐标
            s=(city *)malloc(sizeof(city));  //申请新结点
            s->name=n;
            s->hengzuobiao=x;
            s->zongzuobiao=y;
            r->next=s;
            r=s;      //r始终指向单链表的表尾
        }
        else
        {
            flag=0;
            r->next=NULL; //将最后一个结点的next链域置为空,表示链表的结束
        }
    }
}
void search()  //查询城市坐标
{
    LinkList L;//在带头结点的单链表L中查找其结点值等于key的结点,若找到则返回城市坐标;否则返回NULL
    CreatFromTail(L);
    char key;
    city *p;
    printf("请输入要查询的城市名:");
    scanf("%d",&key);
    p=L->next;  //从表中第一个结点比较
    while(p!=NULL)
        if(p->name!=key)
            p=p->next;  //p指向下一结点
        else
        {
            printf("该城市坐标为:",p->hengzuobiao,p->zongzuobiao);
            break; //找到结点key,退出循环
        }
}
void calculate()  //计算距离
{
    LinkList L;
    CreatFromTail(L);
    int m,n,D;
    city *p;
    printf("请输入坐标P:");
    scanf("%d%d",&m,&n);
    printf("请输入距离D:");
    scanf("%d",&D);
    p=L->next;  //从表中第一个结点比较
    while(p!=NULL)
        if((m-p->hengzuobiao)*(m-p->hengzuobiao)+(n-p->zongzuobiao)*(n-p->zongzuobiao)<=(D*D))
        {
            printf("此城市符合条件:",p->name);
        }
        else
            p=p->next;   //继续比较下一个结点
}
void main()
{
    int number;
    printf("请选择序号:1.查询城市坐标   2.输出符合距离条件的城市   3.退出系统\n");
    scanf("%d",&number);
    switch(number)
    {
    case 1:
        search();
        break;
    case 2:
        calculate();
        break;
    case 3:
        printf("已成功退出系统!欢迎再次使用!");
        break;
    default:
        printf("输入错误,请重新输入");
        break;
    }
    system("pause");
}
2013-10-17 19:25
heroinearth
Rank: 10Rank: 10Rank: 10
来 自:云南曲靖
等 级:青峰侠
帖 子:430
专家分:1506
注 册:2011-10-24
收藏
得分:0 
我的编译器无法编译,只能帮你看看:
struct city类的别名city, 这有什么用?????????????
scanf("%s",&n);//读入字符串 n为char类型,应该用%c说明符

应该在main()中声明指向头节点的指针变量,在其它函数中声明的变量随着函数的结束而消失,
建立城市信息部分应从search()中独立出来,
2013-10-21 17:03
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:4 
无法编译
2013-10-21 17:07
木头心
Rank: 2
等 级:论坛游民
帖 子:19
专家分:35
注 册:2013-4-17
收藏
得分:4 
void InitList(LinkList *H)  //初始化单链表  
void CreatFromTail(LinkList H)//尾插法建表  函数没连接一起
CreatFromTail(LinkList H) 这里的H是空的
2013-10-21 18:17
快速回复:关于单链表的问题~ 编译没错 但无法实现功能~ 求帮忙~~
数据加载中...
 
   



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

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