结构,链表,头,空指针,C ++

时间:2015-06-10 14:16:19

标签: c++ pointers struct null-pointer

如何定义指针头显示第一个链表元素?编译器显示错误:

  

头= domino->信息;

struct dominopart {
int number1;
int number2;



};

struct dominoone {
dominopart info;
struct dominoone *next;
};

首先我将其定义为空指针,因为链接列表最初是空的。

  struct dominoone* next= NULL;
    struct dominoone* head=NULL;

然后逐行读取文件中的信息。

    int readDomino (){
        FILE *datei;


        if((datei=fopen("datei.dat", "r") )==NULL) { 
            std::cout<<"File can't be opened"<<std::endl;
            return 0;
        }else {
            int beginning;
            int temp;
            fscanf(datei, "%d", &beginning);

            for(int i=0; i<beginning; i++) {

                dominoone *domino= new dominoone;
                fscanf(datei, "%i", &temp);
                domino->info.number1=temp;
                fscanf(datei, "%i", &temp);
                domino->info.number2=temp;
                printf("[%d:%d]", domino->info.number1, domino->info.number2);
                domino->next=0;
                 if(i==1) {
                    head=domino->info; //The compiler shows mistake here
                }

           } 
        }return 0;

    }

文件被读取并显示,我已正确写入文件,但我无法删除整个列表,因为我的指针头仍然是空指针:

void del () {
    dominoone* tmp;
    while(head != 0) { 
        tmp=(head)->next;
        delete head;
        head=tmp;
    }

}

1 个答案:

答案 0 :(得分:0)

此代码中的错误很少。

首先,由于左侧和右侧的类型不兼容,因此无法执行作业head=domino->info

其次,在阅读多米诺骨牌列表时,您需要跟踪列表的尾部。

所以你需要声明

  struct dominoone* tail=NULL;

然后在填充结构后,用

替换if (i==1) ...
  if (i == 0 ) head = domino;
  else tail->next = domino;
  tail = domino;

readDomino()函数的最终版本可能如下所示:

int readDomino (){
        FILE *datei;
        struct dominoone* tail=NULL;


        if((datei=fopen("datei.dat", "r") )==NULL) {
            std::cout<<"File can't be opened"<<std::endl;
            return -1;
        }

        int list_size;
        fscanf(datei, "%d", &list_size);

        for(int i=0; i<list_size; i++) {
                dominoone *domino= new dominoone;
                fscanf(datei, "%i", &domino->info.number1);
                fscanf(datei, "%i", &domino->info.number2);
                printf("[%d:%d]\n",
                       domino->info.number1, 
                       domino->info.number2);
                domino->next=NULL;

                if (i == 0 ) head = domino;
                else tail->next = domino;
                tail = domino;
           }
        }
        return 0;
}