為什么程式運行到Insert()函式的Q->rear->next = node;這一行時會報錯,大致是說next不能存放node的地址
#include <stdio.h>
#include <stdlib.h>
typedef struct QueueNode
{
int Data;
QueueNode *next;
}QueueNode;
typedef struct QueueLink
{
QueueNode *front;
QueueNode *rear;
int length;
}QueueLink;
void Init(QueueLink *Q);
void Insert(QueueLink *Q);
void Delete(QueueLink *Q);
void Print(QueueLink *Q);
int main()
{
QueueLink q;
int i;
printf("1. 初始化\n");
printf("2. 入隊\n");
printf("3. 出隊\n");
printf("4. 輸出\n");
printf("請輸入選項:");
while (scanf("%d", &i) == 1)
{
switch (i)
{
case 1: Init(&q);
printf("\n");
break;
case 2: Insert(&q);
printf("\n");
break;
case 3: Delete(&q);
printf("\n");
break;
case 4: Print(&q);
printf("\n");
break;
default: printf("無該選項!!!\n");
break;
}
printf("1. 初始化\n");
printf("2. 入隊\n");
printf("3. 出隊\n");
printf("4. 輸出\n");
printf("請輸入選項:");
}
getchar();
getchar();
return 0;
}
void Init(QueueLink *Q)
{
QueueNode *head;
head = (QueueNode *)malloc(sizeof(QueueNode)); //head為頭結點,最開始時front和rear均指向它
Q = (QueueLink *)malloc(sizeof(QueueLink));
Q->front = Q->rear = head;
Q->length = 0;
printf("初始化成功!!!\n");
}
void Insert(QueueLink *Q)
{
int data;
QueueNode *node;
node = (QueueNode *)malloc(sizeof(QueueNode));
printf("請向結點中輸入資料:");
scanf("%d", &data);
node->Data = data;
node->next = NULL;
Q->rear->next = node;
Q->rear = node;
//Q->length++;
printf("入隊成功!!!\n");
}
void Delete(QueueLink *Q)
{
int data;
QueueNode *p;
if (Q->front == Q->rear)
{
printf("佇列為空,無可出隊元素!!!\n");
}
else
{
p = Q->front->next; //將“要出隊的元素”的地址暫存在p中
Q->front->next = p->next; //front的next域中存放“要出隊元素”的下一個元素的地址
if ((Q->rear) == p) //如果rear指向被刪元素,說明“被刪元素”是最后一個元素,此時就應讓rear指向頭結點
{
Q->front = Q->rear;
}
free(p);
}
}
void Print(QueueLink *Q)
{
if (Q->front == Q->rear)
{
printf("佇列為空,無可出隊元素!!!\n");
}
else
{
QueueNode *p = Q->front->next;
while (p != NULL)
{
printf("%d ", p->Data);
p = p->next;
}
printf("\n");
}
}
uj5u.com熱心網友回復:
謝邀。首先需要明確,成員選擇運算子 -> 要求兩個運算元,左運算元必須是指向結構、聯合型別的指標;右運算元必須是成員的名字。成員選擇運算子 -> 用來得到那個指定的成員,而且是一個左值。
再來看你的運算式Q->rear->next = node
在這里,Q的型別是指向結構型別QueueLink的指標,所以Q->rear得到Q所指向的那個結構變數的成員變數rear。
同理,Q->rear->next得到Q->rear所指向的那個結構變數的成員變數next。
成員變數next的型別是指向QueueNode的指標。node的型別也是指向QueueNode的指標。賦值是允許的。
因此,問題不是出在Q->rear->next = node,而是因為變數q的rear成員不存在。
uj5u.com熱心網友回復:
補充一句,是因為變數q的rear成員所指向的結構變數不存在。uj5u.com熱心網友回復:
#include <stdio.h>
#include <stdlib.h>
typedef struct QueueNode
{
int Data;
QueueNode *next;
}QueueNode;
typedef struct QueueLink
{
QueueNode *front;
QueueNode *rear;
int length;
}QueueLink;
void Init(QueueLink *Q);
void Insert(QueueLink *Q);
void Delete(QueueLink *Q);
void Print(QueueLink *Q);
int main()
{
QueueLink q;
int i;
printf("1. 初始化\n");
printf("2. 入隊\n");
printf("3. 出隊\n");
printf("4. 輸出\n");
printf("請輸入選項:");
while (scanf("%d", &i) == 1)
{
switch (i)
{
case 1: Init(&q);
printf("\n");
break;
case 2: Insert(&q);
printf("\n");
break;
case 3: Delete(&q);
printf("\n");
break;
case 4: Print(&q);
printf("\n");
break;
default: printf("無該選項!!!\n");
break;
}
printf("1. 初始化\n");
printf("2. 入隊\n");
printf("3. 出隊\n");
printf("4. 輸出\n");
printf("請輸入選項:");
}
getchar();
getchar();
return 0;
}
void Init(QueueLink *Q)
{
QueueNode *head;
head = (QueueNode *)malloc(sizeof(QueueNode)); //head為頭結點,最開始時front和rear均指向它
if (!head)
return;
//Q = (QueueLink *)malloc(sizeof(QueueLink));
Q->front = Q->rear = head;
Q->length = 0;
printf("初始化成功!!!\n");
}
void Insert(QueueLink *Q)
{
int data;
QueueNode *node;
node = (QueueNode *)malloc(sizeof(QueueNode));
if (!node)
return;
printf("請向結點中輸入資料:");
scanf("%d", &data);
node->Data = data;
node->next = NULL;
Q->rear->next = node;
Q->rear = node;
//Q->length++;
printf("入隊成功!!!\n");
}
void Delete(QueueLink *Q)
{
//int data;
QueueNode *p;
if (Q->front == Q->rear)
{
printf("佇列為空,無可出隊元素!!!\n");
return;
}
//else
// {
p = Q->front->next; //將“要出隊的元素”的地址暫存在p中
Q->front->next = p->next; //front的next域中存放“要出隊元素”的下一個元素的地址
if (!Q->front->next)
Q->rear = Q->front;
/*
if ((Q->rear) == p) //如果rear指向被刪元素,說明“被刪元素”是最后一個元素,此時就應讓rear指向頭結點
{
Q->front = Q->rear;
}
*/
free(p);
//}
}
void Print(QueueLink *Q)
{
if (Q->front == Q->rear)
{
//printf("佇列為空,無可出隊元素!!!\n");
printf("佇列為空,無可輸出元素!!!\n");
return;
}
//else
//{
QueueNode *p = Q->front->next;
while (p != NULL)
{
printf("%d ", p->Data);
p = p->next;
}
printf("\n");
//}
}
供參考~
初始化佇列里,沒有搞明白p吧,樓主輸入的實參是&p,因此在初始化函式里不能將其認為是沒有申請空間的指標。這個指標是指向堆疊上上有效空間;
問題就在Init函式里。
另外,建議把佇列初始化作為必做的一項,不要放在用戶的可選選單里,如果用戶不先選擇1,就選擇2或者其他,程式是不是就例外退出了呢?
所以,程式設計需要考慮多種情況~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/9529.html
標籤:C語言
上一篇:c語言檔案。。求助
