数据结构基础——城市链表
问题的描述:这是数据结构课程设计的一个设计题选,也是要求对线性链表的各种操作的一个熟悉的认知,能够创建线性链表——城市链表,对城市链表插入,查找,删除,更新等基本的操作。
PS:因为最近小杨同学 学习了数据结构,就将这些分享给大家了!
线性链表:具有链接存储结构的线性表,它用一组地址任意的存储单元存放线性表中的数据元素,逻辑上相邻的元素在物理上不要求也相邻,不能随机存取。一般用结点描述:结点(表示数据元素) =数据域(数据元素的映象) + 指针域(指示后继元素存储位置)。
话不多说,直接上代码(因为思路比较简单,所以代码的注释也很少了):
1.主函数模块:
void main()
{
LinkList L=NULL;
int flag=0;//用于判断是否已经创建了城市链表
int menu;
printf("\n***********************城市链表************************\n");
printf("\n********** | 1.建立一个城市链表 | **************");
printf("\n********** | 2.插入城市信息 | **************");
printf("\n********** | 3.删除城市信息 | **************");
printf("\n********** | 4.查找城市信息 | **************");
printf("\n********** | 5.更新城市信息 | **************");
printf("\n********** | 6.查看城市链表信息 | **************");
printf("\n********** | 7.退出系统 | **************\n");
printf("\n*******************欢迎来到城市链表********************\n");
while(1)
{ printf("\n请在主菜单选择要进行的操作(1-7):");scanf("%d",&menu);
switch(menu)
{
case 1:
printf(" 建立城市链表 \n");
L=creat_List();
flag=1;
printf(" 建立的城市链表如下 ");
printf_List(L);
break;
case 2:
if(flag==1)
{
int people,area,place;
char name[10];
LinkList p;
printf("请输入城市的名字: ");scanf("%s",&name);
printf("请输入城市的人数: ");scanf("%d",&people);
printf("请输入城市的面积(km^2): ");scanf("%d",&area);
printf("请输入城市的坐标:");scanf("%d",&place);
p=(LinkList)malloc(LEN);
p->people=people;
p->area=area;
p->place=place;
strcpy(p->name,name);
insert_message(L,p);
printf(" 插入后城市链表如下 ");
printf_List(L);
}
else printf("该通讯录还没有建立,请先建立!\n");
break;
case 3:
if(flag==1)
{
int way,f1,f2,p,n;
char names[10];
printf("选择删除的方式: 1.按表序号 2.按城市名 3.按城市坐标 \n");
scanf("%d",&way);
if(way==1)
{
printf("请输入序号: ");
scanf("%d",&n);
printf(" 删除后的信息如下 ");
delete_num(L,n);
printf_List(L);
}
else if(way==2)
{
printf("请输入城市名: ");
scanf("%s",names);
f1=delete_name(L,names);
if(f1==1)
{
printf(" 删除后信息如下 ");
printf_List(L);
}
else printf("没有该城市,删除失败!\n");
}
else if(way==3)
{
printf("\n请输入城市的坐标: "); scanf("%d",&p);
f2=delete_place(L,p);
if(f2==1)
{
printf(" 删除后信息如下 ");
printf_List(L);
}
else printf("没有这个坐标,删除失败!");
}
}
else printf("该通讯录还没有建立,请先建立!\n");
break;
case 4:
if(flag==1)
{
int ways,n1,n2,n3;
char namess[10];
printf("查找方式:1.按表序号 2.按城市名 3.按城市坐标和距离D(返回所有与此城市距离小于等于D的城市)\n");
scanf("%d",&ways);
if(ways==1)
{
int nums;
printf("请输入序号: ");
scanf("%d",&nums);
printf("查找信息如下:\n");
n1=search_num(L,nums);
if(n1==0) printf("没有该序号,查找失败!\n");
}
else if(ways==2)
{
printf("请输入城市名: ");
scanf("%s",namess);
n2=search_name(L,namess);
if(n2==0) printf("没有该城市,查找失败!\n");
}
else if(ways==3)
{ int p1,d;
printf("\n请输入城市的坐标: "); scanf("%d",&p1);
printf("请输入距离:");scanf("%d",&d);
n3=search_place(L,p1,d);
if(n3==0) printf("没有这个坐标,查找失败!");
}
}
else printf("该通讯录还没有建立,请先建立!\n");
break;
case 5: if(flag==1)
{
int number;
printf("请输入要修改表中城市的序号:");scanf("%d",&number);
update_list(L,number);
printf(" 更新后的信息如下 " );
printf_List(L);
}
else printf("该通讯录还没有建立,请先建立!\n");
break;
case 6:if(flag==0)
{
printf("请先创建城市链表!\n");
break;
}
printf(" 建立的城市信息如下 " );
printf_List(L);
break;
case 7: exit(0);
default :printf("\n没有此功能!");
}
}
}
2. 菜单功能实现的函数模块
①创建城市链表
LinkList creat_List()
{
LinkList L,p;
int num=1,people,area,place,temp=1;
char name[10];
L=(LinkList)malloc(LEN);
L->next=NULL;
printf("请输入城市的名字,人口数量,占地面积,位置坐标\n");
while(temp!=0)
{
printf("请输入第%d个城市的名字: ",num);scanf("%s",&name);
printf("请输入第%d个城市的人数: ",num);scanf("%d",&people);
printf("请输入第%d个城市的面积(km^2): ",num);scanf("%d",&area);
printf("请输入第%d个城市的坐标:",num);scanf("%d",&place);
p=(LinkList)malloc(LEN);
p->people=people;
p->area=area;
p->place=place;
strcpy(p->name,name);
insert_message(L,p);//调用插入函数
num++;
printf("是否继续输入? 1 YES,0 NO ------- "),scanf("%d",&temp);
}
return(L);
}
②插入城市信息
void insert_message(LinkList L,LinkList Elem)//这里是将数据按坐标的大小来有序的插入
{
LinkList p=L->next;
while(p!=NULL && Elem->place>=p->place)//进行判断
{
if(p->place==Elem->place)
{
printf(" 错误!该坐标已经存在!!!\n");
return;
}
p=p->next;
}
if(p==NULL)
{
p=prior(L,p);
Elem->next=NULL;
p->next=Elem;
}
else
{
p=prior(L,p);
Elem->next=p->next;
p->next=Elem;
}
}
LinkList prior(LinkList L,LinkList p)//这个函数是来找到当前元素的直接前驱元素的地址。
{
LinkList p_prior=L;
if(L->next==NULL) return (L);
while (p_prior->next!=p)
p_prior=p_prior->next;
return (p_prior);
}
③输出链表中的信息
void printf_List(LinkList L)
{
LinkList p=L;
int n=1;
printf("\n -------------------------------------------------------\n");
printf(" 序号 城市名 人数 占地面积(km^2) 位置坐标 \n");
printf(" -------------------------------------------------------\n");
if(L==NULL||L->next==NULL)
{
printf(" 该通讯录中没有元素\n");
}
else while(p->next!=NULL)
{
printf(" %d %s %d %d %d \n",n,p->next->name,p->next->people,p->next->area,p->next->place);
p=p->next;
n++;
}
printf(" -------------------------------------------------------\n");
}
④ 删除信息城市链表中的信息
根据链表建立的序号来删除:
void delete_num(LinkList L,int n)//这里是按序号来删除,比较好操作
{
LinkList p=L,q;
int j=0;
while(p->next && j<n-1)
{
p=p->next;
j++;
}
if(!(p->next))
{
printf("删除失败!\n");
return;
}
q=p->next;
p->next=q->next;
free(q);
}
int delete_name(LinkList L,char name[])
{
LinkList p=L->next;
int seat=1;
int flag=0;
if(L->next==NULL) printf("该链表没有元素,删除失败!\n");
else
{
while(p!=NULL)
{
if(strcmp(p->name,name)==0)
{
flag=1;
delete_num(L,seat);
break;
}
else
{
p=p->next;
seat++;
}
}
}
return flag;
}
根据城市的名字删除:
int delete_name(LinkList L,char name[])
{
LinkList p=L->next;
int seat=1;
int flag=0;
if(L->next==NULL) printf("该链表没有元素,删除失败!\n");
else
{
while(p!=NULL)
{
if(strcmp(p->name,name)==0)
{
flag=1;
delete_num(L,seat);//调用上面的函数,比较方便
break;
}
else
{
p=p->next;
seat++;
}
}
}
return flag;
}
根据城市的坐标来删除:
int delete_place(LinkList L,int place)
{
LinkList p=L->next;
int seat=1;
int flag=0;
if(L->next==NULL) printf("该链表没有元素,删除失败!\n");
else
{
while(p!=NULL)
{
if(p->place==place)
{
flag=1;
p=p->next;
delete_num(L,seat);
}
else
{
p=p->next;
seat++;
}
}
}
return flag;
}
⑤查询城市的信息(同删除的思路一样)
根据序号查询:
int search_num(LinkList L,int num)
{
LinkList p=L->next;
int flag=0;
int seat=1;
if(L->next==NULL) printf("该链表没有元素,查找失败!\n");
else
{
while(p!=NULL)
{
if(seat==num)
{
flag=1;
printf(" 要查找的是第%d城市:\n",seat);
printf("城市:%s 人数:%d 面积:%d 坐标:%d\n",p->name,p->people,p->area,p->place);
break;
}
else
{
p=p->next;
seat++;
}
}
}
return flag;
}
int search_name(LinkList L,char name[])
{
LinkList p=L->next;
int flag=0;
if(L->next==NULL) printf("该链表没有元素,查找失败!\n");
else
{
while(p!=NULL)
{
if(!strcmp(p->name,name))
{
flag=1;
printf("城市:%s 人数:%d 面积:%d 坐标:%d\n",p->name,p->people,p->area,p->place);
break;
}
else
{
p=p->next;
}
}
}
return flag;
}
根据城市名字查询:
int search_name(LinkList L,char name[])
{
LinkList p=L->next;
int flag=0;
if(L->next==NULL) printf("该链表没有元素,查找失败!\n");
else
{
while(p!=NULL)
{
if(!strcmp(p->name,name))
{
flag=1;
printf("城市:%s 人数:%d 面积:%d 坐标:%d\n",p->name,p->people,p->area,p->place);
break;
}
else
{
p=p->next;
}
}
}
return flag;
}
根据城市的坐标和指定的距离查询:(因为要求的是给定一个位置坐标P和一个距离D,查询所有与P的距离小于等于的城市)
int search_place(LinkList L,int place,int d)
{
LinkList p=L->next;
int flag=0;
int s=d+place;
if(L->next==NULL) printf("该链表没有元素,查找失败!\n");
else
{
while(p!=NULL)
{
if(p->place<=s)
{
flag=1;
printf("城市:%s 人数:%d 面积:%d 坐标:%d\n",p->name,p->people,p->area,p->place);
}
p=p->next;
}
}
return flag;
}
⑥更新表中的信息(根据城市排列的序号)
void update_list(LinkList L,int number)
{
int people,area,place;
char name[10];
LinkList p=L->next;
int seat=1;
if(L->next==NULL) printf("该链表没有元素!\n");
else
{
while(p!=NULL)
{
if(seat==number)
{
printf("要将‘名字’%s修改成:",p->name);scanf("%s",name);
strcpy(p->name,name);
printf("要将‘人数’%d修改成的:",p->people);scanf("%d",&people);
p->people=people;
printf("要将‘面积’%d修改成:",p->area);scanf("%d",&area);
p->area=area;
printf("要将坐标%d修改为:",p->place);scanf("%d",&place);
p->place=place;
p=p->next;
break;
}
else
{
p=p->next;
seat++;
}
}
}
}
3.采用的数据结构体定义
typedef struct LNode
{char name[10]; int people;int area;int place;struct LNode *next;
}LNode,*LinkList;
4.所需的头文件<>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN sizeof(LNode)//分配指定的空间
5.OVER
以上差不多大体就是这次项目的全部代码了,当然出现的错误也需要亲自己去调试解决啦,我自己运行的差不多就是下面的情况啦。
数据结构基础——城市链表相关推荐
- 算法与数据结构基础四----数据结构基础之动态数据结构基础:链表上
接着上一次https://www.cnblogs.com/webor2006/p/15195969.html的数据结构继续往下学习,这次会进入一个非常重要的数据结构的学习----链表,这个是未来学习复 ...
- 数据结构基础篇-链表反转(非递归与递归)C++实现
链表反转C++代码,附加打印逆序链表(不进行反转)代码. 测试用例: 5 2 3 4 10 5 1 4 1.非递归实现 思路:需要三个指针p1.p2.p3,分别指向上一个节点.当前节点与缓存的下一个节 ...
- 【数据结构基础】之链表介绍,生动形象,通俗易懂,算法入门必看
前言 本文为 数据结构基础[链表] 相关知识,下边将对链表概念,单链表,双链表,循环链表,Java中链表的使用等进行详尽介绍~
- python数据结构基础(单链表,多链表,二叉树)
python数据结构基础(单链表,多链表,二叉树) 数据结构指数据对象中数据元素之间的关系 Python 给我们提供了很多现成的数据结构类型,这些系统自己定义好的,不需要我们自己去定义的数据结构叫做 ...
- 数据结构课程设计 - 城市链表
C语言数据结构课程设计-城市链表.基本功能已经完成 此程序还有一些BUG:一个坐标只对应一个城市,不能重复. 希望大家好好学习数据结构 #include <stdio.h> #includ ...
- java城市链表_数据结构城市链表 1. 城市链表
[问题描述]将若干城市的信息 联合开发网 - pudn.com...
数据结构城市链表 所属分类:文章/文档 开发工具:Java 文件大小:174KB 下载次数:7 上传日期:2017-12-18 18:37:53 上 传 者:叁佰 说明: 1. 城市链表 [问题描述 ...
- 求单链表的最大值与原地逆转_数据结构基础复习09.ppt
数据结构基础复习09.ppt 数据结构考研辅导 基础复习 浙江大学计算机学院 内容提纲 考研概述 考察目标理解数据结构的基本概念 掌握数据结构的逻辑结构 存储结构及其差异 以及各种基本操作的实现 在掌 ...
- 【数据结构入门实验C语言版】城市链表
实验内容描述: 2 .城市链表(设计性实验) 问题描述 将若干城市的信息存入一个带头结点的单向链表.结点中的城市信息包括城市名.城市的位置坐 标.要求能够利用城市名和位置坐标进行有关查找.插入.删除. ...
- 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记
一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...
- SDUT—2054数据结构实验之链表九:双向链表 (基本建立)
点击打开链接 数据结构实验之链表九:双向链表 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Des ...
最新文章
- SQL Server用户自定义函数
- 斯坦福:「目标检测」深度学习全面指南
- 02、体验Spark shell下RDD编程
- c#中接口的使用方法图解_C#中的接口interface的使用
- 浏览器javascript 下载m3u8视频合成mp4
- Ext2.0的EditorGridPanel
- proteus仿真常见报错信息
- 20172328《程序设计与数据结构》第二周学习总结
- 360 android系统 流量,360流量卫士 for Android
- windows计算机锁屏的快捷键是什么,win7的锁屏快捷键是什么 win7锁屏快捷键介绍【图文】...
- html压缩包怎么打开,展示电脑rar压缩包文件怎么打开?教你正确打开方式
- 【汉诺塔】汉诺塔问题
- 【Docker】Docker进阶(二)
- Python深度学习与机器视觉(一)
- 公开招标,邀请招标,竞争性谈判,询价采购之间的区别
- fpu测试_正点原子STM32F4/F7水星开发板资料连载第五十章 FPU 测试实验
- [048量化交易]python获取股票 量比 换手率 市盈率-动态 市净率 总市值 流通市值写入数据库MongoDB
- 在阿里(02):阿里入职记
- java是编译型语言还是解释型语言?
- 真爱和迷恋的五大区别
热门文章
- 移位运算符 java_java.移位运算符
- UEditor 编辑器的下载与安装
- 【sketchup 2021】草图大师的高级工具使用3【复杂贴图制作实例(山体和球面贴图、全景天空绘制、吊顶添加光带)、图层(标记)工具使用、视图与样式工具的常规使用与高级使用说明】
- 数据分析项目整理之用户消费行为分析
- linux vi 文件查找,linux几种常见的文件内容查找和替换命令
- 网络编程 : 基于UDP的网络群聊聊天室
- 电路设计——教你如何阅读数据手册
- com.android.phone lg g3,详细的lg g3 root教程与方法
- python爬去学校_利用Python如何爬取自己学校的官网?用这招就行!
- 智慧工地视频监控系统解决方案