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);//读出链表
}
原文地址:https://www.cnblogs.com/oldfish123/p/13718899.html