2023年数据结构实验报告模拟停车场管理含代码.pdf
模 拟 停 车 场 管 理 班 级:物 联 网 姓 名:XXX 学 号:XXXXXXX 日 期:4月 9 日 一、需 求 分 析 1、程 序 的 功 能 描 述 按 照 从 终 端 输 入 的 数 据 序 列 进 行 模 拟 管 理。1)狭 道 停 车 用 栈 来 实 现,并 且 用 的 顺 序 栈,等 车 位 的 便 道 用 队 列 来 实 现,并 用 链 式 存 储。2)每 一 组 输 入 信 息 包 含 三 个 数 据 项,汽 车 的“到 达”和“拜 别”的 信 息,汽 车 牌 照 号 码,汽 车“到 达”或“拜 别”的 时 刻。3)对 每 一 组 输 入 数 据 进 行 操 作 后 的 输 出 信 息 为:若 是 车 辆 到 达,则 输 出 车 辆 在 停 车 场 内 或 便 道 上 的 停 车 位 置;若 是 车 子 拜 别,则 输 出 车 辆 在 停 车 场 内 停 留 的 时 间 和 缴 纳 的 费 用。(假 设 在 便 道 等 车 的 时 间 不 收 费)4)选 作 内 容:(1)便 道 也 是 要 收 费 的,仅 仅 比 狭 道 收 费 便 宜 点。(2)狭 道 上 的 车 可 以 直 接 开 走。2,输 入/输 出 的 规 定 一 方 面 选 择 操 作 的 模 块,根 据 提 醒 输 入 车 牌 和 到 达 时 间,程 序 会 告 知 是 否 停 满 或 者 停 车 车 位。车 牌 为 10个 字 符 以 内 的 字 符 串,时 间 的 输 入 中 间 有 冒 号 把 时 分 隔 开。3、测 试 数 据 1 苏 D 543 1:1 01 苏 Q123 1:201 苏 D145 1:30二、概 要 设 计 1、本 程 序 所 用 的 抽 象 数 据 类 型 的 定 义 typedef s t ru c t NOD E CarNo d e*st a ckMAX+1;i n t top;JSe q S ta c k C a r;/狭 道 的 堆 栈 顺 序 存 储 t y p e def st r uct c ar C a rNode*d ata;stru c tear*n e xt;Queu e N ode;队 列 的 链 式 存 储 ty p e d ef struct N o deQ u eueNod e*h e ad;Q u eu e N o d e*rea r;L i n k QueueC a r;/便 道 上 等 候 的 队 列 定 义 2、主 模 块 的 流 程 及 各 子 模 块 的 重 要 功 能 错 误!车 辆 到 达:in t A r r ival(S eqSt a ckC a r*E n ter,L i n kQ u eueCar*W)一 方 面 定 义 一 个 栈 和 队 列 的 结 构 体 指 针 为:*p,*t。然 后 申 请 一 个 车 辆 信 息 的 内 存 空 间,并 把 它 赋 给 栈 指 针。车 辆 到 达 时 就 输 入 车 牌 号,并 通 过 if(E nter t opV M A X)来 判 断 该 车 是 进 车 场 内 还 是 进 便 道 上,假 如 是 进 车 场 内 就 把 t o p加 1,显 示 在 车 场 内 的 位 置,还 要 输 入 进 车 场 的 时 间,然 后 把 该 节 点 进 栈。假 如 是 e l s e 就 显 示 该 车 要 停 在 便 道 上,并 进 行 进 队 列 的 操 作。错 误!车 辆 离 开:void Le a v e(S e qS t a ck C ar*En t e r,SeqSta c kC a r*Temp,L i n kQueueC a r*W)定 义 一 个 整 型 变 量 ro o m记 录 要 离 开 车 辆 的 位 置,定 义 两 个 栈 指 针 和 一 个 队 列 指 针,用 个 if(Enler-to p 0)保 证 栈 不 空,然 后 用 个 w h i l e(l)保 证 输 入 的 车 辆 离 开 位 置 的 合 法 性。假 如 不 和 法,显 示 输 入 有 误,要 重 新 输 入。通 过 while(Enter-t oproom)判 断 离 开 车 辆 的 位 置,假 如 是 中 间 位 置,就 要 再 用 一 个 栈 前 面 临 时 开 出 来 的 车,等 要 开 出 的 车 开 出 后,再 把 临 时 栈 的 车 看 进 车 场 内,并 要 调 用 PRINT(p,room);这 个 函 数 计 算 显 示 费 用。然 后 还 要 用 i f(W-head!=W-rea r)&En t e r-t o p M A X)语 句 判 断 便 道 上有 没 有 车,假 如 有 车 就 要 显 示 进 车 场 的 车 的 车 牌 号,并 登 记 进 入 时 间。3、模 块 之 间 的 层 次 关 系 主 函 数 中 包 含 着 各 个 函 数 模 块,各 模 块 也 在 互 相 调 用。比 如,离 开 函 数 中 要 计 算 停 车 费,故 要 调 取 价 格 函 数。价 格 函 数 计 算 要 用 到 离 开 和 进 入 的 时 间,又 要 调 用 进 入 和 离 开 函 数。三、具 体 设 计 1、采 用 C 语 言 定 义 相 关 的 数 据 类 型#d e f i n e MAX 3/停 车 场 最 大 容 量 为 3 辆,便 于 观 测 ttdefin e p ric e 0.05typ e de f struct t ime/定 义 时 间 结 构 体 i n t h our;i nt min;Time;typ e def s true t node/定 义 车 辆 信 息 结 构 体 cha r n um 1 0;Tim e reach;Time lea v e;CarNo d e;2、写 出 各 模 块 的 伪 码 算 法 vo i d PRINT(Ca r N o de*p,i n t ro o m)/车 辆 收 费 oint A1,A2,B1,B2;printf(n 车 辆 离 开 的 时 间:”);s canf&(p-1 eave,h o u r),&(p-le a ve.m i n);printf(n离 开 车 辆 的 车 牌 号 为:);pu t s(pnum);pri n tf(0 n其 到 达 停 车 位 时 间);printf Cn离 开 停 车 位 时 间 为:);Al=p-r e ach.h our;A2=p-r e ach.m i n;Bl=p-1 e a ve.hour;B2=p-1 e ave.min;printf(n 应 交 费 用 为:%2.If 元,(B 1 A 1)*6 0+(B 2-A 2)*p r i c+PR I N T E(p,room);f r e e(p);)int Arriv a 1(SeqStac k Ca r*En t er,LinkQueu e Car*W)进 入 便 道 或 者 狭 道 CarNod e*p;Que u e Node*t;p=(Ca r Node*)m a Hoc(size o f(CarNode);flushall();printf C n 请 输 入 车 牌 号(例:豫 B 12 3 4):);get s(p-num);f(Ent e r-top t o p+;pr i n t f(n 车 辆 在 车 场 第%d 位 置.Ent e r-t o p);printf(”n车 辆 到 达 时 间:);s c a n f(%d:%d&(p-reach.hour),&(p-r each,min);En t e r-s tack t o p=p;ret u r n(1);0)oelse(printf(n该 车 须 在 便 道 等 待!有 车 位 时 进 入 车 场”);t=(Q u eueNo d e*)mallo c(si z e o f(Qu e ueN o d e);进 入 队 列,调 整 指 针;叩 rintf(请 输 入 进 入 便 道 的 时 间);scan f(d:%d”,&(p r each,hour),&(p-r ea c h.min);retu r n(1);v o i d L e ave(Se q S t a c kCa r*Enter,SeqSta c kCar*Temp,L i n k Q ueueCar*W)车 辆 的 离 开 oin t r o o m;Ca r N o d e*p,*t;Qu e ueNode*q;oif(Ente r-top0)/判 断 车 场 是 否 为 空(whil e(1)6(。叩 rintf(n请 输 入 车 在 车 场 的 位 置/1-%d/:”,Enter t op);scanf(%d,&r oom);i f(room=l&r o o mtop)break;e Ise prin t f(n 输 入 有 误,请 重 输:);)whi 1 e(E nter-toproom)/把 要 删 除 的 车 辆 的 前 面 的 车 开 出 来,进 临 时 栈。00 T emp-top+;TempstackT e mp-top=E n te r s t ac k E n ter-top;E n ter-st a ckEn t er-top=NULL;En t er-t op一;)p=Enter-sta c k En te r-top;把 要 删 除 的 车 辆 节 点 赋 给 p。E n te r-stack E n t e r top=NULL;E n te r-t o p-一;while(T empto p=1)/再 把 临 时 栈 里 德 车 辆 进 停 车 场 0(Ente r-t o p+;E n t e r-sta c k Ente r-top=Temp-s tac k T em p-t o p;T e m p-s t a ckT e m p to p=NULL;T e mp-top一;JoPRINT(p,room);/调 用 计 费 函 数 计 费。if(W h ead!=W-rear)&Enter-top h e ad n e x t;t=q-da t a;Enter-top+;s c a nf(,z%d:%d”,&(t-reach.hour),&(t rea c h.min);/t leav e.hour=t-rea c h.h o ur;。/t-lea v e.min=t-r e ach.min;W-head-n e x t=q-next;r e ar)W-rear=W-h ead;tE n ter-sta c k E n t e r-t o p=t;o PRINTE(t,r oom);free(q);o e 1 se p r i n t f(,z n 便 道 里 没 有 车.n);0oelse prin t f(n车 场 里 没 有 车.);)3、画 出 函 数 的 调 用 关 系 图 到 达 函 数-离 开 函 数-停 车 费 用 主 函 数-显 示 车 场 里 的 情 况 显 示 便 道 里 的 情 况 四、调 试 分 析1、调 试 中 碰 到 的 问 题 及 对 问 题 的 解 决 方 法 由 于 时 间 结 构 体 里 的 小 时,分 钟 都 是 用 的 是 整 型,所 以 假 如 出 现 1:0 1这 个 时 间 的 话,会 导 致 显 示 列 表 是 1:1;这 样 的 话 会 导 致 人 的 误 解,同 时 会 导 致 程 序 对 停 车 缴 纳 的 费 用 计 算 错 误。解 决 方 法 1:可 以 用 数 组 和 或 者 字 符 串 来 表 达 时 间,但 是 问 题 来 了,要 是 用 字 符 串 的 话,算 停 车 费 有 点 问 题,要 废 上 一 段 时 间 的,会 提 高 复 杂 度。解 决 方 案 2:将 输 出 用 右 对 齐 方 式,缺 位 的 用 0 补 齐,这 样 最 快 捷 啦!2、算 法 的 时 间 复 杂 度 和 空 间 复 杂 度 由 于 没 有 进 行 循 环 嵌 套 之 类 的 运 算,只 有 简 朴 的 循 环 语 句,所 以 时 间 复 杂 度 T(0)=0(n),在 数 据 的 存 储 方 面,除 了 车 牌 号 用 的 是 数 组 以 外,便 道 用 的 是 顺 序 栈,这 些 是 提 前 要 申 请 一 定 的 存 储 空 间 的,这 样 非 动 态 分 派 的 存 储 空 间,在 某 些 时 候 是 会 导 致 空 间 的 浪 费,增 长 其 空 间 复 杂 度。其 余 的 都 是 结 构 体 和 链 式 存 储 的 队 列 属 于 动 态 存 储。当 停 车 场 的 规 模 较 小 时,空 间 复 杂 度 较 小,随 着 规 模 的 增 长,动 态 存 储 的 扩 充,空 间 复 杂 度 也 随 之 增 长。五、使 用 说 明 及 测 试 结 果(给 出 程 序 的 使 用 说 明、注 意 事 项 及 不 同 情 况 的 测 试 结 果)时 间 以 2 4进 制 计 算,停 车 时 间 不 能 跨 越 2 4进 制。车 牌 号 是 10个 字 符 串 以 内,不 可 溢 出。ttttttitsitttttttnttttttttttn 3.车 辆 列 表 显 示.*#“#11*#4.退 出 系 统.ititsHttitttitttitititttttttit请 选 择:i请 输 入 车 牌 号 例:豫 B i2 3 4:苏 g 23该 车 须 在 便 道 等 待,有 车 位 时 进 入 车 场 请 输 入 进 入 便 道 的 时 间 a离 开 车 辆 的 车 牌 号 为:苏 D543给 俞 人 车 在 车 场 的 位 置 一 3/:1请 选 择:2ttttttttttttttttttltttttSIttttt 4.退 出 系 统.ttttttttttttttttitttitttttltttitttsxttttttnitttttititttttntt 3.车 辆 列 表 显 示.w t t t*#*G:新 皿 除(2)停 2 Debug2.exe寓 开 车 辆 的 车 牌 号 为:苏 D543第 一 个 应 缴 费 用 是 在 便 道 中 的 费 用,第 二 个 费 用 是 总 费 用。道 时 为 为 wlU1便 道 用 显 露 达 装 备 人 到 开 XX道 输 式 离 应 受 更 看:011机 元 元 式 g间 为 0.0.号 号 时 间:23230 1 10012:11:为:间 间 为 时 时 间 的 位 时 道 停 车 开 达 停 离 到 14其 离 车 A fA澧 必 一 幕 35六、源 程 序(规 定 程 序 简 洁、清 楚、重 要 语 句 带 注 释)代 码 非 本 人 写,对 其 进 行 改 善 而 已#incl u d e#incl u de#in c 1 ude#define M A X 3/停 车 场 最 大 容 量 为 3辆,便 于 观 测#de f i n e price 0.0 5#define p ricee 0.02typedef s tr u ct tim e/定 义 时 间 结 构 体 i n t h ou r;in t min;Tim e;typed e f struct n o d e/定 义 车 辆 信 息 结 构 体 ochar n um10;Time re a ch;Tim e le a ve;Car N o d e;t y pe d e f s tr u c t N O D E C a r N o de/stac kMAX+l;i nt t o p;S e qStac k C a r;typedef struct c a r oC a r N o de*d ata;s t ru c t car*ne x t;Q u eueNode;t y pedef struct N o deoQu e u e N o d e*head;Q u e ueNode*re a r;L in k Queue C a r;void InitS t a ck(SeqStackCar*);i nt I nit Q ueue(Lin k Q u e u e Car*);i nt Arr i v a 1(Seq S tack C ar*,L i nkQue u e C ar*);vo i d Leave(S e qStac k Ca r*,SeqStac k Car*,Link QueueCar*);voi d List(Se q St a c kCa r,Lin kQu e ueC ar);v o i d m a i n()S eq S tackCar En t er,Temp;L i n k Qu e ueCar Wait;i nt ch;osy stem(color 4 A H);InitS tac k(&Enter);InitSta c k(&Temp);InitQueue(&W ait);while ooprin t f(H n X X X X X 欢 迎 使 用 停 车 场 系 统.X X X XXtnn);pr i nt f(n t#1.车 辆 到 达 登 记.#pr i nt f(nt#2.车 辆 离 开 登 记.#、t n);pri n tf(nt#3.车 辆 列 表 显 示.#p r in tf#4.退 出 系 统.#awhile(1)。pri n t f(请 选 择:);scanf(z,%dz/,&c h);i f(ch=1&cht o p=0;for(i=0;i st a ck s-top=N U L L;in t I n itQueu e(L inkQue u eCar*Q)/队 列 的 初 始 化 Q-head=(QueueNode*)mallo c(s i zeof(QueueNo d e);i f(Q-head!=NULL)oQ h e a d-n ext=NULL;Q-r e ar=Q-head;r e t urn(1);)el s e return(-1);f loat PRINT E(CarN o d e*p,i n t r o om)/车 辆 收 费 oint Al,A2,B1,B2;p rin t f(M n 车 辆 离 开 便 道 的 时 间:);s canf(d:%d,&(p-le a v e.hour),&(p-le a ve.min);prin t f(”n离 开 车 辆 的 车 牌 号 为:);puts(p-num);pri n tf(n 其 到 达 便 道 时 间 为:d:%d”,p-reach.hou r,p-reach,m i n);p r i n tf(n 离 开 便 道 时 间 为:%d:%dz/,p leav e.ho u r,p-le a ve.min);A 1=p-re a ch.ho u r;A2=pr each,min;B 1=p-le a ve.h our;B2=ple a ve.min;printf(n 应 交 费 用 为:%2.If 元“,(B 1-A 1)*60+(B2-A2)*pricee);re t urn(B1A1)*6O+(B 2A 2)*pric e e);f r ee(p);void PR I NT(C a rNode*p,i n t r oom)/车 辆 收 费 oin t Al,A2,B1,B2;oprint f(n车 辆 离 开 的 时 间:);s c a nf(z,%d:%d z,&(p-1 eave,ho u r),&(pleave,mi n);print f(1 n 离 开 车 辆 的 车 牌 号 为:);pu t s(p-n u m);pri n tf(n 其 到 达 停 车 位 时 间 为:%d:%d/z,p-r e ach.hour,p-reac h.min);pri n tf(n 离 开 停 车 位 时 间 为:%d:%d/z,p-leave.hour,p-le a v e.m i n);A 1=p-r e a ch.h o u r;A 2=p-r e ach.min;Bl=p-l e a v e.hour;B 2=p-leave.min;p r intf(n应 交 费 用 为:2.If 元”,(Bl A l)*60+(B2A2)*pr i ce+PRINTE(p,r o o m);f r ee(p);)/车 辆 的 到 达 登 记 int A r r i va 1(Se q S t ac k C a r*Ente r,LinkQueueCar*W)0C arN ode*p;Qu e ueNo d e*t;p=(CarNode*)m a llo c(si z eof(CarNode);fl u sha 11();p r i n t f(M n 请 输 入 车 牌 号(例:豫 Bl 2 34):);ge t s(p-num);o i f(Ente r-top t op+;pri n tf(,n 车 辆 在 车 场 第%d 位 置.Enter top);pr i ntf(n车 辆 到 达 时 间:);0sea n f(%d:%d,&(p-reach.h ou r),&(p-r each,m i n);E n t er-s t a ckEn t er-to p=p;r eturn(1);e l s e6-prin t f(n 该 车 须 在 便 道 等 待!有 车 位 时 进 入 车 场);t=(Qu e ueN o d e*)m a 1 1 oc(s i z e of(Qu e u eNo de);t-data=p;t n ex t=NU L L;W-r ear-n e xt=t;W-rea r=t;叩 ri ntf(请 输 入 进 入 便 道 的 时 间);s c a n f(,z%d:%d n,&(p-reach.hou r),&(p-r e a c h.min);return(1);)void L eave(S e qStackCar*E n t e r,S e qS t ackCar*Tem p,Lin k Qu e ueCa r*W)/车 辆 的 离 开 oint room;C a r No d e*p,*t;Q ueueN ode*q;0i f(Enter-t op0)/判 断 车 场 是 否 为 空(gw h ile(l)00彳 pr i n t f(0 n 请 输 入 车 在 车 场 的 位 置/I%d/:,Ent e r-to p);sc a n f f t r o o m);if(room=l&ro o mtop)b reak;。el s e p r int f(n 输 入 有 误,请 重 输:);w h i l e(Enter-toproom)/把 要 删 除 的 车 辆 的 前 面 的 车 开 出 来,进 临 时 栈。0(B Tem p-to p+;T e mp-st ack Tempt o p=Enter-stackE n t e r-t o p;En t er-stack Ente r top=NULL;Ent e r-top-;P=Enterst a ck En t er-top;把 要 删 除 的 车 辆 节 点 赋 给 p。Enter-s tack Enter-top=NULL;Entertop;owhi 1 e(T e mp-t op=l)再 把 临 时 栈 里 德 车 辆 进 停 车 场。Enter-top+;Enter-s t a c kE n te r-top=Tem p-s t a c kT e mp-t o p;Temp-stackTemp-t o p=NULL;Temp-top一;。PR I NT(p,room);/调 用 计 费 函 数 计 费。i f(W-h e a d!=W r e a r)&Ent e r-tophead-n e xt;t=q-d a ta;Enter-t o p+;pri n tf(n便 道 的%s 号 车 进 入 车 场 第(1位 置.,t-num,Ent e r-t oP);p r i nt f(”n请 输 入 s 号 车 进 入 车 场 的 时 间:“,t-num);sea n f(n%d:%d H,&(t r e a c h.hour),&(t-r e ach.min);/t-leave.h o u r=t r e a c h.ho u r;g/t-leave.min=t rea c h.m i n;。W-h eadnext=q-nex t;o i f(q=W-r ear)W r ear=W-head;w E n t e r-s tackEn t er-top=t;PRlNTE(t,room);f r e e(q);8 else pr i n t f(n 便 道 里 没 有 车.n);)else p r i n t f(n 车 场 里 没 有 车.);)voi d L i s t 1(SeqStackCa r*S)/显 示 车 场 里 的 车 辆 情 况 o i n t i;i f(S-top0)。pr i n t f(n 车 场:);p r i n t f C n 位 置 到 达 时 间 车 牌 号 n);fo r(i=l;itop;i+)(o o p r i n t f C%d H,i);p ri n t f(*%d:%d,S-sta c k i rea c h.hou r,S-sta ck i-r each,mi n);puts(S-stack i-n u m);)0)oels e p rin t f(,zn 车 场 里 没 有 车”);)v o i d L i s t 2(LinkQueu e C a r*W)显 示 便 道 上 的 车 辆 情 况 Qu eu e N o d e*p;int i;p=W h e a d-n e xt;if(W-head!=W-rea r)gpr intf(n等 待 车 辆 的 号 码 为:);for(i=l;(p!=NULL);i+)8 叩 r i nt f(n 第 d 车 辆.,i);。叩 ut s(p-d atanum);。p=p-next;)oelse printf(n便 道 里 没 有 车.);叩 r intf(n);void List(SeqStackC a r S,Lin kQueu e Car W)!int fl a g,ta g;flag=l;owhi 1 e(fla g)(-pr i nt f(t,查 看 车 辆 列 表 显 示:);print f Cn 1.车 场 列 表 n 2,便 道 列 表、/显 示,遍 历 3.返 回 主 菜 单 n);p r i ntf(n 请 选 择 13:);aw h i le(l)s c anf(%d,&ta g);i f(tag=l&t a g=3)br e a k;e 1 se p r i n t f(z,n 输 入 有 误,请 重 新 选 择 1 3:);sw itc h(tag)oc a s e 1:L i s t 1(&S);b r e a k;case 2:L is t2(&W);break;c ase 3:f la g=0;s y stem(c ls);b r eak;de f a u l t:b r eak;