C中的LinkedList实现

时间:2017-08-08 18:32:08

标签: c data-structures linked-list singly-linked-list

所以我开始学习数据结构,并且我轻松地在Java和Python中成功实现了LinkedList。但是我的C代码出了点问题并没有得到输出。这个指针概念真的很烦我,如果有人能在这个实现中告诉我我的错误,我将不胜感激。

public class Main extends Application {

@Override
public void start(Stage primaryStage) {
    try {
        TilePane root = new TilePane();
        Scene scene = new Scene(root, 500, 200);
        Button btn = new Button("Start");
        StatusBar status = new StatusBar();
        status.setPrefWidth(200);

        root.getChildren().addAll(btn, status);
        primaryStage.setScene(scene);
        primaryStage.show();

        StatusTestService service = new StatusTestService();
        status.progressProperty().bind(service.progressProperty());
        status.progressProperty().addListener(inv -> System.out.println(status.getProgress()));
        btn.setOnAction(event -> service.restart());

    } catch(Exception e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    System.out.println(System.getProperty("java.version"));
    launch(args);
}

class StatusTestService extends Service <Void> {

    @Override
    protected Task <Void> createTask() {
        return new Task <Void> () {

            @Override
            protected Void call() throws Exception {
                for (int i = 0; i < 10; i++) {
                    Thread.sleep(100);
                    updateProgress(i, 9);
                }
                return null;
            }
        };
    }       
}
&lt; BTW,就像head始终指向链表中的第一个节点一样,我有一个指针尾,它始终指向链表中的最后一个节点。这样,将数据附加到列表很容易,并且是恒定的时间。

谢谢你们,我很感激一个容易理解的答案..

2 个答案:

答案 0 :(得分:3)

您的headtail指针未按预期设置。 c中的所有内容都是按值传递的,因此传递给函数的所有参数基本上都是仅在该函数中具有范围的局部变量。当您将headtail传递给append时,会制作每份的本地副本。您对headtail进行了分配,但是一旦函数退出并且变量超出范围,这些分配就会丢失。您必须将这些指针的地址传递给append并在那里取消引用它们,如果您希望分配到&#34;坚持&#34;功能之外。

void append(int data, struct node **head, struct node **tail)
{
  struct node *newNode = ((struct node*)malloc(sizeof(struct node)));   
  (*newNode).data = data;
  (*newNode).next = NULL;
  if (head == NULL)
  {
    *head = newNode;  // dereference head here so this assignment will persist outside of this function
    *tail = newNode;
  }else{
    (*tail) -> next = newNode;
    *tail = newNode;
  }
}

.....

int main(void)
{
  printf("Hey linked list \n");
  struct node *head = NULL;
  struct node *tail = NULL;
  /* code */
  append(3,&head,&tail);
  append(4,&head,&tail);
  append(5,&head,&tail);
  traverse(head);
  return 0;
}

答案 1 :(得分:3)

您的代码只传递headtail指针的副本,因此调用方的值不会更新。你需要append中的双星论证,并传递他们的地址以便更新它们,如下所示:

#include<stdio.h>
#include<stdlib.h>

struct node
{
    int data;
    struct node *next;
};

void append(int data, struct node **head, struct node **tail){
    struct node *newNode = malloc(sizeof(struct node)); 
    newNode->data = data;
    newNode->next = NULL;
    if (*head == NULL)
    {
        *head = newNode;
        *tail = newNode;
    }else{
        (*tail)->next = newNode;
        *tail = newNode;
    }
}

void traverse(struct node *head){
    struct node *temp = head;
    while(temp != NULL){
        printf("%d",(*temp).data);
        temp = temp->next;
    }
}

int main(void)
{
    printf("Hey linked list \n");
    struct node *head = NULL;
    struct node *tail = NULL;
    append(3, &head, &tail);
    append(4, &head, &tail);
    append(5, &head, &tail);
    traverse(head);
    return 0;
}

节目输出:

Hey linked list
345