如何修复“列表大小(类)未知或零错误”和“声明语法错误”?

时间:2019-01-29 11:19:07

标签: c++

我试图制作一个程序来使用单链接列表(堆栈)添加/删除/显示数组元素。但是出现了三个错误。

我不知道编码是否正确(我今年刚从高中毕业),并且使用的是旧版本的C ++。

#include<conio.h>
#include<string.h>
#include<stdio.h>
 typedef struct node
{
    char *name;
    int roll;
    struct node *next;
};

class list      //Error 1: Declaration Syntax Error
{   
    node *head;
public:
    list()
    {
    head=NULL;
    }
    void add( char *, int);
    void remove();
    void display();
};

void list::add(char *n, int r)   //Error 2 and 3: Size of list is unknown or 
                                   zero error and Declaration Syntax Error 
{
    node *p, *q;
    p=new node;
    strcpy(p->name, n);  
    p->roll=r;
    if(head==NULL)
    { 
        head=p;
        head->next=NULL;
        return;
    }
    p->next=head;
    head=p;
}

void list::remove()
{
    node *p;
    if(head==NULL)
    {
        cout<<"\n\nUnderflow";
        return;
    }
    if(head->next==NULL)
    {
        p=head;
        head=NULL;
        cout<<"\n\nElement deleted is:"<<p->name<<","<<p->roll;
        delete(p);
        return;

    }
    p=head;
    head=p->next;
    cout<<"\n\nElement deleted is"<<p->name<<","<<p->roll;
    delete(p);
}

void list::display()
{
    node *p;
    if(head==NULL)
    {
        cout<<"\n\nNothing to Display";
        return;
    }
    p=head;
    while(p->next!=NULL)
    {
        fflush(stdin);
        cout<<p->name<<" "<<p->roll<<"\n";
        p=p->next;
    }
    cout<<p->name<<" "<<p->roll;
}

void main()
{
    list X;
    char *sname;
    int ch, roll;
    clrscr();
    do
    {
    cout<<"\n\n1.Add\n\n2.Delete\n\n3.Display\n\n\nEnter your choice:";
    switch(getche())
    {
        case '1':   
            {
            cout<<"\n\n\nEnter your name:";
            gets(sname);
            getch();
            cout<<"\n\nEnter your roll:";
            cin>>roll;
            getch();
            X.add(sname,roll);
            }
            break;
        case '2':
            {
            cout<<"\n\nThe Display of your entry:";
            X.remove();
            }
            break;
        case '3':
            {
            cout<<"\n\nThe Link List elements are:\n\n";
            X.display();
            }
            break;
        default:
            cout<<"\n\nWrong choice:";
}

cout<<"\n\n\nDo you want to continue(y/n)? :";
}
while (getche()=='y');
}

如果有人想指出代码中的其他错误,这将非常有帮助。 谢谢。

2 个答案:

答案 0 :(得分:1)

这只是一个猜测,因为即使我切换回C ++ 98标准,也无法在C ++编译器中重现该错误。

两件事:

1。)如果源文件的结尾为.c(而不是.cpp),则编译器可能会将您的输入视为C文件(并且C无法识别关键字{{1 }}。

2。)您的class缺少您定义的别名的名称,即它应该类似于

typedef

无论如何,在C ++中-与C相反-编写

typedef struct node
{
    char *name;
    int roll;
    struct node *next;
} node;  // <-- name for the alias.

为了同时使用struct node { char *name; int roll; struct node *next; }; 或仅使用struct node来引用结构类型。

答案 1 :(得分:0)

一旦完成编译,此代码就会给您一个运行时错误

p=new node;
strcpy(p->name, n);  

此代码将字符串复制到p->name。问题是p->name没有指向有效的内存。为了使这项工作,您必须为要复制的字符串分配一些内存。这不会自动发生。需要这样的东西

p = new node;
p->name = new char[strlen(n) + 1]; // allocate memory for string
strcpy(p->name, n);  

必须同意MSalters的知识,无论谁教你这是关于现代C ++的知识都不多。