尝试在C

时间:2016-12-08 01:22:58

标签: c struct null nodes

我正在编写一个简短的程序来创建具有节点的队列,这些节点上有时间戳,最终会分成线程。我只是在编写队列部分并试图打印出值时陷入困境。编译器在各行中给出了3个错误。

  1. "错误:无效的二进制操作数==(有'node'和'void *')"在第16和29行

  2. "错误:从类型'struct node *'&#34分配到类型'node'时出现不兼容的类型;在第35,38和57行。

  3. "错误:初始化程序无效"第45行。

  4. 我不明白为什么我会收到这些错误而且我不知道如何修复它们。这是代码:

      1 #include<stdio.h>
      2 #include<time.h>
      3 #include<pthread.h>
      4
      5 typedef struct node{
      6     int fd;
      7     time_t seconds;
      8     struct node *next;
      9 }node;
     10
     11 void dequeue(node);
     12 void enqueue(node, int);
     13
     14 void dequeue(node head){
     15
     16     if(head ==  NULL)
     17         return;
     18
     19     head.next = head.next->next;
     20     return;
     21 }
     22
     23 void enqueue(node head, int fd){
     24
     25     node curr;
     26     curr.fd = fd;
     27     curr.seconds = 0;
     28
     29     if(head == NULL){
     30         head = curr;
     31         return;
     32     }
     33
     34     while(head.next != NULL){
     35         head =  head.next;
     36     }
     37
     38     head.next = curr;
     39     return;
     40 }
     41
     42 int main(){
     43     node head = NULL;
     44     int i;
     45     printf("head ");
     46
     47     for(i = 0; i < 5; i++){
     48         enqueue(head, i);
     49     }
     50
     51     printf("head");
     52     node tmp;
     53
     54     for(i = 0; i < 5; i++){
     55         printf("-> node %d with value %d", i, tmp.fd);
     56         tmp = tmp.next;
     57     }
     58
     59     return 0;
     60 }        
    

1 个答案:

答案 0 :(得分:1)

你的代码中有一堆错误和错误。我试图修复你的代码,同时努力坚持你正在解决的问题。

始终包含stdlib.h,因为它会抑制一些指针算术警告。

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

对结构进行类型定义是一种不好的做法,并且使用struct关键字访问typedefed结构也是错误的。

struct node
{
   int fd;
   time_t seconds;
   struct node *next;
};

在定义函数签名时,将变量名称与其类型放在一起,以获得自描述函数原型。

struct node * dequeue(struct node *head);
struct node * enqueue(struct node *head, int fd);

原始dequeue函数没有free分配的空间。此外,您需要返回struct node指针才能更新head指针。

struct node * dequeue(struct node *head)
{
   if(head !=  NULL)
   {    
      struct node *tmp = head;
      tmp = head->next;
      free(head);
      head = tmp;
      return(head);
   }
}

原始if函数中的whileenqueue条件都是错误的。此外,在return函数中放置void是不正确的。

struct node * enqueue(struct node *head, int fd)
{
   struct node *curr = malloc(sizeof(struct node));
   curr->fd = fd;
   curr->seconds = 0;
   curr->next = NULL;

   if(head == NULL)
      head = curr;
   else
   {
      while(head->next != NULL)
         head =  head->next;
      head->next = curr;
      head = head->next;
   }
   return(head);
}

您的主要功能没有正确的参数并且存在一些问题。这是它的更多verbos版本。

int main(int argc, char *argv[])
{
   struct node *head = NULL;
   struct node *tmp = head;

   // Enqueue 5 nodes   
   int i;
   for(i = 0; i < 5; i++)
   {
      head = enqueue(head, i);
      printf("node %d with value %d enqueued\n", i, head->fd);
      if(i == 0)
          tmp = head;
   }
   printf("\n");

   //Traverse the queue
   head = tmp; 
   for(i = 0; i < 5; i++)
   {
      printf("node %d with value %d traversed\n", i, head->fd);
      head = head->next;
   }
   printf("\n");

   // Dequeue 5 nodes   
   head = tmp; 
   for(i = 0; i < 5; i++)
   {
      printf("node %d with value %d dequeued\n", i, head->fd);
      head = dequeue(head); 
      tmp = head;
   }
   return (0);
 }  

最后的评论:如果你学习如何在C语言中使用指针,生活会更容易!