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{
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
#include
#include
#define LEN sizeof(LNode)//分配指定的空间
5.OVER
以上差不多大体就是这次项目的全部代码了,当然出现的错误也需要亲自己去调试解决啦,我自己运行的差不多就是下面的情况啦。