/*指针和数组及存储单元*/

这段代码展示了在C语言中,通过指针计算数组元素之间的距离。程序首先定义了一个双精度浮点数数组,然后获取了数组第一个元素的指针,并将其加一。接着,程序打印出两个指针之间的字节差距以及整数差距。这揭示了C语言内存布局的细节。
#include<stdio.h>
int main()
{
    double a[2],*p,*q;
    p=&a[0];
    q=p+1;
    printf("%lld\n",q - p);
    printf("%d\n",(int)q-(int)p);
    return 0;
}

/* 队列基本操作(数组实现) */ #include "queue.h"///data/workspace/myshixun/chp3/fatal.h #include "fatal.h" #include <stdlib.h> #define MinQueueSize ( 5 ) struct QueueRecord { int Capacity; //队列容量 int Front; //队首,进行出队操作 int Rear; //队尾,进行入队操作 int Size; //队列实际大小 ElementType *Array; //队列数组指针 }; /* START: fig3_58.txt */ int IsEmpty( Queue Q ) { // 请在此添加代码,队列空,返回1;否则返回0 /********** Begin *********/ /********** End **********/ } /* END */ int IsFull( Queue Q ) { // 请在此添加代码,队列满,返回1;否则返回0 /********** Begin *********/ /********** End **********/ } /* 队列的创建 */ Queue CreateQueue( int MaxElements ) { Queue Q; /* 1*/ if( MaxElements < MinQueueSize ) /* 2*/ Error( "Queue size is too small" ); /* 3*/ Q = malloc( sizeof( struct QueueRecord ) ); /* 4*/ if( Q == NULL ) /* 5*/ FatalError( "Out of space!!!" ); /* 6*/ Q->Array = malloc( sizeof( ElementType ) * MaxElements ); /* 7*/ if( Q->Array == NULL ) /* 8*/ FatalError( "Out of space!!!" ); /* 9*/ Q->Capacity = MaxElements; /*10*/ MakeEmpty( Q ); /*11*/ return Q; } /* START: fig3_59.txt 队列创建后各变量置初态 */ void MakeEmpty( Queue Q ) { // 请在此添加代码,初始化队列的Size,Front,Rear值 /********** Begin *********/ /********** End **********/ } /* END */ /* 队列的销毁 */ void DisposeQueue( Queue Q ) { if( Q != NULL ) { free( Q->Array ); free( Q ); } } /* START: fig3_60.txt 队列Q的Value值加1 */ static int Succ( int Value, Queue Q ) { if( ++Value == Q->Capacity )//指针value加1后返回,如果加1后等于容量了返回0 Value = 0; return Value; } /* 元素X入Q队 */ void Enqueue( ElementType X, Queue Q ) { if( IsFull( Q ) ) Error( "Full queue" ); else { // 请在此添加代码,完成入队操作 /********** Begin *********/ /********** End **********/ } } /* END */ /* 取队首元素 */ ElementType Front( Queue Q ) { if( !IsEmpty( Q ) ) return Q->Array[ Q->Front ];//返回队头元素值 Error( "Empty queue" ); return 0; /* Return value used to avoid warning */ } /* 出队,不保存出队元素 */ void Dequeue( Queue Q ) { if( IsEmpty( Q ) ) Error( "Empty queue" ); else { // 请在此添加代码,完成出队操作 /********** Begin *********/ /********** End **********/ } } /* 队首的元素出队后保存在变量X中可返回 */ ElementType FrontAndDequeue( Queue Q ) { ElementType X = 0; if( IsEmpty( Q ) ) Error( "Empty queue" ); else { Q->Size--; X = Q->Array[ Q->Front ];//队头元素放入X后被返回 Q->Front = Succ( Q->Front, Q ); } return X; } /* 测试主函数 */ main( ) { Queue Q; int i; Q = CreateQueue( 12 ); //创建队列 printf("第一次入队(0~9):\n"); for( i = 0; i < 10; i++ ) //0到9入列 // 请在此添加代码,调用函数完成入队操作 /********** Begin *********/ /********** End **********/ printf("出队,即入队元素有:\n"); while( !IsEmpty( Q ) ) //遍历出队元素 { printf( "%d ", Front( Q ) ); Dequeue( Q ); } printf( "\n"); printf("第二次入队(0,3,6,9):\n"); for( i = 0; i < 10; i+=3 ) //0到9中3的倍数入列 Enqueue( i, Q ); printf( "\n"); printf("出队,即入队元素有:\n"); while( !IsEmpty( Q ) ) //创建队列 { printf( "%d ", Front( Q ) ); // 请在此添加代码,调用函数完成出队操作 /********** Begin *********/ /********** End **********/ } printf( "\n"); DisposeQueue( Q ); //销毁队列 return 0; }
最新发布
11-19
<think> 根据用户需求,我们需要补全队列基本操作(数组实现)的C语言代码。我们将实现一个循环队列,因为数组实现的队列如果不使用循环,会出现“假溢出”问题。循环队列通过模运算实现队列头尾指针的循环移动。 循环队列的基本操作包括: 1. 初始化队列 2. 判断队列是否为空 3. 判断队列是否为满 4. 入队操作 5. 出队操作 注意:循环队列中,我们通常认为队头指针front指向队头元素的前一个位置,队尾指针rear指向队尾元素。但也可以有其他设计,这里我们采用常见的:队头指针front指向队头元素,队尾指针rear指向队尾元素的下一个位置。 队列判空条件:front == rear 队列判满条件:(rear+1) % MaxSize == front (此时队列中有一个空位,我们牺牲一个存储单元来区分队空队满) 我们使用数组实现,定义如下: ```c #define MaxSize 50 // 队列的最大容量 typedef int ElemType; // 队列元素类型 typedef struct { ElemType data[MaxSize]; int front; // 队头指针 int rear; // 队尾指针 } SqQueue; ``` 现在补全各个函数: 1. 初始化队列:将frontrear都置为02. 判断队列为空:front等于rear。 3. 判断队列为满:(rear+1) % MaxSize == front 4. 入队操作:先判断队列是否满,不满则将元素放入rear位置,然后rear=(rear+1)%MaxSize。 5. 出队操作:先判断队列是否空,不空则取出front位置的元素,然后front=(front+1)%MaxSize。 下面我们按照要求补全代码: ```c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MaxSize 50 typedef int ElemType; typedef struct { ElemType data[MaxSize]; int front; int rear; } SqQueue; // 初始化队列 void InitQueue(SqQueue *Q) { Q->front = 0; Q->rear = 0; } // 判断队列是否为空 bool QueueEmpty(SqQueue Q) { if (Q.front == Q.rear) return true; else return false; } // 判断队列是否满 bool QueueFull(SqQueue Q) { if ((Q.rear + 1) % MaxSize == Q.front) return true; else return false; } // 入队 bool EnQueue(SqQueue *Q, ElemType x) { if (QueueFull(*Q)) { // 队满 return false; } Q->data[Q->rear] = x; Q->rear = (Q->rear + 1) % MaxSize; // 循环队列 return true; } // 出队 bool DeQueue(SqQueue *Q, ElemType *x) { if (QueueEmpty(*Q)) { // 队空 return false; } *x = Q->data[Q->front]; Q->front = (Q->front + 1) % MaxSize; return true; } int main() { SqQueue Q; InitQueue(&amp;Q); int x; // 测试入队 for (int i = 0; i < 10; i++) { EnQueue(&amp;Q, i); } // 测试出队 while (!QueueEmpty(Q)) { DeQueue(&amp;Q, &amp;x); printf("%d ", x); } printf("\n"); return 0; } ``` 注意:这里我们使用了`stdbool.h`来使用bool类型。如果没有这个头文件,可以用int代替。 以上代码实现了循环队列的基本操作。在入队出队时,通过模运算实现循环。我们牺牲了一个存储单元来区分队满队空。 §§相关问题§§ 1. 如何计算循环队列中元素的个数? 2. 如果不牺牲一个存储单元,如何区分队空队满? 3. 循环队列在操作系统中有哪些应用? </think> # 队列基本操作(数组实现)的C语言代码补全 下面是补全后的队列基本操作(数组实现)的C语言代码,包括队列初始化、判空、判满、入队出队等操作: ```c #include <stdio.h> #include <stdbool.h> #define MAX_SIZE 50 // 定义队列最大容量 typedef struct { int data[MAX_SIZE]; // 存储队列元素的数组 int front; // 队头指针 int rear; // 队尾指针 } Queue; // 初始化队列 Queue* CreateQueue(int size) { Queue* q = (Queue*)malloc(sizeof(Queue)); if (q != NULL) { q->front = 0; q->rear = 0; } return q; } // 判断队列是否为空 bool IsEmpty(Queue* Q) { /********** Begin *********/ return Q->front == Q->rear; /********** End *********/ } // 判断队列是否已满 bool IsFull(Queue* Q) { /********** Begin *********/ return (Q->rear + 1) % MAX_SIZE == Q->front; /********** End *********/ } // 获取队头元素 int Front(Queue* Q) { /********** Begin *********/ if (IsEmpty(Q)) { printf("队列为空!\n"); return -1; // 错误值 } return Q->data[Q->front]; /********** End *********/ } // 入队操作 void Enqueue(int x, Queue* Q) { /********** Begin *********/ if (IsFull(Q)) { printf("队列已满!\n"); return; } Q->data[Q->rear] = x; Q->rear = (Q->rear + 1) % MAX_SIZE; // 循环队列 /********** End *********/ } // 出队操作 void Dequeue(Queue* Q) { /********** Begin *********/ if (IsEmpty(Q)) { printf("队列为空!\n"); return; } Q->front = (Q->front + 1) % MAX_SIZE; // 循环队列 /********** End *********/ } // 销毁队列 void DisposeQueue(Queue* Q) { free(Q); } // 主函数用于测试 int main() { Queue* Q = CreateQueue(12); // 创建队列 int i; printf("第一次入队(0~9):\n"); for(i = 0; i < 10; i++) { Enqueue(i, Q); // 入队操作 } printf("出队,即入队元素有:\n"); while(!IsEmpty(Q)) { printf("%d ", Front(Q)); Dequeue(Q); // 出队操作 } printf("\n"); printf("第二次入队(0,3,6,9):\n"); for(i = 0; i < 10; i += 3) { Enqueue(i, Q); } printf("\n"); printf("出队,即入队元素有:\n"); while(!IsEmpty(Q)) { printf("%d ", Front(Q)); Dequeue(Q); // 出队操作 } printf("\n"); DisposeQueue(Q); // 销毁队列 return 0; } ``` ## 代码说明 ### 1. 循环队列的实现原理 我使用了**循环队列**实现,通过模运算(`%`)实现队列的循环利用[^2]。关键点: - `front`指向队头元素 - `rear`指向队尾元素的下一个位置 - 队列满的条件:`(rear + 1) % MAX_SIZE == front` - 队列空的条件:`front == rear` ### 2. 各函数功能说明 1. **`CreateQueue`**:初始化队列,设置`front``rear`为0 2. **`IsEmpty`**:检查队列是否为空(`front == rear`) 3. **`IsFull`**:检查队列是否已满(`(rear + 1) % MAX_SIZE == front`) 4. **`Front`**:获取队头元素(不删除) 5. **`Enqueue`**:元素入队,更新`rear`指针 6. **`Dequeue`**:元素出队,更新`front`指针 ### 3. 循环队列的优势 循环队列解决了数组实现队列时的"假溢出"问题[^2],通过模运算实现了队列空间的循环利用,提高了空间利用率。 ## 输出结果示例 ``` 第一次入队(0~9): 出队,即入队元素有: 0 1 2 3 4 5 6 7 8 9 第二次入队(0,3,6,9): 出队,即入队元素有: 0 3 6 9 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超翔之逸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值