QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1687|回复: 17

c++ program

[复制链接]
发表于 2003-11-5 16:11:00 | 显示全部楼层 |阅读模式
the first file:
class IntNode{
public:
        int onum;
    char oname[10];
    int oscore;
        IntNode *next;
        IntNode(int num,char name[10],int score,IntNode *ptr = 0){
                int i=0;
            onum = num;
                for (i=0;i<10;i++)
                        oname = name;
                oscore = score;
                next = ptr;
        }
};

class IntSLList{
public:
        IntSLList(){
              head = tail = 0;
        }
        ~IntSLList();
        int isempty(){
                return head == 0;
        }
        void addToData(int,char,int);
        void searchToData(int);
    void deleteNode(int);
        void insertToData(int,char,int);
        void printToData();
private:
        IntNode *head,*tail;
};

the second file:
#include <iostream>
#include "intSLList.h"

using namespace std;

IntSLList::~IntSLList(){
    for(IntNode *p;!isempty();){
                p = head -&gt; next;
                delete head;
                head = p;
        }
}

void IntSLList::addToData(int num,char name[10],int score)
{
        if (tail != 0){
                tail -&gt; next = new IntNode(num,name,score);
                tail = tail -&gt; next;
        }
        else{
                head = tail = new IntNode(num,name,score);
        }
}

void IntSLList::deleteNode(int num){
        if (head != 0){
                if (head == tail &amp;&amp; el == head-&gt;info){
                        delete head;
                        head = tail = 0;
                }
                else if (num == head -&gt; onum){
                        IntNode *tmp = head -&gt; next;
                        head = head -&gt; next;
                        delete tmp;
                }
                else{
                        IntNode *pred,*tmp;
                        for (pred = head;tmp = head-&gt;next; tmp != 0,&amp;&amp;(tmp-&gt;onum == num);
                                pred = pred -&gt; next,tmp = tmp -&gt; next){
                                        if (tmp != 0)
                                                pred -&gt; next = tmp -&gt; next;
                                        if (tmp == tail)
                                                tail = pred;
                                        delete tmp;
                                }
                        }
                }
        }
}

void IntSLList::searchToData(int num)
{
        while(1){
                if (num == head -&gt; onum){
                        printf("\n");
                        printf("%d\n",head -&gt; onum);
                        printf("%s\n",head -&gt; name);
                        printf("%d\n",head -&gt; score);
                        break;
                }
                else{
                        head = head -&gt; next;
                }
        }
}

void IntSLList::insertToData(int num,char name[10],int score)
{
        if (tail != 0){
                tail -&gt; next = new IntNode(num,name,score);
                tail = tail -&gt; next;
        }
        else{
                head = tail = new IntNode(num,name,score);
        }
}

void IntSLList::printToData()
{
        while(head != tail){
                printf("\n");
                printf("%d\n",head -&gt; onum);
                printf("%s\n",head -&gt; name);
                printf("%d\n",head -&gt; score);
        }
}
  

the third file:
#include <iostream>
#include "intSLList.h"

using namespace std;

void printmenu()
{
        printf("\n(1).Input your data.");
        printf("\n(2).Print your data.");
        printf("\n(3).Delete yout data.");
        printf("\n(4).Insert yout data.");
        printf("\n(5).Search your data.");
        printf("\n(0).Exit.");
        printf("\nInput your select num:");
}

int main()
{
        IntNode *New;
        int switchnum;
        int Nnum;
        char Nname[10];
        int Nscore;
       
        printmenu();
        scanf("%d",&amp;switchnum);
        while(1){
                switch(switchnum){
                        case 1:printf("\nInput your num:");
                                   scanf("%d",&amp;Nnum);
                               printf("\nInput your name:");
                               scanf("%s",Nname);
                               printf("\nInput your score:");
                               scanf("%d",&amp;Nscore);
                               New -&gt; addToData(Nnum,Nname,Nscore);
                                   break;
                        case 2:New -&gt; printToData();
                                   break;
                        case 3:printf("\nInput you should del your num:");
                                   scanf("%d",&amp;Nnum);
                               New -&gt; deleteNode(Nnum);
                               break;
                        case 4:printf("\nInput your num:");
                                   scanf("%d",&amp;Nnum);
                               printf("\nInput your name:");
                               scanf("%s",Nname);
                               printf("\nInput your score:");
                               scanf("%d",&amp;Nscore);
                               New -&gt; insertToData(Nnum,Nname,Nscore);
                               break;
                        case 5:printf("\nInput you search num:");
                                   scanf("%d",&amp;Nnum);
                               New -&gt; searchToData(Nnum);
                               break;
                        case 0:exit(0);
                                break;
                }
        }
}

the result view:
liaobiao.cpp: In function `int main()':
liaobiao.cpp:35: no matching function for call to `IntNode::addToData(int&amp;,
   char[10], int&amp;)'
liaobiao.cpp:37: no matching function for call to `IntNode::printToData()'
liaobiao.cpp:41: no matching function for call to `IntNode::deleteNode(int&amp;)'
liaobiao.cpp:49: no matching function for call to `IntNode::insertToData(int&amp;,
   char[10], int&amp;)'
liaobiao.cpp:53: no matching function for call to `IntNode::searchToData(int&amp;)'

why????? :-(  :-(  :-(  :-(  :-(
发表于 2003-11-5 20:14:09 | 显示全部楼层
你前面是把那些函数归在IntSLList类里,后面却定义一个intnode类的指针,当然找到不到那函数了(no matching function for call ...),
回复

使用道具 举报

 楼主| 发表于 2003-11-5 23:00:21 | 显示全部楼层
thank you,but now i have any error
liaobiao.cpp: In function `int main()':
liaobiao.cpp:35: invalid conversion from `char*' to `char'
liaobiao.cpp:35:   initializing argument 2 of `void IntSLList::addToData(int,
   char, int)'
liaobiao.cpp:49: invalid conversion from `char*' to `char'
liaobiao.cpp:49:   initializing argument 2 of `void
   IntSLList::insertToData(int, char, int)'

why not!!!  :-(  :-(  :-(  :-(
回复

使用道具 举报

发表于 2003-11-5 23:43:00 | 显示全部楼层
在类中void addToData(int,char,int);
void insertToData(int,char,int);
的参数应改为(int,char*,int)
因为你在main()中Nname[10]是一个数组,而Nname则指该数组的指针,应用以上函数时,就是把一个指向数组的指针对应于char,明显是错误的!!!
回复

使用道具 举报

 楼主| 发表于 2003-11-6 12:56:59 | 显示全部楼层
谢谢!!!          
回复

使用道具 举报

 楼主| 发表于 2003-11-6 13:08:41 | 显示全部楼层
但是,还是有一些错误的!就是最后创建bin文件的时候有错了!!
/tmp/ccppOE4x.o(.text+0x12f): In function `main':
: undefined reference to `IntSLList::addToData(int, char*, int)'
/tmp/ccppOE4x.o(.text+0x142): In function `main':
: undefined reference to `IntSLList::printToData()'
/tmp/ccppOE4x.o(.text+0x17c): In function `main':
: undefined reference to `IntSLList::deleteNode(int)'
/tmp/ccppOE4x.o(.text+0x202): In function `main':
: undefined reference to `IntSLList::insertToData(int, char*, int)'
/tmp/ccppOE4x.o(.text+0x23c): In function `main':
: undefined reference to `IntSLList::searchToData(int)'
collect2: ld returned 1 exit status
这是怎么回事啊!!! :-(  :-(  :-(  :-(  :-(  :-(
回复

使用道具 举报

发表于 2003-11-6 13:54:25 | 显示全部楼层
你在类中声明的是void addToData(int,char*,int); (假设你是按照我说的改的)
而你定义时是不是没改动?仍然是void IntSLList::addToData(int num,char name[10],int score)??如果真是这样的说,就错了,应该改成void IntSLList::addToData(int num,char *name,int score)

其它几个也同此!
回复

使用道具 举报

 楼主| 发表于 2003-11-10 22:10:00 | 显示全部楼层
那个已经改了,但是,还是很多错啊!!!
不过,是编译过程得问题吗???
为什么,我这样编译就可以啊!!!
g++ -c intSLList.cpp
g++ -g intSLList.o lianbiao.cpp -o lianbiao

不过,运行的时候有错误啊!!!
gdb lianbiao
run
Starting program: /home/magicboy/c++/lianbiao/lianbiao

(1).Input your data.
(2).Print your data.
(3).Delete yout data.
(4).Insert yout data.
(5).Search your data.
(0).Exit.
Input your select num:1

Input your num:34

Input your name:23

Input your score:23

Program received signal SIGSEGV, Segmentation fault.
0x0804870e in IntSLList::addToData(int, char*, int) ()
这是怎么回事啊!!! :-(
回复

使用道具 举报

发表于 2003-11-11 10:19:22 | 显示全部楼层
我认为是这段的问题
IntNode(int num,char name[10],int score,IntNode *ptr = 0){
int i=0;
onum = num;
for (i=0;i&lt;10;i++)
oname = name;
oscore = score;
next = ptr;
}
name[10]是不是要做些修改?相应内部也要调整一下
试试吧,


问个问题,在linux下,怎么用gcc的开关啊?(我还没在linux下编过程呢,试了一次,不会)谢谢
回复

使用道具 举报

 楼主| 发表于 2003-11-11 13:13:55 | 显示全部楼层
是不是要用strcmp函数啊!!
回复

使用道具 举报

 楼主| 发表于 2003-11-11 13:18:16 | 显示全部楼层
我最近用c++写的数据结构的程序都是有这样的问题!!! :-(
回复

使用道具 举报

 楼主| 发表于 2003-11-11 13:21:28 | 显示全部楼层
比如:
the first file:
class duizhan
{
        public:
    int stack[10];
        int top;
        int MaxSize;
       
        duizhan();
        ~duizhan();
        void push(int);
        int pop();
        void selectmenu();
};

the second file:
#include <iostream>
#include "duizhan.h"

using namespace std;

duizhan::duizhan()
{
        int MaxSize = 10;
        int top = -1;
}

duizhan::~duizhan()
{
       
}

void duizhan::push(int value)
{
        int i;
       
        if (top&gt;=MaxSize-1)
                cout &lt;&lt; "The stack is full!!!" &lt;&lt; endl;
        else
        {
                printf("\nThe stack content before(top -&gt; bottom):");
                for (i=top;i&gt;=0;i--)
                        printf("[%d]",stack);
               
                top++;
                stack[top] = value;
               
                printf("\nThe stack content after push(top -&gt; bottom):");
                for (i=top;i&gt;=0;i--)
                        printf("[%d]",stack);
                printf("\n");
        }
}

int duizhan::pop()
{
        int temp;
        int i;
       
        if (top&lt;0){
                printf("\nThe stack is empty!!!\n");
                return -1;
        }
        printf("\nThe stack content before(top -&gt; bottom):");
        for (i=top;i&gt;=0;i--)
                printf("[%d]",stack);
       
        temp = stack[top];
        top--;
        printf("\nThe pop value is [%d]",temp);
        printf("\nThe stack content after pop(top -&gt; bottom):");
        for (i=top;i&gt;=0;i--)
                printf("[%d]",stack);
        printf("\n");
        return temp;
}

the third file:
#include "duizhan.h"
#include <iostream>

using namespace std;

void duizhan::selectmenu()
{
        int select;
        int value;
        printf("\n(1)Input a stack data");
        printf("\n(2)Output a stack data");
        printf("=n(3)Exit");
        printf("\nPlease select one =&gt;");
        scanf("%d",&amp;select);
        do{
                switch(select){
                        case 1:printf("\nPlease input the data=&gt;");
                                scanf("%d",&amp;value);
                            push(value);
                            break;
                        case 2:value=pop();
                                break;
                }
                printf("\n(1)Input a stack data");
                printf("\n(2)Output a stack data");
                printf("\n(3)Exit");
                printf("\nPlease select one=&gt;");
                scanf("%d",&amp;select);
                printf("\n");
        }while(select != 3);
}

the forth file:
#include <iostream>
#include "duizhan.h"

using namespace std;

int main()
{
        duizhan p;
        p.selectmenu();
}

调试如下:
gdb duizhan
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...
(gdb) run
Starting program: /home/magicboy/c++/duizhan/duizhan

(1)Input a stack data
(2)Output a stack data=n(3)Exit
Please select one =&gt;1

Please input the data=&gt;23


Program received signal SIGSEGV, Segmentation fault.
0x0804879f in duizhan::push(int) ()

这是怎么回事啊!!!我都很郁闷啊!!!
:-(  :-(  :-(  :-(
回复

使用道具 举报

 楼主| 发表于 2003-11-11 13:22:34 | 显示全部楼层
高人快点解救我啊!!!我都急死了!!! :-(  :-(  :-(  :-(  :-(  :-(
回复

使用道具 举报

 楼主| 发表于 2003-11-11 13:23:30 | 显示全部楼层
我也知道是函数问题,但是,我找不出来啊!!! :-(  :-(  :-(  :-(
回复

使用道具 举报

发表于 2003-11-11 21:19:06 | 显示全部楼层
你既然是用c++在写程序,程序中就不应该出现printf之类的函数,另外用gdb调试的话要学会用单步跟踪,这样自己也大概清楚是在哪儿出了问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-9 10:37 , Processed in 0.109206 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表