C 节点\加载项队列,仅插入前3个,如前、后和中
我的insert函数对于空队列、前后相等的队列和一个以上的队列工作良好。在那之后,似乎有一个逻辑错误。我只有2个小时来提交这个 用于测试升序和降序的输出 测试上升队列 插入:42 17-12 9982 476 2912-22 3291213 7782C 节点\加载项队列,仅插入前3个,如前、后和中,c,linked-list,queue,logic,abstract-data-type,C,Linked List,Queue,Logic,Abstract Data Type,我的insert函数对于空队列、前后相等的队列和一个以上的队列工作良好。在那之后,似乎有一个逻辑错误。我只有2个小时来提交这个 用于测试升序和降序的输出 测试上升队列 插入:42 17-12 9982 476 2912-22 3291213 7782 void que_insert( QueueADT queue, void *data ) { struct node *temp; temp = (struct node*)malloc(sizeof(struct node));
void que_insert( QueueADT queue, void *data ) {
struct node *temp;
temp = (struct node*)malloc(sizeof(struct node));
temp->data= data;
node *currNode;
//currNode = (struct node*)malloc(sizeof(struct node));
currNode = queue->front;
//cmp = &(queue->cmprFunc);
if ( queue->front != NULL ) {
if ( queue->cmprFunc == NULL ) { //if the cmp_func is FIFO
queue->rear->next = temp;
queue->rear= temp;
queue->rear->next=NULL;
if ( queue->front == queue->rear ) {
currNode->next = temp;
queue->rear = temp;
temp->next= NULL;
}
} else {
while ( currNode->next != NULL ){
if (( (*(queue->cmprFunc))(currNode->next->data, temp->data) < 0 ) ||
((*(queue->cmprFunc))(currNode->next->data, temp->data) == 0 ) ) {
temp->next = currNode->next;
currNode->next = temp;
break;
} else {
currNode = currNode->next;
if (currNode->next != NULL ) {
currNode->next = temp;
queue->rear = temp;
temp->next = NULL;
}
//exit_failure
}
}
if ( queue->front == queue->rear ) {
if (( (*(queue->cmprFunc))(currNode->data, temp->data) < 0 ) ||
((*(queue->cmprFunc))(currNode->data, temp->data) == 0 ) ) {
queue->rear = temp;
queue->front->next = queue->rear;
temp->next= NULL;
} else {
queue->front = temp;
temp->next = temp;
}
}
//printf("Front is equal to next %i\n", (queue->front == queue->rear));
}
} else { //( queue->front == NULL )
queue->front = temp;
queue->rear= queue->front;
queue->front->next= queue->rear->next = NULL;
}
}
拆卸:17 3291213 7782
void que_insert( QueueADT queue, void *data ) {
struct node *temp;
temp = (struct node*)malloc(sizeof(struct node));
temp->data= data;
node *currNode;
//currNode = (struct node*)malloc(sizeof(struct node));
currNode = queue->front;
//cmp = &(queue->cmprFunc);
if ( queue->front != NULL ) {
if ( queue->cmprFunc == NULL ) { //if the cmp_func is FIFO
queue->rear->next = temp;
queue->rear= temp;
queue->rear->next=NULL;
if ( queue->front == queue->rear ) {
currNode->next = temp;
queue->rear = temp;
temp->next= NULL;
}
} else {
while ( currNode->next != NULL ){
if (( (*(queue->cmprFunc))(currNode->next->data, temp->data) < 0 ) ||
((*(queue->cmprFunc))(currNode->next->data, temp->data) == 0 ) ) {
temp->next = currNode->next;
currNode->next = temp;
break;
} else {
currNode = currNode->next;
if (currNode->next != NULL ) {
currNode->next = temp;
queue->rear = temp;
temp->next = NULL;
}
//exit_failure
}
}
if ( queue->front == queue->rear ) {
if (( (*(queue->cmprFunc))(currNode->data, temp->data) < 0 ) ||
((*(queue->cmprFunc))(currNode->data, temp->data) == 0 ) ) {
queue->rear = temp;
queue->front->next = queue->rear;
temp->next= NULL;
} else {
queue->front = temp;
temp->next = temp;
}
}
//printf("Front is equal to next %i\n", (queue->front == queue->rear));
}
} else { //( queue->front == NULL )
queue->front = temp;
queue->rear= queue->front;
queue->front->next= queue->rear->next = NULL;
}
}
测试下行队列
插入:42 17-12 9982 476 2912-22 3291213 7782
void que_insert( QueueADT queue, void *data ) {
struct node *temp;
temp = (struct node*)malloc(sizeof(struct node));
temp->data= data;
node *currNode;
//currNode = (struct node*)malloc(sizeof(struct node));
currNode = queue->front;
//cmp = &(queue->cmprFunc);
if ( queue->front != NULL ) {
if ( queue->cmprFunc == NULL ) { //if the cmp_func is FIFO
queue->rear->next = temp;
queue->rear= temp;
queue->rear->next=NULL;
if ( queue->front == queue->rear ) {
currNode->next = temp;
queue->rear = temp;
temp->next= NULL;
}
} else {
while ( currNode->next != NULL ){
if (( (*(queue->cmprFunc))(currNode->next->data, temp->data) < 0 ) ||
((*(queue->cmprFunc))(currNode->next->data, temp->data) == 0 ) ) {
temp->next = currNode->next;
currNode->next = temp;
break;
} else {
currNode = currNode->next;
if (currNode->next != NULL ) {
currNode->next = temp;
queue->rear = temp;
temp->next = NULL;
}
//exit_failure
}
}
if ( queue->front == queue->rear ) {
if (( (*(queue->cmprFunc))(currNode->data, temp->data) < 0 ) ||
((*(queue->cmprFunc))(currNode->data, temp->data) == 0 ) ) {
queue->rear = temp;
queue->front->next = queue->rear;
temp->next= NULL;
} else {
queue->front = temp;
temp->next = temp;
}
}
//printf("Front is equal to next %i\n", (queue->front == queue->rear));
}
} else { //( queue->front == NULL )
queue->front = temp;
queue->rear= queue->front;
queue->front->next= queue->rear->next = NULL;
}
}
拆卸:42-22 7782
测试FIFO队列
插入:42 17-12 9982 476 2912-22 3291213 7782
void que_insert( QueueADT queue, void *data ) {
struct node *temp;
temp = (struct node*)malloc(sizeof(struct node));
temp->data= data;
node *currNode;
//currNode = (struct node*)malloc(sizeof(struct node));
currNode = queue->front;
//cmp = &(queue->cmprFunc);
if ( queue->front != NULL ) {
if ( queue->cmprFunc == NULL ) { //if the cmp_func is FIFO
queue->rear->next = temp;
queue->rear= temp;
queue->rear->next=NULL;
if ( queue->front == queue->rear ) {
currNode->next = temp;
queue->rear = temp;
temp->next= NULL;
}
} else {
while ( currNode->next != NULL ){
if (( (*(queue->cmprFunc))(currNode->next->data, temp->data) < 0 ) ||
((*(queue->cmprFunc))(currNode->next->data, temp->data) == 0 ) ) {
temp->next = currNode->next;
currNode->next = temp;
break;
} else {
currNode = currNode->next;
if (currNode->next != NULL ) {
currNode->next = temp;
queue->rear = temp;
temp->next = NULL;
}
//exit_failure
}
}
if ( queue->front == queue->rear ) {
if (( (*(queue->cmprFunc))(currNode->data, temp->data) < 0 ) ||
((*(queue->cmprFunc))(currNode->data, temp->data) == 0 ) ) {
queue->rear = temp;
queue->front->next = queue->rear;
temp->next= NULL;
} else {
queue->front = temp;
temp->next = temp;
}
}
//printf("Front is equal to next %i\n", (queue->front == queue->rear));
}
} else { //( queue->front == NULL )
queue->front = temp;
queue->rear= queue->front;
queue->front->next= queue->rear->next = NULL;
}
}
拆卸:42 17-12 9982 476 2912-22 3291213 7782
void que_insert( QueueADT queue, void *data ) {
struct node *temp;
temp = (struct node*)malloc(sizeof(struct node));
temp->data= data;
node *currNode;
//currNode = (struct node*)malloc(sizeof(struct node));
currNode = queue->front;
//cmp = &(queue->cmprFunc);
if ( queue->front != NULL ) {
if ( queue->cmprFunc == NULL ) { //if the cmp_func is FIFO
queue->rear->next = temp;
queue->rear= temp;
queue->rear->next=NULL;
if ( queue->front == queue->rear ) {
currNode->next = temp;
queue->rear = temp;
temp->next= NULL;
}
} else {
while ( currNode->next != NULL ){
if (( (*(queue->cmprFunc))(currNode->next->data, temp->data) < 0 ) ||
((*(queue->cmprFunc))(currNode->next->data, temp->data) == 0 ) ) {
temp->next = currNode->next;
currNode->next = temp;
break;
} else {
currNode = currNode->next;
if (currNode->next != NULL ) {
currNode->next = temp;
queue->rear = temp;
temp->next = NULL;
}
//exit_failure
}
}
if ( queue->front == queue->rear ) {
if (( (*(queue->cmprFunc))(currNode->data, temp->data) < 0 ) ||
((*(queue->cmprFunc))(currNode->data, temp->data) == 0 ) ) {
queue->rear = temp;
queue->front->next = queue->rear;
temp->next= NULL;
} else {
queue->front = temp;
temp->next = temp;
}
}
//printf("Front is equal to next %i\n", (queue->front == queue->rear));
}
} else { //( queue->front == NULL )
queue->front = temp;
queue->rear= queue->front;
queue->front->next= queue->rear->next = NULL;
}
}
您的que_插入:
此行至少存在一个问题:
if ( queue->front == queue->rear ) {
您已经将
temp
的值分配给queue->rear
了几行,因此此if测试的计算结果永远不会为true。您需要重新安排分配发生的位置,或者保存旧值以供以后测试,在进行分配之前设置一个标志变量。由于这是家庭作业,您应该自己尝试解决此问题。您是在列表的末尾还是末尾添加新节点?如果是先进先出,我通常会在开头添加节点,但如果比较(currNode,tempData)返回负数,则它会在currNode之前添加。如果compare(currNode,tempData)为正,则应将队列向后移动。我正在阅读本文,但现在必须提交,这可能比我的方法更干净。离开正数!