实现基数排序,
我感觉代码逻辑没有问题,各位大佬能帮忙看一下是哪里出错了
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<stdbool.h>
typedef int ElemType;
typedef struct LinkNode{
ElemType data;
struct LinkNode *next;
}LNode,*LinkList;
typedef struct{
LNode *front,*rear;
}LinkQueue;
LinkList Input(LinkList L);
void Gather(LinkList L,LinkQueue *Q);
void Allocation(LinkList L,int count,LinkQueue *Q);
void Output(LinkList L);
int main(){
//创建辅助队列
LinkQueue Q[9];
printf("Q:%d\n",sizeof(Q));
LinkList L;//L就是地址,相当于p,函数中也不需要加* ,此处仅声明了指针,并没有分配内存,故需返回
int base=3;//基数,相当于需要几轮排序
L = Input(L);
for(int i=0;i<=9;i++){//初始化队列
Q[i].front=Q[i].rear=NULL;
printf("%d\n",Q[i].front);
}
for(int i=1;i<=base;i++){
printf("开始") ;
Allocation(L,i,Q);
Gather(L,Q);
}
Output(L);
}
LinkList Input(LinkList L){//输入函数
//创建带头结点的单链表
LNode *s;int x;
L= (LinkList)malloc(sizeof(LNode));//建立头结点
L->next = NULL;
printf("L:%d\n",sizeof(L));
scanf("%d",&x);
while(x!=9999){
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d",&x);
}
return L;
}
void Output(LinkList L){
printf("输出:");
LNode *q;//遍历结点
q = L->next;
while(q!=NULL){
printf("%d,",q->data);
q = q->next;
}
}
void Allocation(LinkList L,int count,LinkQueue *Q){//count 表示元素的阶如999:阶3//Q[]相当于新的队列了,应该用指针
LNode *p;//遍历结点
p = L->next;
printf("%d",p);
int num = pow(10,count);//用来取余比较基的大小
printf("%d\n",num);
while(p!=NULL){
int ji = (p->data)%num ;//本次当前元素的基
if(Q[ji].front==NULL){
Q[ji].front = p;
Q[ji].rear = p;
}
else{
(Q[ji].rear)->next = p;
Q[ji].rear = p;//尾指针后移
}
p = p->next;
}
}
void Gather(LinkList L,LinkQueue *Q){
LNode *p,*q;//保存收集元素的首结点(第一个不为空的队列)q用来表示当前队列的尾指针指向结点
int flag;//表示第一个元素所在队列
for(int i=0;i<9;i++){//找到首元素所在队列
if(Q[i].front!=NULL){
p = Q[i].front;
q = Q[i].rear;
// flag = i;
Q[i].front= NULL;
Q[i].rear = NULL;//不用flag了
break;
}
for(int i=0;i<10;i++){
if(Q[i].front!=NULL){//跳过了第一个元素所在结点
q->next = Q[i].front;
q = Q[i].rear;
Q[i].front=NULL;
Q[i].rear = NULL;//首尾指针指空
}
}
L->next = p;//将p链接到L
}
}