1. 程式人生 > >蘇嵌學習日誌day3

蘇嵌學習日誌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;