如圖所示,在p=p->next這一步會彈出讀取訪問權限沖突,但考慮初始化問題在入隊函式里已進行p->next=NULL, 該如何分析?

附原始碼:
#define _CRT_SECURE_NO_WARNINGS 1
#define max 4
#include <conio.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
/* 客戶節點的型別定義 */
typedef struct qnode
{
char data[max];
struct qnode *next;
}LinkNode;
/* 鏈隊的定義 */
typedef struct { LinkNode* front; LinkNode* rear; } LinkQueue;
/* 佇列初始化 */
void initial(LinkQueue *&q)
{
q = (LinkQueue*)malloc(sizeof(LinkQueue));
q->front = q->rear = NULL;
}
void inqueue(LinkQueue *&q, int e, char a)//掛號入隊 注:形參(鏈隊,排隊編號)
{
char s[4] = {0};
LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode));
p->next = NULL;
if (q->rear == NULL) q->front = q->rear = p;//若當前鏈隊是否為空,則當前新插入節點兼為隊頭和隊尾
else
{
q->rear->next = p;//將新節點排至隊尾
q->rear = p; //將隊尾指標指向該成員
}
if (e > 0 && e < 10)
{
s[0] = a;
s[1] = '0';
s[2] = '0';
s[3] = e % 10 + 48;
strcpy(p->data, s);
printf("\n——————————————————————————————————\n\n");
printf("取號成功!您的號碼是:%s", p->data);
}
else if (e >= 10 && e < 100)
{
p->data[0] = a;
p->data[1] = '0';
p->data[2] = e / 10;
p->data[3] = e / 10 % 10;
strcpy(p->data, s);
printf("\n\n——————————————————————————————————\n\n");
printf("取號成功!您的號碼是:%s", p->data);
}
else if (e >= 100 && e < 1000)
{
p->data[0] = a;
p->data[1] = e / 100;
p->data[2] = e / 10 % 10;
p->data[3] = e % 10;
strcpy(p->data, s);
printf("\n\n——————————————————————————————————\n\n");
printf("取號成功!您的號碼是:%c%d", a, e);
}
}
void outqueue(LinkQueue*& q)//出號出隊
{
LinkNode* p;
if (q->rear == NULL)
{
printf("當前沒有人需要辦理服務!");
}
p = q->front; //臨時節點指向隊頭
if (q->front == q->rear) q->front = q->rear = NULL; //原佇列只剩下一個節點時,將隊頭和隊尾節點置空
else q->front = q->front->next; //不止一個節點,就直接把隊頭節點出隊(隊頭指標后移一位)
free(p);
}
void cancel(LinkQueue *&q, int e)
{
printf("您是否要取消排隊?若取消,進行服務則需要重新排隊哦!\n");
printf("按Y鍵繼續,按其他鍵繼續等候...\n\n");
if (_getch() == 'Y' || _getch() == 'y')
{
printf("您確定要取消本次排隊嗎?按Y鍵作最后確認,按其他鍵繼續等候...\n");
if (_getch() == 'Y' || _getch() == 'y')
{
for (int i = 0; i < e; i++);
}
}
}
void destroy(LinkQueue*& q)
{
system("cls");
LinkNode* pre = q->front; //創建一個新的節點指向隊頭節點
LinkNode* p;
char c;
printf("即將下班.....輸入Y鍵確認銷毀佇列,輸入其它則回傳主選單....");
getchar();
scanf("%c", &c);
if (c == 'Y' || c == 'y')
{
if (pre != NULL) //當隊頭節點非空(未完成全隊銷毀時)
{
p = pre->next; //臨時指標指向pre的后繼節點
while (p != NULL) //當后繼節點不為空時
{
free(pre); //釋放隊頭節點
pre = p; //隊頭節點后移
p = p->next; //隊頭節點的后繼節點后移
}
free(q); //回圈結束仍存隊頭節點,釋放,銷毀結束
}
}
else system("cls");
}
void num_count(LinkQueue*&q)
{
int i=0;
LinkNode* p=q->front;
while (p != NULL)
{
i++;
p=p->next;
}
printf("\n——————————————————————————————————\n\n");
printf("當前佇列共有 %d 個等待服務的客戶!按任意鍵回傳主選單...",i);
_getch(); system("cls");
}
void inqueue_menu(LinkQueue* q, int i)
{
restart:
printf("——————————————————————————————————\n\n");
printf("—————— 儲蓄銀行服務掛號系統 ——————\n\n");
printf("——————————————————————————————————\n\n");
printf("—————— 請輸入您想進行服務代碼以取號 ——————\n\n");
printf("——————————————————————————————————\n\n");
printf("—————— 1. 存款管理 ——————\n\n");
printf("—————— 2. 貸款管理 ——————\n\n");
printf("—————— 3. 轉賬匯款 ——————\n\n");
printf("—————— 4. 理財咨詢 ——————\n\n");
printf("—————— 5. 結匯購匯 ——————\n\n");
printf("—————— 6. 全球服務 ——————\n\n");
printf("—————— 7. 民生繳費 ——————\n\n");
printf("—————— 8. 個人設定 ——————\n\n");
printf("—————— 0. 回傳 ——————\n\n");
printf("——————————————————————————————————\n\n");
printf("服務序號:");
int a; scanf("%d", &a);
switch (a)
{
case 1: inqueue(q, i, 'C'); break;
case 2: inqueue(q, i, 'D'); break;
case 3: inqueue(q, i, 'Z'); break;
case 4: inqueue(q, i, 'L'); break;
case 5: inqueue(q, i, 'J'); break;
case 6: inqueue(q, i, 'Q'); break;
case 7: inqueue(q, i, 'M'); break;
case 8: inqueue(q, i, 'G'); break;
case 0: i--; system("cls"); break;
default:
{
printf("您輸入了錯誤的代號!按任意鍵重新輸入....");
_getch(); system("cls"); goto restart;
}
}
}
void outqueue_menu(LinkQueue* q,char *s)
{
printf("\n——————————————————————————————————\n\n");
printf("正在為您呼叫下一位客戶....\n\n");
printf("請%s號客戶前來辦理服務!\n\n", q->front->data);
outqueue(q);
}
void display(LinkQueue* q)
{
system("cls");
printf("——————————————————————————\n\n");
printf("——————* 銀行排隊客戶次序預覽 *——————\n\n");
printf("——————————————————————————\n\n");
LinkNode* p = q->front;
if (p == NULL) printf("\t\t 當前沒有人在排隊!\n\n");
while (p != NULL)
{
printf("%c%c%c%c\n", p->data[0], p->data[1], p->data[2], p->data[3]);
p = p->next;
}
printf("——————————————————————————\n\n");
printf("按任意鍵回傳主選單....");
_getch(); system("cls");
}
int main()
{
LinkQueue* q;
initial(q);
int i = 0;
char* s = NULL;
while (1)
{
int a;
printf("——————————————————————————————————\n\n");
printf("—————— 儲蓄銀行服務服務系統 ——————\n\n");
printf("——————————————————————————————————\n\n");
printf("—————— 請輸入您想進進入模式的代碼 ——————\n\n");
printf("——————————————————————————————————\n\n");
printf("—————— 1. 掛號 ——————\n\n");
printf("—————— 2. 取號 ——————\n\n");
printf("—————— 3. 棄號 ——————\n\n");
printf("—————— 4. 統計 ——————\n\n");
printf("—————— 5. 查看 ——————\n\n");
printf("—————— 6. 關于 ——————\n\n");
printf("——————————————————————————————————\n\n");
printf("模式序號:");
scanf("%d", &a);
switch (a)
{
case 1:
{
system("cls"); i++; inqueue_menu(q, i);
printf("\n\n按任意鍵繼續...\n\n"); _getch(); system("cls");
break;
}
case 2:
{
outqueue_menu(q,s);
printf("\n\n按任意鍵繼續...\n\n"); _getch(); system("cls");
break;
}
case 3:
{
printf("請輸入您的完整排隊序號:");
}
case 4:num_count(q); break;
case 5:display(q); break;
case 6:about(); break;
default:
{
printf("\n——————————————————————————————————\n\n");
printf("您輸入了錯誤的代碼!按任意鍵重新輸入...."); _getch(); system("cls");
}
}
}
return 0;
}
uj5u.com熱心網友回復:
這就是沒有初始化導致的,p->next還是沒有初始化uj5u.com熱心網友回復:
初始化不是令p->next=NULL么,需要怎么修改呢轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/55059.html
標籤:C語言
上一篇:精講回應式WebClient第5篇-請求超時設定與例外處理
下一篇:求解,c語言程式題
