队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
链队列:链队列顾名思义就是以链表的结构实现的队列
代码:#include一些问题:#include typedef struct LinkNode { int data; LinkNode* next; }*LinkNodePtr; typedef struct LinkQueue { LinkNodePtr front; LinkNodePtr rear; }*LinkQueuePtr; LinkQueuePtr initQueue() { LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(struct LinkQueue)); //队列的第一个结点,数据不存在这里面,只是用来牵起整条队列 LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(struct LinkQueue)); headerPtr->next = NULL; resultPtr->front = headerPtr; resultPtr->rear = headerPtr; return resultPtr; } void outputLinkQueue(LinkQueuePtr paraQueuePtr) { LinkNodePtr tempPtr = paraQueuePtr->front->next; while (tempPtr != NULL) { printf("%d ", tempPtr->data); tempPtr = tempPtr->next; } printf("rn"); } void enqueue(LinkQueuePtr paraQueuePtr, int paraElement) { //Step 1. 创建一个新的结点 LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(struct LinkNode)); tempNodePtr->data = paraElement; tempNodePtr->next = NULL; //Step 2. 连接到上一个结点 paraQueuePtr->rear->next = tempNodePtr; //Step 3. 改变队尾 paraQueuePtr->rear = tempNodePtr; }//Of enqueue int dequeue(LinkQueuePtr paraQueuePtr) { int resultValue; LinkNodePtr tempNodePtr; //Step 1. 检查队列是否为空 if (paraQueuePtr->front == paraQueuePtr->rear) { printf("The queue is empty.rn"); return -1; } //Step 2.出队操作 tempNodePtr = paraQueuePtr->front->next; resultValue = tempNodePtr->data; paraQueuePtr->front->next = paraQueuePtr->front->next->next; if (paraQueuePtr->rear == tempNodePtr) { paraQueuePtr->rear = paraQueuePtr->front; }//Of if //Step 3. 释放空间 tempNodePtr = NULL; //Step 4. 返回数据 return resultValue; } void testLinkQueue() { LinkQueuePtr tempQueuePtr; tempQueuePtr = initQueue(); enqueue(tempQueuePtr, 10); enqueue(tempQueuePtr, 30); enqueue(tempQueuePtr, 50); outputLinkQueue(tempQueuePtr); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); enqueue(tempQueuePtr, 8); outputLinkQueue(tempQueuePtr); } int main() { testLinkQueue(); return 0; }
- 运行过程中,哪些变量分配在相邻的空间?
- 局部变量的空间能否重复利用?举例说明。
- 指针的地址和值的区别是什么?
1.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
2.可以,循环链表就是。
3.地址即钥匙,值是钥匙对应区域存放的值。
循环队列:循环队列可以很好的解决假溢出的问题
代码:#include#include #define TOTAL_SPACE 5 typedef struct CircleIntQueue { int data[TOTAL_SPACE]; int head; int tail; }*CircleIntQueuePtr; CircleIntQueuePtr initQueue() { CircleIntQueuePtr resultPtr = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue)); resultPtr->head = 0; resultPtr->tail = 0; return resultPtr; } void enqueue(CircleIntQueuePtr paraPtr, int paraValue) { if ((paraPtr->tail + 1) % TOTAL_SPACE == paraPtr->head) { printf("Queue full.rn"); return; } paraPtr->data[paraPtr->tail % TOTAL_SPACE] = paraValue; paraPtr->tail++; } int dequeue(CircleIntQueuePtr paraPtr) { int resultValue; if (paraPtr->head == paraPtr->tail) { printf("No element in the queue.rn"); return -1; } resultValue = paraPtr->data[paraPtr->head % TOTAL_SPACE]; paraPtr->head++; return resultValue; } void outputLinkQueue(CircleIntQueuePtr paraPtr) { int i; if (paraPtr->head == paraPtr->tail) { printf("Empty queue."); return; } printf("Elements in the queue: "); for (i = paraPtr->head; i < paraPtr->tail; i++) { printf("%d, ", paraPtr->data[i % TOTAL_SPACE]); } printf("rn"); } void testLinkQueue() { int i = 10; CircleIntQueuePtr tempPtr = initQueue(); for (; i < 16; i ++) { enqueue(tempPtr, i); } outputLinkQueue(tempPtr); for (i = 0; i < 6; i ++) { printf("dequeue gets %drn", dequeue(tempPtr)); } enqueue(tempPtr, 8); outputLinkQueue(tempPtr); } int main() { testLinkQueue(); return 0; }



