線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1105
推到 Plurk!
推到 Facebook!

如何在佇列內加上優先順序

尚未結案
metals753
一般會員


發表:7
回覆:3
積分:2
註冊:2005-05-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-23 11:26:58 IP:218.167.xxx.xxx 未訂閱
一個佇列的程式: 分別有1.Enqueue 2.Dequeue 3.Print 現在必需在Enqueue的時候增加一個優先順序(數值越小優先順序越高) 在Dequeue時則會自動先選擇優先順序(seq)->高的先Dequeue出,若一樣則先進先出 我卡在優先順序的地方,不知道該如何寫起...麻煩請各位指導一下...  
#include 
#include 
#include     typedef struct lnode         //佇列的鏈結串列        
{
        int data;
        int seq;
    struct lnode *next;
}node;
node *front,*rear,*p;        //佇列頭尾的宣告    void enqueue(int endata,int seque)     //Enqueue副程式
{
        node *en;                //宣告結構lnode為指標en
        en=(node *)malloc(sizeof(struct lnode));  //en指向與lnode同樣的記憶體空間
        en->data=endata;
        en->seq=seque;
    en->next=NULL;           //將en結構下個鏈結設成NULL
        if(front!=NULL)          //如果首節點不等於NULL
                rear->next=en;       //則將末節點下個鏈結位置設為en
        else                     //首節點等於NULL
                front=en;            //en結構指向首節點
        rear=en;                 //en結構指向末節點
}    void dequeue()               //Dequeue副程式  
{
        int deldata;
        node *del;
        if(front!=NULL)          //當首節點為空的時候
        {
                deldata=front->data; //將首節點的資料傳到變數deldata  
                del=front;           //將front結構位置傳到del
                front=front->next;   //將front的下一個結構傳回蓋過front
                free(del);           //將del位置空間釋放
                //if(front==NULL)
                //rear=NULL;
        printf("Dequeue:%d\n",deldata);
        }
        else 
                printf("佇列空了啦><\n");
            
}    void print()
{
        
        
        p=front;                 //將首節點的位置設為p(p為指標)            if (front!=NULL)
    {
         do
         {
         printf("%d ",p->data); //將p結構內的data印出    
                 p=p->next;          //p指向p的下一個結構
                              }while (p!=NULL);       //"迴圈"直到p=NULL時才跳出
      printf("\n");
        }
                else                                   
          printf("佇列是空的咩!!\n");
}        void main(void)
{
 int N,indata,seq;
 front=rear=NULL;
do
{
 printf("1.Enqueue  2.Dequeue  3.Print  4.Exit\n選擇:");
 scanf("%d",&N);
 switch(N)
 {
 case 1:
         printf("請輸入欲Enqueue的數值: ");
         scanf("%d",&indata);
     printf("請輸入優先順序(數值): ");
     scanf("%d",&seq);
         enqueue(indata,seq);
         break;
 case 2:
         dequeue();
         
         break;
 case 3:
         print();
         break;
 case 4:
         break;
 default:
         printf("輸入錯誤");
         
        
 }
}while (N!=4);
}
 
haman
中階會員


發表:46
回覆:137
積分:56
註冊:2005-03-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-10 04:14:13 IP:211.76.xxx.xxx 未訂閱
基本上你的問題就是排序(一個加了排序的佇列??@@") 在enqueue的時後從頭一一與新加入的值做比對, 若queue中的值小於(或等於)新增的值時,將前一筆資料的next指到新的這筆, 再將新的這筆資料的next指到大於的那一筆 說穿了就是link list中的插入    附上以前寫的link list的插入函數
struct link
{
        struct link *left;
        int value;
        struct link *right;
};
int Insert(link *head,int value,int num)
{
        link *tmp,*ptr;
        ptr=head->right;
        tmp=(link *)malloc(sizeof(link));
        while(ptr->value!=num)
        {
                if(ptr->right==head)
                        return -1;
                else
                        ptr=ptr->right;
        }
        tmp->value=value;
        tmp->right=ptr->right;
        ptr->right=tmp;
        tmp->left=ptr;
        tmp->right->left=tmp;
        return 1;
}
==================================== 懂的不多,卻想學的更多,搞得不自覺的將問題複雜化@@
系統時間:2024-05-11 4:14:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!