题目:输入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);//读出链表 }