c -链表-如何尾部插入不移动头节点



所以我遇到了一个问题。我知道那是什么。我只是想不出一个办法来解决这个问题。

首先是尾部插入函数

Status append(MY_QUEUE queue, int item)
{
    Node_ptr temp;
    Head_ptr head = (Head_ptr) queue;
    //create a new node
    temp = (Node_ptr)malloc(sizeof(Node));
    if (temp == NULL) {
        printf("malloc failedn");
        return FAILURE;
    }
    temp->data = item;
    temp->next = NULL;
    if (head->head == NULL){
        head->head = temp;
    }
    else{
        while(head->head->next) {
            head->head = head->head->next;
        }
        head->head->next = temp;
    }
    return SUCCESS;
}
如你所见

。它的简单。如果头节点为空。它将新节点添加到head。如果不是。它一直向前移动,直到到达空,然后再添加节点。这就是问题所在。我移动头节点指针,我不应该这样做。但我似乎想不出别的办法来做这件事。因为我在传递一个MY_QUEUE。我将包括头文件和声明来理解它们是什么。

struct node
{
    int data;
    Node_ptr next;
};
struct head_node;
typedef struct head_node Head_node;
typedef Head_node *Head_ptr;
struct head_node
{
    struct my_queue_public methods;
    Node_ptr head;
};
void destroy(MY_QUEUE queue);
Status append(MY_QUEUE queue, int item);
Status service(MY_QUEUE queue);
int* front(MY_QUEUE queue);
Bool empty(MY_QUEUE stack);
void init_functions(MY_QUEUE queue)
{
    //queue->destroy = destroy;
    queue->empty = empty;
    queue->service = service ;
    queue->append = append;
    queue->front = front;
}
MY_QUEUE my_queue_init_default(void)
{
    Head_ptr head;
    head = malloc(sizeof(Head_node));
    if (head != NULL)
    {
        head->head = NULL;
        init_functions((MY_QUEUE)head);
    }
    return (MY_QUEUE)head;
}

插入尾部函数是追加函数。我不能改变参数或返回值。我只需要改变函数内部的内容。

MY_QUEUE是struct Node的公共版本

这是头文件

#include "status.h"
struct my_queue_public;
typedef struct my_queue_public* MY_QUEUE;
struct my_queue_public
{
    void(*destroy)(MY_QUEUE* phMy_queue);
    Status(*service)(MY_QUEUE hMy_queue);
    Status(*append)(MY_QUEUE hMy_queue, int item);
    Bool(*empty)(MY_QUEUE hMy_queue);
    int* (*front)(MY_QUEUE hMy_queue);
};
MY_QUEUE my_queue_init_default(void);

顺便说一下,这是一个队列。最后加上。从前面拿东西。总而言之,头部在移动,我失去了节点。我知道如何避免它,但我知道的唯一方法就是改变我传递的内容。而不是MY_QUEUE。我会传递一个MY_QUEUE*。有没有其他方法来处理我已有的

破坏功能

    void destroy(MY_QUEUE queue)
{
    Head_ptr head = (Head_ptr)queue;
    Node_ptr tmp;
    if (head->head == NULL) {
        return;
    }

    while (head->head !=NULL){
        tmp = head->head;
        head->head = head->head->next;
        free(tmp);
    }
    head->head = NULL;
}

我认为问题是您正在使用结构体Node作为您队列的数据结构。为什么不使用更专用的版本呢?

typedef struct queue_struct {
    Node * head;
    Node * tail;
} * MY_QUEUE;

现在,好吧,就是这样。你不需要遍历整个列表以便在最后添加。唯一的问题是,当插入(和删除)时,您必须保持tail以及head,如下所示。

Status append(MY_QUEUE queue, int item)
{
    Node_ptr temp;
    // create a new node
    temp = (Node_ptr)malloc(sizeof(Node));
    if (temp == NULL) {
        printf("malloc failedn");
        return FAILURE;
    }
    temp->data = item;
    temp->next = NULL;
    if (queue->head == NULL){
        queue->head = temp;
        queue->tail = temp;
    }
    else {
        queue->tail->next = temp;
        queue->tail = temp;
    }
    return SUCCESS;
}

这就是问题所在。移动头节点指针,我不是吗应该做的。但我似乎想不出另一种方法来做这件事。

您可以使用临时变量tail来跟踪链接,而不是移动头节点,

    Node_ptr tail;
    if (head->head == NULL){
        head->head = temp;
    }
    else{
        //while(head->head->next) {
        //  head->head = head->head->next;
        //  }
        //head->head->next = temp;
        tail = head->head;
        while(tail->next) {
            tail = tail->next;
        }
        tail->next = temp;
    }
对于destroy函数,
//void destroy(MY_QUEUE queue);
void destroy(MY_QUEQUE *p_queue);//change to this 
                                 //to keep consistent in struct my_queue_public
 void destroy(MY_QUEUE *p_queue)
 {
    Head_ptr head;
    Node_ptr tmp;
   if(p_queue == NULL){
     return;
   }
   if((head = (Head_ptr)*p_queue) == NULL){
     return;
   }    
   if (head->head == NULL) {
     return;
   }
   while (head->head !=NULL){
      tmp = head->head;
      head->head = head->head->next;
      free(tmp);
   }
   free(head);
  } 

相关内容

  • 没有找到相关文章

最新更新