zoukankan      html  css  js  c++  java
  • C语言数据结构 头尾指针数组的综合应用

    题目:输入n个10以内的正整数,每输入一个数x(0<=x<10),就把它插入到第x号队列中。最后把10个队中的非空队列,按照队列号从大到小的顺序串接成一条链,并输出改链的所有元素。

    解:

    这里创建两个指针数组,一个是头指针数组qh[],一个为尾指针数组qt[]。例如输入的数字为5时,为5 malloc出一个QNode节点,然后让qh[5]头指针来指向,而qt[5]也指向5这个节点,因为值为5的节点的队列只有一个节点;

    当下一个输入的值也为5的时候,新的节点接到qt[5]指针的后面,让qt[5]指向这个节点;这样以qh[5]为开头的队列就有两个元素了;

    当当前输入的值为1时,创建关于1的节点之后,1这个节点被qh[1]所指向,qt[1]也指向当前的节点,若后续在出现相同的值的节点时,只需要qt[1]来指向就可以了。

    以上是如何创建队列

    下面是连接成为完整的链队:

    创建一个new头节点链队

    使用for循环在指针数组当中走,若发现当前指针有指向,则让new链接上当前队列即可

    代码:(为方便,这里直接规定了输入个数和具体的值)

    #include<stdio.h>
    #include<stdbool.h>
    #include<stdlib.h>
    typedef struct node{
        int data;
        struct node *next;
    }QNode;
    bool insert(QNode *QH[],QNode *QT[],int num)
    {
       if(num>9&&num<0)
           return false;
        QNode *s=(QNode *)malloc(sizeof(QNode));
        s->data=num;
        s->next=NULL;
    
        if(QH[num]==NULL)//若指针无指向
        {
            QH[num]=s;
            QT[num]=s;
        }
        else//若当前指针有指向,则在当前指向之后添加元素
        {
            QT[num]->next=s;//尾部指向s
            QT[num]=s;//尾部移到s处
        }
        return true;
    }
    void creat_queue(QNode *QH[],QNode *QT[])
    {
        int a[10]={1,2,2,1,4,5,6,7,3,0};
        for(int i=0;i<10;i++)
            insert(QH, QT, a[i]);
    }
    void link_list(QNode *qh[],QNode *qt[],QNode *new)
    {
    //    QNode *head=NULL,*tail=NULL;
        QNode *p=new;//头指针为p,p后面接每一个数组的链表
        for(int i=0;i<10;i++)
        {
            if(qh[i]!=NULL)
            {
                p->next=qh[i];
                p=qt[i];
            }
        }
        p->next=NULL;
    }
    void initivate(QNode *a[]){
        for(int i=0;i<10;i++)
            a[i]=NULL;
    }
    void print(QNode *new)
    {
        QNode *p=new->next;
        while(p!=NULL){
            printf("%d	",p->data);
            p=p->next;
        }
        printf("
    ");
    }
    int main(){
        QNode *QH[10];
        QNode *QT[10];
        QNode new={10000,NULL};
        initivate(QH);//初始化两个指针数组
        initivate(QT);
        creat_queue(QH, QT);//创建头指针和为指针,按照题意指向对应的位置
        link_list(QH, QT,&new);//将指针数组所指向的头尾全部串成一个完整的链表
        print(&new);//读出链表
    }
  • 相关阅读:
    Educational Codeforces Round 88 (Rated for Div. 2) D. Yet Another Yet Another Task(枚举/最大连续子序列)
    Educational Codeforces Round 88 (Rated for Div. 2) A. Berland Poker(数学)
    Educational Codeforces Round 88 (Rated for Div. 2) E. Modular Stability(数论)
    Educational Codeforces Round 88 (Rated for Div. 2) C. Mixing Water(数学/二分)
    Codeforces Round #644 (Div. 3)
    Educational Codeforces Round 76 (Rated for Div. 2)
    Educational Codeforces Round 77 (Rated for Div. 2)
    Educational Codeforces Round 87 (Rated for Div. 2)
    AtCoder Beginner Contest 168
    Codeforces Round #643 (Div. 2)
  • 原文地址:https://www.cnblogs.com/oldfish123/p/13718899.html
Copyright © 2011-2022 走看看