[作业]【C语言实现】城市链表问题

问题介绍

问题描述
将若干城市的信息,存入一个带头结点的单链表。结点中的城市信息包括:城市名,城市的位置坐标。要求能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。
基本要求
(1) 给定一个城市名,返回其位置坐标;
(2) 给定一个位置坐标P和一个距离D,返回所有与P的距离小于等于D的城市。
测试数据
由学生依据软件工程的测试技术自己确定。注意测试边界数据。

代码片段

#include <stdio.h>
#include  <stdlib.h>
#include <string.h>
#include <math.h> 

#define MAXINT 10000
#define OK 1
#define ERROR 0 

typedef int Status ; 
typedef struct Node{
	
	char name[MAXINT] ;      //存储城市名; 
	float x_index, y_index ; //存储城市坐标; 
	struct Node *next ;
	
}Node, *LinkList;


//创建一个链表 
LinkList CreatList (int e) {
	
	LinkList l, tempt, p ;
	l = (LinkList)malloc(sizeof(Node)) ;
	l->next = NULL ;
	
	tempt = l ;
	
	int i = 0;
	for(i = 0 ; i < e ; i ++) {	 //向链表中存储数据 
		p = (LinkList)malloc(sizeof(Node)) ;
		scanf("%s %f %f", &p->name, &p->x_index, &p->y_index) ;
		p->next = tempt->next ;
		tempt->next = p ;
		tempt = p ;
	}
	return l ;
}

//打印出链表的信息
Status ShowList(LinkList l) {
	LinkList p ;
	p = l ;
	p = p->next ;
		printf("\t\t\t\t\t城市信息为:") ; 
		printf("\n") ;
		printf("\t\t\t\t\t-----------------------------------------------\n") ;
		printf("\t\t\t\t\t序\t城市名称\t城市坐标\n", p->name, p->x_index, p->y_index) ;		
	int order = 1 ;  
	while(p) {
		printf("\t\t\t\t\t%02d\t %-8s\t( %.2f°N, %.2f°E )\n",order, p->name, p->x_index, p->y_index) ;
		p = p->next ;
		order++ ;
	}
		printf("\t\t\t\t\t-----------------------------------------------\n" ) ; 
		return OK ;
} 

//查找一个链表元素
LinkList SearchList(LinkList l){	
	LinkList q ;
	q = (LinkList)malloc(sizeof(Node)) ;
	q->next = NULL ;
	scanf("%s", &q->name) ;
	LinkList p ;
	p = l ;
	while(p) {
		p = p->next ;
		if(!strcmp(p->name, q->name)){
			return p ; 
		}
		if(p->next == NULL){
		printf("没有查找到该城市信息") ;
	    return NULL ;
	    break ;
		}
	} 	
}

//将城市插入链表头部 
LinkList InsertList_head (LinkList l, LinkList temp) {
	Node *p, *q;
	p = l ;
	q = temp;
	q = q->next ;
	q->next = p->next ;
	p->next = q ;
	return l ;
}

//将城市插入任一城市之后 
LinkList InsertList_city (LinkList l, LinkList temp) {
	printf("请输入希望插入其后的城市:") ;
	Node *index, *q ;
	index = SearchList(l) ;
	q = temp ;
	q = q->next ;
	q->next = index->next ;
	index->next = q;
	return l ;
}

//插入一个链表元素 
LinkList InsertList (LinkList l) {
	// 插入城市信息
	printf("\n") ; 
	printf("请选择您希望将该城市插入的位置:\n");
	printf("A.将该城市插入至城市链表的头部\n") ;
	printf("B.将该城市插入任一城市之后\n") ;
	char c ;
	scanf("%s", &c) ;
	
	LinkList tempt ;
	printf("请输入新插入的城市名:\n") ;
	tempt = CreatList(1) ;
	
	switch(c) {
		case 'A':case 'a': l = InsertList_head (l, tempt) ; break ;
		case 'B':case 'b': l = InsertList_city (l, tempt) ; break ;
	} 
	return l ;
}

//删除一个链表元素
LinkList DeleteList(LinkList l){
	printf("请输入你想要删除的城市名称:\n") ;
	
	//已找到指向想要删除的城市的指针 
	Node *index , *p;
	index = SearchList(l) ; 
	//进行删除操作 
	p = l ;
	while(p->next != index) {
		p = p->next ;
	}
	p->next = p->next->next ;
	return l ;
}  

//更新链表中的一个元素
LinkList RenewList(LinkList l) {
	printf("请输入你想要更新的城市名称:\n") ;
	
	//已找到指向想要更新的城市的指针 
	Node *index , *p;
	index = SearchList(l) ; 
	//进行更新操作 
	printf("请输入新的城市名称及地理位置:\n") ;
	scanf("%s %f %f",&index->name, &index->x_index, &index->y_index) ;
	return l ;
}  

	//进入城市距离计算比较功能
LinkList DistanceCity(LinkList l, float e){
	printf("请输入一个城市的名称作为定位标志:\n") ;
	Node *index , *p, *q;
	index = SearchList(l) ;
	
	//从列表中删除被选中的定位城市的信息
	p = l ;
	while(p->next != index) {
		p = p->next ;
	}
	p->next = p->next->next ;
	ShowList(l) ; 
	
	//计算列表中其他城市与定位城市的距离
	int i = 0 ; 
	float dx = 0 , dy = 0 ;
	float distance = 0 ;
	LinkList dis ; //制作一个链表存储距离小于给定值的城市的所有信息 ;
	Node *d ; //一直指向dis链表末尾的指针; 
	dis = (LinkList)malloc(sizeof(Node)) ;
	dis->next = NULL ;
	d = dis ; 
	 
	q = l ; //利用两个坐标点间的距离公式,开始计算 
	while(q){
		q = q->next ;
		dx = q->x_index - index->x_index ;
		dy = q->y_index - index->y_index ;
		distance = sqrt(dx * dx + dy * dy) ;
		printf("%-8s距%-8s的距离为%.2f\n",q->name, index->name, distance) ;
		if(distance <= e) {
			LinkList temp ;
			temp = (LinkList)malloc(sizeof(Node)) ;
			strcpy(temp->name , q->name) ;
			temp->x_index = q->x_index ;
			temp->y_index = q->y_index ;
			temp->next = d->next ;
			d->next = temp ;
			d = temp ;
		}
		if(q->next == NULL)
		ShowList(dis) ;
	} 
   	return dis ;	
} 

Status Entrance(char c, LinkList l ){
	
	//查找城市信息 	
	 if(c == 'A' || c == 'a') {
	Node *index ;
	printf("请输入希望查询的城市:") ;
	index = SearchList(l) ;
    printf(" ( %.2f°N, %.2f°E )",  index->x_index, index->y_index) ;
}
    //插入城市信息 
    if(c == 'B' || c =='b') {
	l = InsertList(l) ; 
	ShowList(l) ;
}
	//删除城市信息
	if(c == 'C' || c =='c') {
	l = DeleteList(l) ; 
	ShowList(l) ;
}	
	//更新城市信息
	if(c == 'D' || c =='d') {
	l = RenewList(l) ;
	ShowList(l) ; 
	}
	
	//进入城市距离计算比较功能
	if(c == 'E' || c =='e') {
	float n ;
	printf("请输入您想查询的距离范围的数值:\n") ;
	scanf("%f", &n) ; 
	LinkList l_ ;	
	l_ = DistanceCity(l,n);
	ShowList(l_) ;
	}
	
	return OK ;
}


int main() {
	
		
	printf("建立城市链表:") ;
	int e = 0 ;
	printf("请输入您想输入的城市数目:") ;
	scanf("%d", &e) ;
	
	//创建一个城市链表 
	LinkList l ;
	printf("请输入城市名及其坐标:\n") ;
	l = CreatList(e) ;
	ShowList(l) ;
	
	//入口 
	printf("进入城市链表操作\n") ;
	printf("在创建城市链表后,可以进行如下操作\n") ;
	printf("A.查找城市信息\n") ;
	printf("B.插入城市信息\n") ;
	printf("C.删除城市信息\n") ;
	printf("D.更新城市信息\n") ;
	printf("E.进入城市距离计算比较功能\n") ;
	printf("F.退出操作\n") ;
	while(1){
	char c ; 
	printf("\n请输入操作数:\n") ;
    scanf("%s", &c) ;
    if(c == 'F' || c == 'f'){
    printf("退出程序。\n") ; 
	break ; // 退出程序 
}
    Entrance(c, l) ;
    }

	 
	return 0 ;
}
  • 23
    点赞
  • 133
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
/*带头结点头文件 hlinklist.h*/ #include <stdio.h> typedef int datatype; typedef struct link_node { datatype data; struct link_node *next; }node; /*初始化链表*/ node *init() { node *head; head=(node *)malloc(sizeof(node)); head->next=0; return head; } /*尾插法创建一个带头结点链表*/ node *creat(node *head) { node *r,*s; int x; r=head; printf("在新链表中输入数据以0结束:"); scanf("%d",&x); while(x) { s=(node*)malloc(sizeof(node)); s->data=x; r->next=s; r=s; scanf("%d",&x); } r->next=0; return head; } /*打印链表的结点值*/ void print(node *head) { node *p; p=head->next; if(!p) printf("链表内容为空!"); else while(p) { printf("%5d",p->data); p=p->next; } printf("\n"); } /*在单链表中查找第i个结点的地址*/ node *find(node *head,int i) { node *p=head; int j=0; if(i<0) {printf("不存在!");return 0;} if(i==0) return head; while(p&&i!=j) { p=p->next; j++; } return p; } /*在带头结点的单链表第i个位置后插入一个数*/ node *insert(node *head,int i,datatype x) { node *p,*q; q=find(head,i); if(!q) { printf("插入的位置不存在!\n");return head;} else { p=(node *)malloc(sizeof(node)); p->data=x; p->next=q->next; q->next=p; } return head; } /*在带头结点的单链表中删除一个为x的值*/ node *dele(node *head,datatype x) { node *pre=head,*p; p=head; while(p&&p->data!=x) { pre=p;p=p->next; } if(p) { pre->next=p->next; free(p); } return head; } /*把带头结点的单链表倒置(以结点形式 )*/ node *Dao_zhi(node *head) { node *p,*s; p=head->next; head->next=NULL; while(p) { s=p; p=p->next; s->next=head->next; head->next=s; } return head; } /*删除链表中重复的结点 */ node *dele1(node *head) { node *pre,*p,*q; if(head->next==0||!head->next->next) { printf("链表为空!"); return head; } //pre=head->next; q=head->next; while(q) { pre=q; p=q->next; while(p) { while(p&&q->data!=p->data) { pre=p;p=p->next; } if(p) { pre->next=p->next; free(p); } p=pre->next; } q=q->next; } return head; }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值