搜索
查看: 1356|回复: 3
打印 上一主题 下一主题

关于单链表的问题~ 编译没错 但无法实现功能~ 求帮忙~~

[复制链接]
跳转到指定楼层
楼主
发表于 2013-10-17 20:36:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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();  
        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 20:53:55 | 只看该作者
看见这东西就晕...
板凳
发表于 2013-10-17 23:42:05 | 只看该作者
错误太多,直接重写吧
链表的接口建议参考Goodrich的Data structure and problem solving
地板
发表于 2013-10-22 18:55:48 | 只看该作者
我不希望你重写······能修改成功的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表