蘇嵌學習日誌day3
name:錢成傑 date:2018.9.12 今日學習任務 複習棧和佇列的相關知識點,佇列的順序是先進先出,學習順序儲存和鏈式儲存 今日任務完成情況 能跟上老師的程式設計節奏,對於鏈式與順序儲存有了初步的瞭解。 今日開發中出現的問題彙總 瞭解佇列是從隊尾存放資料,隊頭取出資料。 空隊:對頭隊尾重合 隊尾指標:指向最後一個元素的後一個(n-1) 迴圈佇列的長度:(rear –front +MAXSIZE)%MAXSIZE 如:7%5 取整=1; 5%7取餘=5;取整=0; 判斷棧是否滿:(rear+1)%MAXSIZE=front 注意: 在queue.c中所寫的如下程式的標頭檔案必須在queue.h中加上且必須加分號(;) 如:int InitQueue(Q *q); //queue中複製貼上 int DelQueue(Q *q); int lenthQueue(Q q); int ClearQueue(Q *q); int DestoryQueue(Q *q); int EnterQueue(Q *q,int e); 最後編譯程式碼為:gcc *.c -Wall
在虛擬機器中建立: 計算機—>檔案系統—>home資料夾—>建立資料夾(queue)—>建立文件—>文件編輯器(開啟文件) 指標分為:資料域 + 指標域 今日未解決問題 對於棧與佇列的程式設計還是模糊。 今日開發收穫 學會了鏈式與順序的程式設計方法,進棧,出棧,銷燬,空棧,長度等的計算。 自我評價 跟上老師的節奏是最大的收穫。
課堂訓練: 順序儲存: queue.h ifndef QUEUE_H define QUEUE_H
define MAXSIZE 10 //佇列的容量 define SUCCESS 1000 define FAILURE 1001 struct queue { int *data; //指向佇列的儲存空間 int front; int rear; }; typedef struct queue Q;
int InitQueue(Q *q); //queue中複製貼上
int DelQueue(Q *q);
int lenthQueue(Q q);
int ClearQueue(Q *q);
int DestoryQueue(Q *q);
int EnterQueue(Q *q,int e);
#endif
Main.c include”stdio.h” include”queue.h”
int main() { int ret,i; Q queue; // 定義佇列
ret =InitQueue(&queue); if(SUCCESS==ret) { printf(“Init Success!\n”); } else { printf(“Init Failure!\n”); } for(i=0;i<10;i++) { ret =EnterQueue(&queue, i+1); if(ret==FAILURE) { printf(“Enter Failure!\n”); } else { printf(“Enter %d Success!\n”,i+1); } }
for(i=0;i<5;i++) { ret =DelQueue(&queue); if(ret==FAILURE) { printf(“Delete Failure!\n”); } else {printf(“Delete %d Success!\n”,ret);
}
}
ret =lenthQueue(queue);
printf("length is %d\n",ret);
ret = ClearQueue(&queue);
if(ret == SUCCESS)
{
printf("Clear Success!\n");
}
else
{
printf("Clear Failure!\n");
}
ret=DestoryQueue(&queue);
if(ret==SUCCESS)
{
printf("Destory Success!\n");
}
else
{
printf("Destory Failure!\n");
}
return 0; }
queue.c include”queue.h” include”stdlib.h”
int InitQueue(Q *q) { if(NULL==q) //入參判斷 { return FAILURE; }
//申請一塊記憶體空間,並且讓data指標指向這塊空間
q->data =(int *)malloc(sizeof(int)*MAXSIZE);
if(NULL==q->data) //返回值判斷
{
return FAILURE;
}
q->rear =q->front =0;
return SUCCESS;
}
int EnterQueue(Q *q, int e) { if(NULL==q) { return FAILURE; } if((q->rear+1)%MAXSIZE==q->front) //隊滿 { return FAILURE; } q->data[q->rear]=e; q->rear =(q->rear+1)%MAXSIZE;
return SUCCESS;
}
int DelQueue(Q *q)
{
if(NULL==q)
{
return FAILURE;
}
if(q->rear==q->front) //空隊
{
return FAILURE;
}
int e=q->data[q->front];
q->front =(q->front+1)%MAXSIZE;
return e;
}
int lenthQueue(Q q)
{
return (q.rear - q.front + MAXSIZE)%MAXSIZE;
}
int ClearQueue(Q *q)
{
if(NULL==q)
{
return FAILURE;
}
q->rear = q->front;
return SUCCESS;
}
int DestoryQueue(Q *q)
{
if(NULL==q)
{
return FAILURE;
}
free(q->data);
q->data=NULL;
return SUCCESS;
}
鏈式儲存: queue.h ifndef QUEUE_H define QUEUE_H
define SUCCESS 1000
define FAILURE 1001
struct mode //結點的資訊 { int data; //資料域 struct mode *next; //指標域 }; typedef struct mode Node;
struct queue //佇列的資訊 { Node *front; //隊頭指標 Node *rear; //隊尾指標 };
typedef struct queue Q;
int InitQueue(Q **q); int EnterQueue(Q *q, int e); int DeleteQueue(Q *q); int lengthQueue(Q *q); int ClearQueue(Q *q); int EmptQueue(Q *q); int DestoryQueue(Q **q); endif Main.c include”queue.h” include”stdio.h”
int main() { int ret,i; Q *queue;
ret =InitQueue(&queue);
if(ret==SUCCESS)
{
printf("Init Success!\n");
}
else
{
printf("Init Failure!\n");
}
for(i=0;i<5;i++)
{
ret=EnterQueue(queue,i+1);
if(ret ==SUCCESS)
{
printf("Enter %d Success!\n");
}
else
{
printf("Enter Failure!\n");
}
}
for(i=0;i<10;i++)
{
ret=DeleteQueue(queue);
if(ret==FAILURE)
{
printf("Delete Failure!\n");
}
else
{
printf("Delete %d Success!\n");
}
}
ret=lengthQueue(queue);
printf("length is %d\n",ret);
ret =ClearQueue(queue);
if(ret==SUCCESS)
{
printf("Clear %d Success!\n");
}
else
{
printf("Clear Failure!\n");
}
ret=lengthQueue(queue);
printf("length is %d\n",ret);
ret =EmptQueue(queue);
if(SUCCESS==ret)
{
printf("queue is empty !\n");
}
else
{
printf("queue is not empty!\n");
}
ret=DestoryQueue(&queue);
if(ret==SUCCESS)
{
printf("Destory Success!\n");
}
else
{
printf("Destory Failure!\n");
}
return 0; }
queue.c
include “queue.h”
include “stdlib.h”
int InitQueue(Q **q) { if(NULL==q) //入參判斷 { return FAILURE; } (q)=(Q )malloc(sizeof(Q)); //給佇列資訊申請空間
if(NULL==(*q))
{
return FAILURE;
}
Node *p=(Node*)malloc(sizeof(Node)); //頭結點申請空間
if(NULL==p)
{ return FAILURE; }
(*q)->front =(*q)->rear=p; //隊頭指標 對尾指標都指向頭結點 return SUCCESS;
}
int EnterQueue(Q *q, int e)
{
if(NULL==q)
{
return FAILURE;
}
Node *p =(Node *)malloc(sizeof(Node));
if(NULL==p)
{
return FAILURE;
}
p->next =NULL;
p->data =e;
q->rear->next =p;
q->rear=p;
return SUCCESS;
}
int DeleteQueue(Q *q)
{
if(NULL==q)
{
return FAILURE;
}
if(q->rear=q->front) //空隊
{
return FAILURE;
}
Node *p =q->front->next;
int e=p->data;
q->front->next=p->next;
free(p);
if(q->rear==p) //只剩一個結點的情況
{
q->rear =q->front;
}
return e;
}
int lengthQueue(Q *q)
{
if(NULL==q)
{
return FAILURE;
}
int length =0;
Node *p =q->front->next;
while(p) //while(p!=NULL)
{
length++;
p=p->next;
}
return length;
}
int ClearQueue(Q *q)
{
if(NULL==q) //入參判斷
{
return FAILURE;
}
Node *p=q->front->next;
while (p)
{
q->front->next=p->next;
free(p); //釋放結點
p=q->front->next; //指向新的結點
}
q->rear=q->front; //刪完所有結點 隊尾指標指向開頭
return SUCCESS;
}
int EmptQueue(Q *q)
{
if(NULL==q) //清空佇列
{
return FAILURE;
}
return (q->front==q->rear)?SUCCESS:FAILURE;
}
int DestoryQueue(Q **q) //銷燬
{
if(NULL==q)
{
return FAILURE;
}
free((*q)->front);
free (*q);
*q=NULL;
return SUCCESS;