c - 不使用tail实现函数

标签 c data-structures linked-list tail

我创建了一个程序来反转单词的非元音序列,用一个简单的链表表示,但我应该在不使用指向最后一个节点的尾指针的情况下这样做。

我在createListpop(用于弹出列表并返回每个节点的字母char)、push_back中使用了这个功能>push_front (两者都用于反转非元音序列。例如,push_front 将一个节点放在包含分析序列的列表前面:node-> a-> b-> c. push_back,同理,使序列a->b->c为a->b->c->节点)。

LIST *createList(void){
    LIST *list = malloc(sizeof(*list));
    if(list){
        list->first = list->tail = NULL;
    }
    return list;
}

char pop(LIST *list){
    char ch = list->first->letter;

    list->first = list->first->next;
    if(list->first == NULL)
        list->tail = NULL;
    return ch;
}

void push_back(LIST *list, char ch){
    NODE *node = createNode(ch);
    if(list->first)
        list->tail = list->tail->next = node;
    else
        list->tail = list->first = node;
}

void push_front(LIST *list, char ch){
    NODE *node = createNode(ch);
    if(list->first){
        node->next = list->first;
        list->first = node;
    } else {
        list->tail = list->first = node;
    }
}

我想知道如何用某些局部变量或上述函数的其他实现来替换 typedef 中的尾指针。

最佳答案

您只需要更改push_back,因为它会推送到列表的末尾

void push_back(LIST *list, char ch){
    NODE *node = createNode(ch);
    NODE *tmp = list->first;

    if (tmp)
      while(tmp)
      {
         if (tmp->next == NULL)
         { 
            tmp->next = node;
            tmp = tmp->next;
         }
         tmp = tmp->next;         
      }
    else
      list->first = node;
}

您可以在此处找到完整的实现 https://repl.it/KiBB/6

关于c - 不使用tail实现函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46121271/

相关文章:

python - Python 的列表方法 append 和 extend 有什么区别?

c - 如何在c中声明链表

c - `exit()` 将 `status` 发送给什么,父进程还是操作系统内核?

c++ - 识别泰米尔语字符串并使用 c 或 c++ 以及 unicode 的使用对其进行处理

data-structures - 图表-如果我用哈希表替换邻接列表中的每个链表,会有什么缺点?

c - 使用链表的现有实现来实现队列: Bad File Number error

c++ - 如何初始化节点为矩阵的链表?

java - 链表内存泄漏

c++ - 嵌入式系统中固有、内联、外部的区别?

java - 从 Java JNI 捕获 C stderr