问题的描述:这是数据结构课程设计的一个设计题选,也是要求对线性链表的各种操作的一个熟悉的认知,能够创建线性链表——城市链表,对城市链表插入,查找,删除,更新等基本的操作。

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

以上差不多大体就是这次项目的全部代码了,当然出现的错误也需要亲自己去调试解决啦,我自己运行的差不多就是下面的情况啦。

数据结构基础——城市链表相关推荐

  1. 算法与数据结构基础四----数据结构基础之动态数据结构基础:链表上

    接着上一次https://www.cnblogs.com/webor2006/p/15195969.html的数据结构继续往下学习,这次会进入一个非常重要的数据结构的学习----链表,这个是未来学习复 ...

  2. 数据结构基础篇-链表反转(非递归与递归)C++实现

    链表反转C++代码,附加打印逆序链表(不进行反转)代码. 测试用例: 5 2 3 4 10 5 1 4 1.非递归实现 思路:需要三个指针p1.p2.p3,分别指向上一个节点.当前节点与缓存的下一个节 ...

  3. 【数据结构基础】之链表介绍,生动形象,通俗易懂,算法入门必看

    前言 本文为 数据结构基础[链表] 相关知识,下边将对链表概念,单链表,双链表,循环链表,Java中链表的使用等进行详尽介绍~

  4. python数据结构基础(单链表,多链表,二叉树)

    python数据结构基础(单链表,多链表,二叉树) 数据结构指数据对象中数据元素之间的关系 Python 给我们提供了很多现成的数据结构类型,这些系统自己定义好的,不需要我们自己去定义的数据结构叫做 ...

  5. 数据结构课程设计 - 城市链表

    C语言数据结构课程设计-城市链表.基本功能已经完成 此程序还有一些BUG:一个坐标只对应一个城市,不能重复. 希望大家好好学习数据结构 #include <stdio.h> #includ ...

  6. java城市链表_数据结构城市链表 1. 城市链表 [问题描述]将若干城市的信息 联合开发网 - pudn.com...

    数据结构城市链表 所属分类:文章/文档 开发工具:Java 文件大小:174KB 下载次数:7 上传日期:2017-12-18 18:37:53 上 传 者:叁佰 说明:  1. 城市链表 [问题描述 ...

  7. 求单链表的最大值与原地逆转_数据结构基础复习09.ppt

    数据结构基础复习09.ppt 数据结构考研辅导 基础复习 浙江大学计算机学院 内容提纲 考研概述 考察目标理解数据结构的基本概念 掌握数据结构的逻辑结构 存储结构及其差异 以及各种基本操作的实现 在掌 ...

  8. 【数据结构入门实验C语言版】城市链表

    实验内容描述: 2 .城市链表(设计性实验) 问题描述 将若干城市的信息存入一个带头结点的单向链表.结点中的城市信息包括城市名.城市的位置坐 标.要求能够利用城市名和位置坐标进行有关查找.插入.删除. ...

  9. 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记

    一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...

  10. SDUT—2054数据结构实验之链表九:双向链表 (基本建立)

    点击打开链接 数据结构实验之链表九:双向链表 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Des ...

最新文章

  1. SQL Server用户自定义函数
  2. 斯坦福:「目标检测」深度学习全面指南
  3. 02、体验Spark shell下RDD编程
  4. c#中接口的使用方法图解_C#中的接口interface的使用
  5. 浏览器javascript 下载m3u8视频合成mp4
  6. Ext2.0的EditorGridPanel
  7. proteus仿真常见报错信息
  8. 20172328《程序设计与数据结构》第二周学习总结
  9. 360 android系统 流量,360流量卫士 for Android
  10. windows计算机锁屏的快捷键是什么,win7的锁屏快捷键是什么 win7锁屏快捷键介绍【图文】...
  11. html压缩包怎么打开,展示电脑rar压缩包文件怎么打开?教你正确打开方式
  12. 【汉诺塔】汉诺塔问题
  13. 【Docker】Docker进阶(二)
  14. Python深度学习与机器视觉(一)
  15. 公开招标,邀请招标,竞争性谈判,询价采购之间的区别
  16. fpu测试_正点原子STM32F4/F7水星开发板资料连载第五十章 FPU 测试实验
  17. [048量化交易]python获取股票 量比 换手率 市盈率-动态 市净率 总市值 流通市值写入数据库MongoDB
  18. 在阿里(02):阿里入职记
  19. java是编译型语言还是解释型语言?
  20. 真爱和迷恋的五大区别

热门文章

  1. 移位运算符 java_java.移位运算符
  2. UEditor 编辑器的下载与安装
  3. 【sketchup 2021】草图大师的高级工具使用3【复杂贴图制作实例(山体和球面贴图、全景天空绘制、吊顶添加光带)、图层(标记)工具使用、视图与样式工具的常规使用与高级使用说明】
  4. 数据分析项目整理之用户消费行为分析
  5. linux vi 文件查找,linux几种常见的文件内容查找和替换命令
  6. 网络编程 : 基于UDP的网络群聊聊天室
  7. 电路设计——教你如何阅读数据手册
  8. com.android.phone lg g3,详细的lg g3 root教程与方法
  9. python爬去学校_利用Python如何爬取自己学校的官网?用这招就行!
  10. 智慧工地视频监控系统解决方案