• 自己的Queue


    /*
     * Queue サンプル
     *
     *  2004.12.08 
     *
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct _LIST{
        int data;
        struct _LIST *next;
    }LIST;
    
    LIST *NodeAlloc(void);
    void NodeFree(LIST *Node);
    void HeadInsert(LIST **Head, LIST *Node);
    void TailInsert(LIST **Head, LIST *Node);
    void DeleteNode(LIST **Head, int Position);
    
    int GetNodeTotal(LIST **Head);
    LIST *GetNode(LIST **Head, int n);
    
    int main(void)
    {
        LIST *p, *wp;
        LIST *head;
        int w, in, data;
    
        head = (LIST *)NULL;
    
        for(;;){
            printf(" 1.キューに入れる
    ");
            printf(" 2.キューから取り出す
    ");
            printf(" 3.キューに連続で入れる -1で終了
    ");
            printf(" 4.全データ表示
    ");
            printf(" 5.要素の数
    ");
            printf("-1.終了
    ");
            printf("
    ");
            printf("Input Number >> ");
    
            scanf("%d", &in);
            if(in == -1)
                break;
            
            switch(in){
                case 1:
                    printf("Data   >> ");
                    scanf("%d", &data);
                    p = NodeAlloc();
                    p->data = data;
                    TailInsert(&head, p);
                    printf("入れました >> %d
    ", p->data);
                    break;
    
                case 2:
                    w=1;                            /* 先頭を指定 */
                    p=GetNode(&head, w);
                    if(p!=(LIST *)NULL){
                        printf("取り出しました >> %d
    ", p->data);
                        DeleteNode(&head, w);
                    }else{
                        printf("取り出すデータはありません");
                    }
                    printf("
    ");
                    break;
    
                case 3:
                    for(;;){
                        printf("Data >> ");
                        scanf("%d", &data);
                        if(data==-1)break;
    
                        p = NodeAlloc();
                        p->data = data;
    
                        TailInsert(&head, p);
                    }
                    break;
                case 4:
                    printf("
    View All Data
    ");
                    w=1;
                    while((p=GetNode(&head, w))!=(LIST *)NULL){
                        printf("%2d >> %d
    ", w, p->data);
                        w++;
                    }
                    printf("
    ");
                    break;
                case 5:
                    printf("
    要素の数 >> %d個
    ", GetNodeTotal(&head));
                    break;
                default:
                    break;
            }
            printf("
    ");
        }
    
        for(p=head; p!=(LIST *)NULL; p = wp){
            wp = p->next;
            NodeFree(p);
        }
        return 0;
    }
    
    /*
     * リストの先頭にNodeを追加
     */
    
    void HeadInsert(LIST **Head, LIST *Node)
    {
          /* データを追加 */
        Node->next = *Head;
        *Head = Node;
    }
    
    /*
     * リストの最後にNodeを追加
     */
    
    void TailInsert(LIST **Head, LIST *Node)
    {
        LIST *p;
        
        if(*Head == (LIST *)NULL){ /* リストにデータが無い場合、先頭に追加 */
            HeadInsert(Head, Node);
        }else{
            for(p=*Head; p->next!=(LIST *)NULL; p=p->next); /* リストの最後を検索 */
    
              /* データを追加 */
            p->next = Node;
            Node->next = NULL;
        }
    }
    
    /*
     * リスト内のNodeを削除
     */
    
    void DeleteNode(LIST **Head, int Position)
    {
        LIST *p, *Node;
    
        Position--;                                   /* 削除位置の一つ前にする */
    
        if(*Head != (LIST *)NULL){                    /* LISTが存在しないなら終了 */
            if(Position==0){                          /* 削除位置が先頭なら解放 */
                p=*Head;
                *Head = p->next;
                NodeFree(p);
            }else if(GetNodeTotal(Head)>Position && Position>0){   /* 削除位置がList内なら */
                p=GetNode(Head, Position);            /* 削除位置のNodeを取得 */
                Node = p->next;                       /* Nodeを解放する */
                p->next = Node->next;
                NodeFree(Node);
            }
        }
    }
    
    /*
     * Nodeを確保する
     */
    
    LIST *NodeAlloc(void)
    {
        return (LIST *)malloc(sizeof(LIST));
    }
    
    /*
     * Nodeを解放する
     */
    
    void NodeFree(LIST *Node)
    {
        free(Node);
    }
    
    /*
     * Nodeの総数を取得
     */
    
    int GetNodeTotal(LIST **Head)
    {
        LIST *p;
        int n=0;
        
        for(p=*Head; p!=(LIST *)NULL; p=p->next)    /* NULLが出るまで、ノードをカウント */
            n++;
    
        return n;
    }
    
    /*
     * Nodeのデータを取得
     */
    
    LIST *GetNode(LIST **Head, int n)
    {
        int j=1;
        LIST *p;
    
        for(p=*Head; p!=(LIST *)NULL; p=p->next){    /* NULLが出るか、n番目のノードを取得するまでループ */
            if(j==n)break;
            j++;
        }
        
        return p;
    }
    http://www.daccho-it.com/program/algo/queue.c
  • 相关阅读:
    mysql中profile的使用
    6、MySQL索引种类
    MySql事务
    MySQL视图(view)
    MySql数据库命令基本操作
    2、MySQL常见数据库引擎及比较?
    1、列举常见的关系型数据库和非关系型都有那些?
    Python中的顺序表
    双端队列
    手持移动端特殊链接:打电话,发短信,发邮件
  • 原文地址:https://www.cnblogs.com/kire/p/6731596.html
Copyright © 2020-2023  润新知