#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define Max 16
//郑州火车站,二七广场,人民路,紫荆山,燕庄
//实现地铁站的插入、删除、修改、查询、排序以及票价查询工作
//输入上车站与下车站,系统自动计算出票价(两站之内两元,三四站三元)
//输出票价时同时输出用户经过的地铁站
//记录每个地铁站的人流量总数(我觉得这个emm
//并按照使用至少三种排序算法按照人流量从大到小顺序列出站点名称
typedef struct node
{
int id;//序号
char name[Max];//车站名称
int crowd;//人流
struct node* next;
}linklist;
//菜单
void base()
{
printf("**********************************************\n");
printf("****** 菜 单 ********\n");
printf("****** 1.插入站点 2.删除站点 ********\n");
printf("****** 3.修改站点 4.票价查询 ********\n");
printf("****** 5.流量排序 6.车票购买 ********\n");
printf("****** 0.退出系统 ********\n");
printf("**********************************************\n");
}
//创建一个单链表
//尾插法创建,并且含有头结点
linklist* Clist()
{
char ch;
linklist* head;
linklist* s;
linklist* r;
head = (linklist*)malloc(sizeof(linklist));//生成头结点
r = head;//尾指针初值指向头结点
ch = getchar();//读入第一个结点的值
int n = 0;
while (ch != '\n') //$为结束标识符
{
s = (linklist*)malloc(sizeof(linklist)); //生成一个新结点
int i = 0;
while (ch != ' ')
{
s->name[i] = ch;
ch = getchar();
i++;
}
s->name[i] = '\0'; // 在字符串末尾添加结束符
ch = getchar(); // 读取空格后的字符
s->id = n; n++;
s->crowd = 0;
r->next = s; // 新结点插入表尾
r = s; //尾指针指向新表尾
}
r->next = NULL;
return head;//返回头指针的值
}
//向后插入
void INSETAFTER(linklist* head)
{
linklist* r, * s;
linklist* t;
r = (linklist*)malloc(sizeof(linklist));
t = (linklist*)malloc(sizeof(linklist));
int Id;
printf("请输入插入的地铁站序号、名称:");
scanf("%d", &Id);
//t是插入的结点前的结点
r = head->next;
while (r->id !=Id-1&&r!=NULL)
{
r = r->next;
}
t = head;
while (t->next != r)
{
t = t->next;
}
//将插入点之后的所有结点的id加一
while (r != NULL)
{
r->id++;
r = r->next;
}
//尾插法添加新的站点
s = (linklist*)malloc(sizeof(linklist)); //生成一个新结点
int i = 0;
s->id = Id - 1;
//printf("请输入新建地铁站的名称:");
char ch;
ch = getchar();
while (ch != '\n')
{
s->name[i] = ch;
ch = getchar();
i++;
}
s->name[i] = '\0'; // 在字符串末尾添加结束符
//ch = getchar(); // 读取空格后的字符
s->crowd = 0;
s->next = t->next;
t->next = s;
}
//删除
void DELETE(linklist* head)
{
linklist* p;
linklist* q;
linklist* t;
int n;
printf("请输入要删除的车站序号:");
scanf("%d", &n);
q = head; //p = head;
while (q->next->id != n-1)
{
q = q->next;
}//要删除的结点之前
p = q->next;
q->next = p->next;
t = p;
while (t != NULL)
{
t->id--;
t = t->next;
}
free(p);
}
//修改
void CHANGE(linklist* head)
{
linklist* p; p = head;
int n; char ch; int i = 0;
printf("请输入要修改的车站序号、名称:");
scanf("%d", &n);
while (p->id != n - 1)
{
p = p->next;
}
ch = getchar();
while (ch != '\n')
{
p->name[i] = ch;
ch = getchar();
i++;
}
p->name[i] = '\0';
}
//价格查询
void PRICE(linklist* head)
{
int a, b;
printf("请输入进站口、出站口序号:");
scanf("%d%d", &a, &b);
printf("票价为:%d元。\n", b-a+1);
linklist* pa; linklist* pb;
pa = head; pb = head;
while (pa->id != a-1)
{
pa = pa->next;
}
while (pb->id != b-1)
{
pb = pb->next;
}
printf("乘车路线为:");
while (pa != pb->next)
{
int i = 0;
printf("%d站:", pa->id + 1);
while (pa->name[i] != 0)
{
printf("%c", pa->name[i]);
i++;
}
pa = pa->next;
if (pa != pb->next)printf(" --> ");
}
printf("\n");
}
//流量输出
void PFCROWD(linklist* head)
{
linklist* p;
p = head->next;
while (p != NULL)
{
printf("%2d站流量:%2d\n",p->id+1,p->crowd);
p = p->next;
}
}
//购买车票
void BUY(linklist* head)
{
int a, b;
printf("请输入进站口、出站口序号:");
scanf("%d%d", &a, &b);
printf("票价为:%d元。\n", b - a + 1);
linklist* pa; linklist* pb;
pa = head; pb = head;
while (pa->id != a - 1)
{
pa = pa->next;
}
while (pb->id != b - 1)
{
pb = pb->next;
}
printf("乘车路线为:");
while (pa != pb->next)
{
int i = 0;
printf("%d站:", pa->id + 1);
while (pa->name[i] != 0)
{
printf("%c", pa->name[i]);
i++;
}
pa->crowd++;
pa = pa->next;
if (pa != pb->next)printf(" --> ");
}
printf("\n");
}
//输出链表
void PRINTLIST(linklist* head)
{
linklist* p;
p = head->next;
while (p != NULL)
{
int i = 0;
printf("%d站:", p->id + 1);
while (p->name[i] != 0)
{
printf("%c", p->name[i]);
i++;
}
p = p->next;
if (p != NULL)printf(" --> ");
}
printf("\n");
}
int main()
{
base();
linklist* Subway;
//先添加五个地铁站
printf("请输入地铁站的名字,站与站之间用空格隔开。\n");
printf("输入空格+回车后退出输入。\n");
Subway = (linklist*)malloc(sizeof(linklist));
Subway = Clist();
PRINTLIST(Subway);
int ncase = 1;
int n = 0;
while (ncase)
{
system("cls");
base();
printf("当前地铁线路图如下:\n");
PRINTLIST(Subway);
printf("请选择您要进行的操作:");
scanf("%d", &ncase);
switch (ncase)
{
case 0:
break;
case 1://插入地铁站站点
INSETAFTER(Subway);
PRINTLIST(Subway);
system("pause");
break;
case 2://删除
DELETE(Subway);
PRINTLIST(Subway);
system("pause");
break;
case 3://修改
CHANGE(Subway);
PRINTLIST(Subway);
system("pause");
break;
case 4://票价查询
PRICE(Subway);
system("pause");
break;
case 5://流量排序
PFCROWD(Subway);
system("pause");
break;
case 6://购买车票
BUY(Subway);
system("pause");
break;
default:
printf("无效数字,请重新输入。");
}
}
}
标签:head,作业,next,linklist,while,pa,printf
From: https://blog.51cto.com/u_15736615/9379893