数据结构基础——城市链表

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

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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值