【问题标题】:Unable to compile Linked List Program无法编译链表程序
【发布时间】:2014-10-22 12:05:03
【问题描述】:

我一直在尝试修复我在编译此程序时遇到的几个错误,但似乎找不到任何解决方案。这些是在实际代码之后发生的以下错误。大多数错误都是“一元 * ”问题,尽管我认为这是使用它的正确方法。如果有人能指出我正确的方向,那将非常有帮助。

testReadLinkedList.c:13: warning: no semicolon at end of struct or union
testReadLinkedList.c: In function ‘insertListElement’:
testReadLinkedList.c:31: error: incompatible types in assignment
testReadLinkedList.c: In function ‘readFile’:
testReadLinkedList.c:43: warning: comparison between pointer and integer
testReadLinkedList.c: In function ‘countList’:
testReadLinkedList.c:51: error: invalid initializer
testReadLinkedList.c:54: error: invalid operands to binary !=
testReadLinkedList.c:56: error: invalid type argument of ‘unary *’
testReadLinkedList.c: In function ‘printList’:
testReadLinkedList.c:65: error: invalid initializer
testReadLinkedList.c:70: error: invalid type argument of ‘unary *’
testReadLinkedList.c:71: error: invalid type argument of ‘unary *’
testReadLinkedList.c:72: error: invalid type argument of ‘unary *’
testReadLinkedList.c:73: error: invalid type argument of ‘unary *’
testReadLinkedList.c:81: error: invalid type argument of ‘unary *’


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <float.h>

typedef struct LinkedListNode {
    int red;
    int green;
    int blue;
    char function[128];
    struct LinkedListNode* next
} LinkedListNode;

typedef struct {
    LinkedListNode* head;
} Linkedlist;

void initLinkedList(Linkedlist* listIn) {

    listIn = (Linkedlist*)malloc(sizeof(Linkedlist));
    (*listIn).head = NULL;
}

void insertListElement(Linkedlist* listIn, int redIn, int greenIn, int blueIn, char* functionIn) {
    LinkedListNode* newNode = (LinkedListNode*)malloc(sizeof(LinkedListNode));

    (*newNode).red = redIn;
    (*newNode).green = greenIn;
    (*newNode).blue = blueIn;
    (*newNode).function = functionIn;

    (*newNode).next = (*listIn).head;
    (*listIn).head = newNode;
}

void readFile(FILE* fileIn, Linkedlist* listIn) {

    char tempLine[128];
    int tempRed, tempGreen, tempBlue;
    char tempFunction[128];

    while(fgets(tempLine, 128, fileIn) != EOF) {
        sscanf(tempLine, "%d %d %d %[^\n]", &tempRed, &tempGreen, &tempBlue, tempFunction);
        insertListElement(listIn, tempRed, tempGreen, tempBlue, tempFunction);
    }

}

int countList(Linkedlist* listIn) {
    LinkedListNode currNode = (*listIn).head;
    int size = 0;

    while(currNode != NULL) {
        size++;
        currNode = (*currNode).next;
    }
    return size;
} 

void printList(Linkedlist* listIn) {

    int i, tempRed, tempGreen, tempBlue;
    char tempFunction[128];
    LinkedListNode currNode = (*listIn).head;
    int listSize = countList(listIn);

    for(i = 0;i < listSize; i++) {

        tempRed = (*currNode).red;
        tempGreen = (*currNode).green;
        tempBlue = (*currNode).blue;
        tempFunction = (*currNode).function;

        printf("Red: %d\n",tempRed);
        printf("Green: %d\n",tempGreen);
        printf("Green: %d\n",tempBlue);
        printf("Function: %s\n",tempFunction);
        print("t\n");

        currNode = (*currNode).next;
    }

} 

int main(int argc, char** argv) {

    FILE* f1;
    Linkedlist* list1;

    f1 = fopen(argv[1], "r");
    if(f1 == NULL) {
        printf("Error: could not open file");
    } else {
        initLinkedList(list1);
        readFile(f1, list1);        
    }

}

【问题讨论】:

  • testReadLinkedList.c:13: warning: no semicolon at end of struct or union

标签: c struct compiler-errors linked-list compiler-warnings


【解决方案1】:

这里:

(*newNode).function = functionIn;

你需要将strcpy函数传入(*newNode).function,你不能简单地赋值给它。另外,在这一行:

while(fgets(tempLine, 128, fileIn) != EOF)

fgets 出错时不返回 EOF 而是返回 NULL,所以你需要这样做:

 while (fgets(tempLine, 128, fileIn))

在这一行:

LinkedListNode currNode = (*listIn).head;

head是指针,需要固定currNone的类型:

LinkedListNode *currNode = listIn->head;

最后,你需要改变你的初始化函数:

void initLinkedList(Linkedlist **listIn) {
  *listIn = (Linkedlist *)malloc(sizeof(Linkedlist));
  (*listIn)->head = NULL;
}

和电话:

initLinkedList(&list1);

【讨论】:

    【解决方案2】:
    1. struct LinkedListNode* next --> 缺少分号。

    2. (*newNode).function = functionIn; 更改为strcpy(newNode-&gt;function,functionIn)

    3. char * fgets ( char * str, int num, FILE * stream ); 如果不成功(如果在尝试读取字符时遇到文件结尾),它将返回 NULL(不是 EOF)。

    是一些提示。还有很多其他错误。您可能想再次阅读基本的 C 指针概念。

    【讨论】:

      【解决方案3】:
      #include<iostream>
      #include<conio.h>
      #include<string.h>
      using namespace std;
      struct node
      {
          int itemno;
          node *next;
      };
      node *temp=NULL,*top=NULL;
      int e;
      
      void push()
      {
          temp=new node;
          temp->next=NULL;
          if(temp==NULL)
          {
      
          cout<<"stack overflow";
          return;
      }
      
          cout<<"enter the itemno"<<endl;
          cin>>temp->itemno;
          //temp->itemno=e;
          if(top==NULL)
          {   
              top=temp;
      }
          else
          {
              top=temp->next;
              top=temp;
      
          }
      }
      void pop()
      {
          if(top==NULL)
      
              cout<<"stack underflow";
      
      
          else
          {
              top=temp;
                  cout<<temp->itemno;
              top=top->next;
      
      
          }
              delete temp;
      }
      void display()
      {
          if(top==NULL)
          {
      
          cout<<"stack underflow";
          return;
      }
          else
          {
              temp=top;
              while(temp!=NULL)
              {
                  cout<<temp->itemno;
                  cout<<endl;
                  temp=temp->next;
              }
          }
      }
      int main()
      {   char choice1;
          int choice;
          while(1)
          {
              cout<<"menu"<<endl;
              cout<<"1.push"<<endl;
              cout<<"2.pop"<<endl;
              cout<<"e.displAY"<<endl;
              cout<<"4.exit"<<endl;
              cout<<"enter your choice"<<endl;
              cin>>choice;
              switch(choice)
              {
                  case 1:{
                      do
                      { push();
                      cout<<"enter y to add or n to cancel"<<endl;
                      cin>>choice1;
      
      
                      }while(choice1=='y');
      
      
                  break;}
                  case 2:{
                      do
                      {
                          cout<<"enter y to delete or n to cancel"<<endl;
                          cin>>choice1;
                          if(choice1=='y')
                          pop();
                      }while(choice1=='y');
      
      
                  break;}
                  case 3:display();
                  break;
                  case 4:return 0;
                  default:break;
      
              }
      
          }
              getch();
              return 0;
      
      
      } can anybody point out the mistake in this.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多