想做好事,为新手指路,可无奈能力有限,望大家帮忙

时间:2022-10-09 21:07:58
在学数据结构,教材是严蔚敏的<数据结构 c语言版>,自己用c语言实现数据结构时才发现里面的算法似乎更接近于c++,在网上找了好久都没找到用c语言实现的,于是想自己写一套与这本书配套的代码,把书里面的算法全部用c语言实现,可无奈能力有限,在实现栈的时候就出现问题了,所有相关的单个操作函数我都写好了,把所有相关函数与示例程序放在同一个文件里运行也没问题,我现在想用建工程的方式实现,可工程建好,把所有的单个函数文件导入工程后,运行不了了,我不知道什么问题, 望高手能够解答,帮我,也是帮大家哈!不废话了,上代码!

Stack.h
#define STACK_INIT_SIZE 100 

#define STACKINCREMENT 10
#include <stdio.h>
#include <stdlib.h>

typedef int SElemType;
typedef struct
{
    int *base;
    int *top;
    int stacksize;
}SqStack;

InitStack.c:
#include "Stack.h" 

void InitStack(SqStack *S)
{
    S->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE);
    if(!S->base)
    {
        printf("Over Flow");
        exit(0);
    }
    S->top = S->base;
    S->stacksize = STACK_INIT_SIZE;
    return ;
}

Pop.c
#include "Stack.h" 

void Pop(SqStack *S, int *e)
{
    if(S->top == S->base)
    {
        printf("栈空");
        exit(0);
    }
    *e = * --S->top;
}

Push.c
#include "Stack.h" 

void Push(SqStack *S,int e)
{
    if(S->top - S->base >= S->stacksize)
    {
        S->base = (int * ) realloc (S->base,(S->stacksize + STACKINCREMENT) * sizeof(int));
        if(!S->base)
        {
            printf("Over Flow");
            exit(0);
        }
        S->top = S->base +S->stacksize;
         S->stacksize += STACKINCREMENT;
    }
    *S->top ++ = e;
}

StackLength.c
#include "Stack.h" 

int StackLength(SqStack *S)
{
int count = 0;
SElemType *p = S->top;
while(p!=S->base)
{
count++;
p--;
}
return count;
}

各操作示例:
#include "Stack.h" 

void conversion (int Num) 
{  // 算法3.1
    // 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数
    SElemType e; 
    SqStack S;
    InitStack(&S);      // 构造空栈
    while (Num) 
     {
        Push(&S, Num % 8);
        Num = Num/8;
    }
printf("%d\n",StackLength(&S));
    while (!StackEmpty(&S))
    {
        Pop(&S,&e);
        printf ("%d", e);
    }
    printf("\n");
} // conversion


main.c
 

#include "Stack.h"
int main()
{
    conversion(9);
    getchar();
    return 0;
}

还有些操作函数示例程序里没用到,我就不传了,麻烦大家自己copy下去建个工程试试,我自己运行时的错误提示是:
stack.h(12) : error C2371: 'SqStack' : redefinition; different basic types
stack.h(12) : see declaration of 'SqStack'
等待高手了

35 个解决方案

#1


我们刚开始学习C语言,才学到指针。不懂哦。。。

#2


干嘛这么费劲,把所有的函数都放在一个*.cpp文件下,然后加入工程就行了。
你试试.

#3


引用 2 楼 kouwenlong 的回复:
干嘛这么费劲,把所有的函数都放在一个*.cpp文件下,然后加入工程就行了。
你试试.

我知道阿,可我不知道为什么将各文件导入工程就有问题啊 

#4


用vc工程也应该能运行,你要保证每个文件都在硬盘上的工程目录里,然后从vc的IDE把这些文件add进来。

#5


引用 4 楼 hbvanguard 的回复:
用vc工程也应该能运行,你要保证每个文件都在硬盘上的工程目录里,然后从vc的IDE把这些文件add进来。

这些我肯定知道阿,我编译都通过了,就是运行不了,有时间的话帮我看看吧

#6


实现文件:Stack.cpp
#include <stdio.h>
#include <stdlib.h>
#include "Stack.h"
void InitStack(SqStack *S)
{
    S->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE);
    if(!S->base)
    {
        printf("Over Flow");
        exit(0);
    }
    S->top = S->base;
    S->stacksize = STACK_INIT_SIZE;
    return ;
}
void Pop(SqStack *S, int *e)
{
    if(S->top == S->base)
    {
        printf("栈空");
        exit(0); 
    }
    *e = * --S->top;
}
void Push(SqStack *S,int e)

    if(S->top - S->base >= S->stacksize)
    {
        S->base = (int * ) realloc (S->base,(S->stacksize + STACKINCREMENT) * sizeof(int));
        if(!S->base)
        {
            printf("Over Flow");
            exit(0);
        }
        S->top = S->base +S->stacksize;
        S->stacksize += STACKINCREMENT;
    } 
    *S->top ++ = e; 

 
int StackLength(SqStack *S)

int count = 0; 
SElemType *p = S->top; 
while(p!=S->base) 

count++;
p--; 

return count; 


void conversion (int Num)
{  // 算法3.1 
    // 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数 
    SElemType e; 
    SqStack S; 
    InitStack(&S);      // 构造空栈 
    while (Num)
    { 
        Push(&S, Num % 8); 
        Num = Num/8; 
    }
printf("%d\n",StackLength(&S));
    while (!StackEmpty(&S))
    {
        Pop(&S,&e);
        printf ("%d", e);
    }
    printf("\n");
}

头文件:Stack.h
#ifndef STACK_H
#define STACK_H
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int SElemType;
typedef struct
{
    int *base;
    int *top;
    int stacksize;
}SqStack;
#endif

都放在根目录下,然后将Stack.cpp加进工程里。

#7


有几个问题:
1.Stack.h里的内容最好这样写:

#define STACK_INIT_SIZE 100 
#define STACKINCREMENT 10 
#include <stdio.h> 
#include <stdlib.h> 

typedef int SElemType; 
typedef struct 

    int *base; 
    int *top; 
    int stacksize; 
}SqStack; 
void Push(SqStack *S,int e) ;
void Pop(SqStack *S, int *e) ;
void InitStack(SqStack *S) ;
int StackLength(SqStack *S) ;


2.StackEmpty(&S)这个函数没定义;
3.我不知道convert函数是不是和main函数放一起的,因为你帖出来的文件没有convert.c文件。如果是在一起,就是你main.c包含了两个Stack.h,所以定义了两次SqStack,当然就错了。
所以,定义SqStack最好这样,即使包含两次也没问题:

#ifndef _STACK
#define _STACK
typedef struct 

    int *base; 
    int *top; 
    int stacksize; 
}SqStack; 
#endi

我运行没错了,就是少了StackEmpty函数的定义。

#8


引用 6 楼 kouwenlong 的回复:
实现文件:Stack.cpp
C/C++ code#include<stdio.h>
#include<stdlib.h>
#include"Stack.h"void InitStack(SqStack*S)
{
    S->base= (int*)malloc(sizeof(int)*STACK_INIT_SIZE);if(!S->base)
    {
        printf("Over Flow");
        exit(0);
    }
    S->top= S->base;
    S->stacksize= STACK_INIT_SIZE;return ;
}void Pop(SqStack*S,int*e)
{if(S->top== S->base)
    {
        printf("栈空");
        exit(0); 
    }*e=*--S->top;
}void Push(SqStack*S,int e)
{if(S->top- S->base>= S->stacksize)
    {
        S->base= (int* ) realloc (S->base,(S->stacksize+ STACKINCREMENT)*sizeof(int));if(!S->base)
        {
            printf("Over Flow");
            exit(0);
        }
        S->top= S->base+S->stacksize;
        S->stacksize+= STACKINCREMENT;
    }*S->top++= e; 
}int StackLength(SqStack*S)
{int count=0; 
SElemType*p= S->top;while(p!=S->base) 

count++;
p--; 
}return count; 
}void conversion (int Num)
{// 算法3.1// 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数    SElemType e; 
    SqStack S; 
    InitStack(&S);// 构造空栈while (Num)
    { 
        Push(&S, Num%8); 
        Num= Num/8; 
    }
printf("%d\n",StackLength(&S));while (!StackEmpty(&S))
    {
        Pop(&S,&e);
        printf ("%d", e);
    }
    printf("\n");
}
 头文件:Stack.h
C/C++ code#ifndef STACK_H#define STACK_H#define STACK_INIT_SIZE 100#define STACKINCREMENT 10
typedefint SElemType;
typedefstruct
{int*base;int*top;int stacksize;
}SqStack;#endif
 都放在根目录下,然后将Stack.cpp加进工程里。

在头文件里还应该有几个函数的声明。

#9


楼上的,StackEmpty忘了,呵呵,在这儿
#include "Stack.h" 

int StackEmpty(SqStack *S)
{
    if(S->top == S->base)
        return 1;
    else
     return 0;
}

还有,你确定是加#endi,好像是#endif吧,不过我加了#endif也不行,这下连编译都通不过了,就是这个#endif问题

#10


Stack.h
#define STACK_INIT_SIZE 100 
#define STACKINCREMENT 10 
#include <stdio.h> 
#include <stdlib.h> 

typedef int SElemType; 
typedef struct 

    int *base; 
    int *top; 
    int stacksize; 
}SqStack;
void InitStack(SqStack *S); 
void Pop(SqStack *S, int *e);
void Push(SqStack *S,int e);
int StackLength(SqStack *S);
int StackEmpty(SqStack *S);

#11


main.c
#include "Stack.h" 
void conversion (int Num) 
{  // 算法3.1 
    // 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数 
    SElemType e; 
    SqStack S; 
    InitStack(&S);      // 构造空栈 
    while (Num) 
    { 
        Push(&S, Num % 8); 
        Num = Num/8; 
    } 
printf("%d\n",StackLength(&S)); 
    while (!StackEmpty(&S)) 
    { 
        Pop(&S,&e); 
        printf ("%d", e); 
    } 
    printf("\n"); 
}

int main() 

    int n;
printf("input n:");
scanf("%d",&n);
conversion (n);
    getchar(); 
    return 0; 

#12


是#endif

给我私信,全部的代码。

#13


还有,我用的是.c的文件,不支持很多c++里的语法,我希望各位也能用.c文件,谢谢!

#14


Stack.c
#include "Stack.h" 
void InitStack(SqStack *S) 

    S->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE); 
    if(!S->base) 
    { 
        printf("Over Flow"); 
        exit(0); 
    } 
    S->top = S->base; 
    S->stacksize = STACK_INIT_SIZE; 
    return ; 


void Pop(SqStack *S, int *e) 

    if(S->top == S->base) 
    { 
        printf("栈空"); 
        exit(0); 
    } 
    *e = * --S->top; 


void Push(SqStack *S,int e) 

    if(S->top - S->base >= S->stacksize) 
    { 
        S->base = (int * ) realloc (S->base,(S->stacksize + STACKINCREMENT) * sizeof(int)); 
        if(!S->base) 
        { 
            printf("Over Flow"); 
            exit(0); 
        } 
        S->top = S->base +S->stacksize; 
        S->stacksize += STACKINCREMENT; 
    } 
    *S->top ++ = e; 


int StackLength(SqStack *S) 

int count = 0; 
SElemType *p = S->top; 
while(p!=S->base) 

count++; 
p--; 

return count; 

int StackEmpty(SqStack *S)
{
 if(S->top==S->base)
 return 1;
 else 
return 0;
}

#15


楼上的,我不是要放在同一个文件,我是想建一个工程,导入各函数

#16


lz的问题涉及到了VS的编译器工作的问题。
实质就是.h文件重复引用(以工程级的眼光看)。
解决方案如下:
1.VS98(vc6)以及之后版本使用:头文件最开始加 #pragma once
2. .h文件使用一次编译保护宏(系统生成的代码有类似的)
#ifndef XXXXXX_SOME_GLOBAL_UNIQUE_STRING_XXXX
#define  XXXXXX_SOME_GLOBAL_UNIQUE_STRING_XXXX

//代码放在这里保护起来

#endif

#17


引用 16 楼 ltmit 的回复:
lz的问题涉及到了VS的编译器工作的问题。
实质就是.h文件重复引用(以工程级的眼光看)。
解决方案如下:
1.VS98(vc6)以及之后版本使用:头文件最开始加 #pragma once
2. .h文件使用一次编译保护宏(系统生成的代码有类似的)
#ifndef XXXXXX_SOME_GLOBAL_UNIQUE_STRING_XXXX
#define  XXXXXX_SOME_GLOBAL_UNIQUE_STRING_XXXX

//代码放在这里保护起来

#endif

我用了#endif,可是出现了以下编译错误
stack.h(13) : fatal error C1020: unexpected #endif
怎么搞得阿,能不能具体说明一下?

#18


引用 16 楼 ltmit 的回复:
lz的问题涉及到了VS的编译器工作的问题。
实质就是.h文件重复引用(以工程级的眼光看)。
解决方案如下:
1.VS98(vc6)以及之后版本使用:头文件最开始加 #pragma once
2. .h文件使用一次编译保护宏(系统生成的代码有类似的)
#ifndef XXXXXX_SOME_GLOBAL_UNIQUE_STRING_XXXX
#define  XXXXXX_SOME_GLOBAL_UNIQUE_STRING_XXXX

//代码放在这里保护起来

#endif

我用了#pragma once,编译通过了,可还是运行不了,问题一样

#19


#endif报错的原因应该是前面没有对应得#ifXXX。lz请仔细看下代码有没有错的地方。
所谓“#pragma once,编译通过了,可还是运行不了”是什么意思?运行时出现了什么问题?
如果真的是运行时错误,那么平心而言,一般是代码本身的问题了。

#20


我重做了下,用VC++做的了,共7个文件,直接导入的:Stack.h,Initstack.c,StackEmpty.c,StackLength.c,Pop.c,Push.c,main.c:
Stack.h

#ifndef STACK_H
#define STACK_H
#define STACK_INIT_SIZE 100 
#define STACKINCREMENT 10 
#include <stdio.h> 
#include <stdlib.h> 

typedef int SElemType; 
typedef struct 

    int *base; 
    int *top; 
    int stacksize; 
}SqStack;

void InitStack(SqStack *S) ;
int StackEmpty(SqStack *S) ;
int StackLength(SqStack *S) ;
void Pop(SqStack *S, int *e) ;
void Push(SqStack *S,int e) ; 

#endif


Initstack.c

#include "Stack.h" 
void InitStack(SqStack *S) 

    S->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE); 
    if(!S->base) 
    { 
        printf("Over Flow"); 
        exit(0); 
    } 
    S->top = S->base; 
    S->stacksize = STACK_INIT_SIZE; 
    return ; 



StackEmpty.c

#include "Stack.h" 
int StackEmpty(SqStack *S) 

    if(S->top == S->base) 
        return 1; 
    else 
return 0; 
}


StackLength.c

#include "Stack.h" 
int StackLength(SqStack *S) 

int count = 0; 
SElemType *p = S->top; 
while(p!=S->base) 

count++; 
p--; 

return count; 
}


Pop.c

#include "Stack.h" 
void Pop(SqStack *S, int *e) 

    if(S->top == S->base) 
    { 
        printf("栈空"); 
        exit(0); 
    } 
    *e = * --S->top; 



Push.c

#include "Stack.h" 
void Push(SqStack *S,int e) 

    if(S->top - S->base >= S->stacksize) 
    { 
        S->base = (int * ) realloc (S->base,(S->stacksize + STACKINCREMENT) * sizeof(int)); 
        if(!S->base) 
        { 
            printf("Over Flow"); 
            exit(0); 
        } 
        S->top = S->base +S->stacksize; 
        S->stacksize += STACKINCREMENT; 
    } 
    *S->top ++ = e; 



main.c

#include "Stack.h"
void conversion (int Num) 
{  // 算法3.1 
    // 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数 
    SElemType e; 
    SqStack S; 
    InitStack(&S);      // 构造空栈 
    while (Num) 
    { 
        Push(&S, Num % 8); 
        Num = Num/8; 
    } 
printf("%d\n",StackLength(&S)); 
    while (!StackEmpty(&S)) 
    { 
        Pop(&S,&e); 
        printf ("%d", e); 
    } 
    printf("\n"); 
} // conversion 

int main() 

    conversion(9); 
    getchar(); 
    return 0; 

#21


这个程序应该不存在C和C++之间的问题,因为程序用的都是基本语句.
如果还有错,那就靠楼主自己调试了.
一步一步的调试,在conversion函数里,你可以一个语句一个语句的调试,不要一口气都调试完,这样你总能找到问题语句.

#22


20楼的
你的是vc6.0 吗,为什么我按你的写还是出现相同的错误
Pop.obj : error LNK2005: _Pop already defined in ClearStack.obj
StackEmpty.obj : error LNK2005: _StackEmpty already defined in ClearStack.obj
Debug/Stack.exe : fatal error LNK1169: one or more multiply defined symbols found
运行错误,这是错误提示

#23


我晕。。。。lz你怎么这样啊!~
在VS里,负责函数声明和实现的.h和.cpp(或者.c)是一一对应的。对应的判别依据就是 文件名一样!!
lz你不得不把你那些分.c文件的内容都放到stack.c里面去!!
是不是编译时出现“无法解析的外部符号”错误?是的话就是这个问题。

#24


引用 22 楼 xueresnowfoxsnowwolf 的回复:
20楼的
你的是vc6.0 吗,为什么我按你的写还是出现相同的错误
Pop.obj : error LNK2005: _Pop already defined in ClearStack.obj
StackEmpty.obj : error LNK2005: _StackEmpty already defined in ClearStack.obj
Debug/Stack.exe : fatal error LNK1169: one or more multiply defined symbols found
运行错误,这是错误提示

嗯,是VC6.0.
既然说Pop有错,那你就把有Pop的地方注释起来,看看还有什么错误.
一个一个函数来,一条语句一条语句来调试,总会找到问题所在的.

#25


lz。你的工程我用2005编译了,好像编译没问题。。。。

#26


引用 25 楼 ltmit 的回复:
lz。你的工程我用2005编译了,好像编译没问题。。。。

我一开始就说了能编译但不能运行阿,而且不是运行时出错,害我都没办法调试
我也觉得是头文件重复包含了,可不知道怎么解决,以上各位的方法我都试了,都不行,错误还是一样

#27


引用 26 楼 xueresnowfoxsnowwolf 的回复:
引用 25 楼 ltmit 的回复:
 lz。你的工程我用2005编译了,好像编译没问题。。。。

 我一开始就说了能编译但不能运行阿,而且不是运行时出错,害我都没办法调试
 我也觉得是头文件重复包含了,可不知道怎么解决,以上各位的方法我都试了,都不行,错误还是一样

我不是给你解决了吗?

#28


引用 27 楼 kouwenlong 的回复:
引用 26 楼 xueresnowfoxsnowwolf 的回复:
引用 25 楼 ltmit 的回复:
lz。你的工程我用2005编译了,好像编译没问题。。。。

我一开始就说了能编译但不能运行阿,而且不是运行时出错,害我都没办法调试
我也觉得是头文件重复包含了,可不知道怎么解决,以上各位的方法我都试了,都不行,错误还是一样

我不是给你解决了吗?

我看看有没有人能够 在不把各个函数文件放到一起的情况下解决这个问题,呵呵

#29


引用 28 楼 xueresnowfoxsnowwolf 的回复:
引用 27 楼 kouwenlong 的回复:
 引用 26 楼 xueresnowfoxsnowwolf 的回复:
 引用 25 楼 ltmit 的回复:
 lz。你的工程我用2005编译了,好像编译没问题。。。。

 我一开始就说了能编译但不能运行阿,而且不是运行时出错,害我都没办法调试
 我也觉得是头文件重复包含了,可不知道怎么解决,以上各位的方法我都试了,都不行,错误还是一样

 我不是给你解决了吗?

 我看看有没有人能够 在不把各个函数文件放到一起的情况下解决这个问题,呵呵

你是不是想每个函数单独放一个文件里?
如果是这样,你拆分,然后在加进工程里就行了。

#30


同志们,我搞定了
只要把#endif写在紧跟结构体的后面就可以了,楼上虽然有人说到了endif,但都是直接加在头文件最后。
#ifndef STACK_H 

#define STACK_H

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#include <stdio.h>
#include <stdlib.h>

typedef int SElemType;
typedef struct
{
    int *base;
    int *top;
    int stacksize;
}SqStack;
#endif

void InitStack(SqStack *S); 
void Pop(SqStack *S, int *e);
void Push(SqStack *S,int e);
int StackLength(SqStack *S);
int StackEmpty(SqStack *S);

问题就出在头文件的重复包含上,今晚,谢谢各位了,大家的互助精神是最强大的,嘿嘿,谢谢大家花了一个晚上时间帮助我,在此把最后答案贴上,也算对于这么长时间的回报了,嘿嘿,大家一起加油!

#31


引用 30 楼 xueresnowfoxsnowwolf 的回复:
同志们,我搞定了
只要把#endif写在紧跟结构体的后面就可以了,楼上虽然有人说到了endif,但都是直接加在头文件最后。#ifndef STACK_H
#define STACK_H

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#include <stdio.h>
#include <stdlib.h>

typedef int SElemType;
typedef struct
{
    int *base;
    int *top;
    int stacksize;
}SqStack;
#endif

void InitStack(SqStack *S);
void Pop(SqStack *S, int *e);
void Push(SqStack *S,int e);
int StackLength(SqStack *S);
int StackEmpty(SqStack *S);

问题就出在头文件的重复包含上,今晚,谢谢各位了,大家的互助精神是最强大的,嘿嘿,谢谢大家花了一个晚上时间帮助我,在此把最后答案贴上,也算对于这么长时间的回报了,嘿嘿,大家一起加油!


这个endif有点诡异了啊!
你前面都没有#if的宏定义?

#32


楼上都是牛人  学习啦 帮顶

#33


up

#34


lz有C语言版的,我用过!是一个搞数据结构的硕士写的!

#35


引用 31 楼 jianzhibeihang 的回复:
这个endif有点诡异了啊!
你前面都没有#if的宏定义?


呵呵,代码没排版好,#ifndef在第二行最后,看到了吧

#1


我们刚开始学习C语言,才学到指针。不懂哦。。。

#2


干嘛这么费劲,把所有的函数都放在一个*.cpp文件下,然后加入工程就行了。
你试试.

#3


引用 2 楼 kouwenlong 的回复:
干嘛这么费劲,把所有的函数都放在一个*.cpp文件下,然后加入工程就行了。
你试试.

我知道阿,可我不知道为什么将各文件导入工程就有问题啊 

#4


用vc工程也应该能运行,你要保证每个文件都在硬盘上的工程目录里,然后从vc的IDE把这些文件add进来。

#5


引用 4 楼 hbvanguard 的回复:
用vc工程也应该能运行,你要保证每个文件都在硬盘上的工程目录里,然后从vc的IDE把这些文件add进来。

这些我肯定知道阿,我编译都通过了,就是运行不了,有时间的话帮我看看吧

#6


实现文件:Stack.cpp
#include <stdio.h>
#include <stdlib.h>
#include "Stack.h"
void InitStack(SqStack *S)
{
    S->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE);
    if(!S->base)
    {
        printf("Over Flow");
        exit(0);
    }
    S->top = S->base;
    S->stacksize = STACK_INIT_SIZE;
    return ;
}
void Pop(SqStack *S, int *e)
{
    if(S->top == S->base)
    {
        printf("栈空");
        exit(0); 
    }
    *e = * --S->top;
}
void Push(SqStack *S,int e)

    if(S->top - S->base >= S->stacksize)
    {
        S->base = (int * ) realloc (S->base,(S->stacksize + STACKINCREMENT) * sizeof(int));
        if(!S->base)
        {
            printf("Over Flow");
            exit(0);
        }
        S->top = S->base +S->stacksize;
        S->stacksize += STACKINCREMENT;
    } 
    *S->top ++ = e; 

 
int StackLength(SqStack *S)

int count = 0; 
SElemType *p = S->top; 
while(p!=S->base) 

count++;
p--; 

return count; 


void conversion (int Num)
{  // 算法3.1 
    // 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数 
    SElemType e; 
    SqStack S; 
    InitStack(&S);      // 构造空栈 
    while (Num)
    { 
        Push(&S, Num % 8); 
        Num = Num/8; 
    }
printf("%d\n",StackLength(&S));
    while (!StackEmpty(&S))
    {
        Pop(&S,&e);
        printf ("%d", e);
    }
    printf("\n");
}

头文件:Stack.h
#ifndef STACK_H
#define STACK_H
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int SElemType;
typedef struct
{
    int *base;
    int *top;
    int stacksize;
}SqStack;
#endif

都放在根目录下,然后将Stack.cpp加进工程里。

#7


有几个问题:
1.Stack.h里的内容最好这样写:

#define STACK_INIT_SIZE 100 
#define STACKINCREMENT 10 
#include <stdio.h> 
#include <stdlib.h> 

typedef int SElemType; 
typedef struct 

    int *base; 
    int *top; 
    int stacksize; 
}SqStack; 
void Push(SqStack *S,int e) ;
void Pop(SqStack *S, int *e) ;
void InitStack(SqStack *S) ;
int StackLength(SqStack *S) ;


2.StackEmpty(&S)这个函数没定义;
3.我不知道convert函数是不是和main函数放一起的,因为你帖出来的文件没有convert.c文件。如果是在一起,就是你main.c包含了两个Stack.h,所以定义了两次SqStack,当然就错了。
所以,定义SqStack最好这样,即使包含两次也没问题:

#ifndef _STACK
#define _STACK
typedef struct 

    int *base; 
    int *top; 
    int stacksize; 
}SqStack; 
#endi

我运行没错了,就是少了StackEmpty函数的定义。

#8


引用 6 楼 kouwenlong 的回复:
实现文件:Stack.cpp
C/C++ code#include<stdio.h>
#include<stdlib.h>
#include"Stack.h"void InitStack(SqStack*S)
{
    S->base= (int*)malloc(sizeof(int)*STACK_INIT_SIZE);if(!S->base)
    {
        printf("Over Flow");
        exit(0);
    }
    S->top= S->base;
    S->stacksize= STACK_INIT_SIZE;return ;
}void Pop(SqStack*S,int*e)
{if(S->top== S->base)
    {
        printf("栈空");
        exit(0); 
    }*e=*--S->top;
}void Push(SqStack*S,int e)
{if(S->top- S->base>= S->stacksize)
    {
        S->base= (int* ) realloc (S->base,(S->stacksize+ STACKINCREMENT)*sizeof(int));if(!S->base)
        {
            printf("Over Flow");
            exit(0);
        }
        S->top= S->base+S->stacksize;
        S->stacksize+= STACKINCREMENT;
    }*S->top++= e; 
}int StackLength(SqStack*S)
{int count=0; 
SElemType*p= S->top;while(p!=S->base) 

count++;
p--; 
}return count; 
}void conversion (int Num)
{// 算法3.1// 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数    SElemType e; 
    SqStack S; 
    InitStack(&S);// 构造空栈while (Num)
    { 
        Push(&S, Num%8); 
        Num= Num/8; 
    }
printf("%d\n",StackLength(&S));while (!StackEmpty(&S))
    {
        Pop(&S,&e);
        printf ("%d", e);
    }
    printf("\n");
}
 头文件:Stack.h
C/C++ code#ifndef STACK_H#define STACK_H#define STACK_INIT_SIZE 100#define STACKINCREMENT 10
typedefint SElemType;
typedefstruct
{int*base;int*top;int stacksize;
}SqStack;#endif
 都放在根目录下,然后将Stack.cpp加进工程里。

在头文件里还应该有几个函数的声明。

#9


楼上的,StackEmpty忘了,呵呵,在这儿
#include "Stack.h" 

int StackEmpty(SqStack *S)
{
    if(S->top == S->base)
        return 1;
    else
     return 0;
}

还有,你确定是加#endi,好像是#endif吧,不过我加了#endif也不行,这下连编译都通不过了,就是这个#endif问题

#10


Stack.h
#define STACK_INIT_SIZE 100 
#define STACKINCREMENT 10 
#include <stdio.h> 
#include <stdlib.h> 

typedef int SElemType; 
typedef struct 

    int *base; 
    int *top; 
    int stacksize; 
}SqStack;
void InitStack(SqStack *S); 
void Pop(SqStack *S, int *e);
void Push(SqStack *S,int e);
int StackLength(SqStack *S);
int StackEmpty(SqStack *S);

#11


main.c
#include "Stack.h" 
void conversion (int Num) 
{  // 算法3.1 
    // 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数 
    SElemType e; 
    SqStack S; 
    InitStack(&S);      // 构造空栈 
    while (Num) 
    { 
        Push(&S, Num % 8); 
        Num = Num/8; 
    } 
printf("%d\n",StackLength(&S)); 
    while (!StackEmpty(&S)) 
    { 
        Pop(&S,&e); 
        printf ("%d", e); 
    } 
    printf("\n"); 
}

int main() 

    int n;
printf("input n:");
scanf("%d",&n);
conversion (n);
    getchar(); 
    return 0; 

#12


是#endif

给我私信,全部的代码。

#13


还有,我用的是.c的文件,不支持很多c++里的语法,我希望各位也能用.c文件,谢谢!

#14


Stack.c
#include "Stack.h" 
void InitStack(SqStack *S) 

    S->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE); 
    if(!S->base) 
    { 
        printf("Over Flow"); 
        exit(0); 
    } 
    S->top = S->base; 
    S->stacksize = STACK_INIT_SIZE; 
    return ; 


void Pop(SqStack *S, int *e) 

    if(S->top == S->base) 
    { 
        printf("栈空"); 
        exit(0); 
    } 
    *e = * --S->top; 


void Push(SqStack *S,int e) 

    if(S->top - S->base >= S->stacksize) 
    { 
        S->base = (int * ) realloc (S->base,(S->stacksize + STACKINCREMENT) * sizeof(int)); 
        if(!S->base) 
        { 
            printf("Over Flow"); 
            exit(0); 
        } 
        S->top = S->base +S->stacksize; 
        S->stacksize += STACKINCREMENT; 
    } 
    *S->top ++ = e; 


int StackLength(SqStack *S) 

int count = 0; 
SElemType *p = S->top; 
while(p!=S->base) 

count++; 
p--; 

return count; 

int StackEmpty(SqStack *S)
{
 if(S->top==S->base)
 return 1;
 else 
return 0;
}

#15


楼上的,我不是要放在同一个文件,我是想建一个工程,导入各函数

#16


lz的问题涉及到了VS的编译器工作的问题。
实质就是.h文件重复引用(以工程级的眼光看)。
解决方案如下:
1.VS98(vc6)以及之后版本使用:头文件最开始加 #pragma once
2. .h文件使用一次编译保护宏(系统生成的代码有类似的)
#ifndef XXXXXX_SOME_GLOBAL_UNIQUE_STRING_XXXX
#define  XXXXXX_SOME_GLOBAL_UNIQUE_STRING_XXXX

//代码放在这里保护起来

#endif

#17


引用 16 楼 ltmit 的回复:
lz的问题涉及到了VS的编译器工作的问题。
实质就是.h文件重复引用(以工程级的眼光看)。
解决方案如下:
1.VS98(vc6)以及之后版本使用:头文件最开始加 #pragma once
2. .h文件使用一次编译保护宏(系统生成的代码有类似的)
#ifndef XXXXXX_SOME_GLOBAL_UNIQUE_STRING_XXXX
#define  XXXXXX_SOME_GLOBAL_UNIQUE_STRING_XXXX

//代码放在这里保护起来

#endif

我用了#endif,可是出现了以下编译错误
stack.h(13) : fatal error C1020: unexpected #endif
怎么搞得阿,能不能具体说明一下?

#18


引用 16 楼 ltmit 的回复:
lz的问题涉及到了VS的编译器工作的问题。
实质就是.h文件重复引用(以工程级的眼光看)。
解决方案如下:
1.VS98(vc6)以及之后版本使用:头文件最开始加 #pragma once
2. .h文件使用一次编译保护宏(系统生成的代码有类似的)
#ifndef XXXXXX_SOME_GLOBAL_UNIQUE_STRING_XXXX
#define  XXXXXX_SOME_GLOBAL_UNIQUE_STRING_XXXX

//代码放在这里保护起来

#endif

我用了#pragma once,编译通过了,可还是运行不了,问题一样

#19


#endif报错的原因应该是前面没有对应得#ifXXX。lz请仔细看下代码有没有错的地方。
所谓“#pragma once,编译通过了,可还是运行不了”是什么意思?运行时出现了什么问题?
如果真的是运行时错误,那么平心而言,一般是代码本身的问题了。

#20


我重做了下,用VC++做的了,共7个文件,直接导入的:Stack.h,Initstack.c,StackEmpty.c,StackLength.c,Pop.c,Push.c,main.c:
Stack.h

#ifndef STACK_H
#define STACK_H
#define STACK_INIT_SIZE 100 
#define STACKINCREMENT 10 
#include <stdio.h> 
#include <stdlib.h> 

typedef int SElemType; 
typedef struct 

    int *base; 
    int *top; 
    int stacksize; 
}SqStack;

void InitStack(SqStack *S) ;
int StackEmpty(SqStack *S) ;
int StackLength(SqStack *S) ;
void Pop(SqStack *S, int *e) ;
void Push(SqStack *S,int e) ; 

#endif


Initstack.c

#include "Stack.h" 
void InitStack(SqStack *S) 

    S->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE); 
    if(!S->base) 
    { 
        printf("Over Flow"); 
        exit(0); 
    } 
    S->top = S->base; 
    S->stacksize = STACK_INIT_SIZE; 
    return ; 



StackEmpty.c

#include "Stack.h" 
int StackEmpty(SqStack *S) 

    if(S->top == S->base) 
        return 1; 
    else 
return 0; 
}


StackLength.c

#include "Stack.h" 
int StackLength(SqStack *S) 

int count = 0; 
SElemType *p = S->top; 
while(p!=S->base) 

count++; 
p--; 

return count; 
}


Pop.c

#include "Stack.h" 
void Pop(SqStack *S, int *e) 

    if(S->top == S->base) 
    { 
        printf("栈空"); 
        exit(0); 
    } 
    *e = * --S->top; 



Push.c

#include "Stack.h" 
void Push(SqStack *S,int e) 

    if(S->top - S->base >= S->stacksize) 
    { 
        S->base = (int * ) realloc (S->base,(S->stacksize + STACKINCREMENT) * sizeof(int)); 
        if(!S->base) 
        { 
            printf("Over Flow"); 
            exit(0); 
        } 
        S->top = S->base +S->stacksize; 
        S->stacksize += STACKINCREMENT; 
    } 
    *S->top ++ = e; 



main.c

#include "Stack.h"
void conversion (int Num) 
{  // 算法3.1 
    // 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数 
    SElemType e; 
    SqStack S; 
    InitStack(&S);      // 构造空栈 
    while (Num) 
    { 
        Push(&S, Num % 8); 
        Num = Num/8; 
    } 
printf("%d\n",StackLength(&S)); 
    while (!StackEmpty(&S)) 
    { 
        Pop(&S,&e); 
        printf ("%d", e); 
    } 
    printf("\n"); 
} // conversion 

int main() 

    conversion(9); 
    getchar(); 
    return 0; 

#21


这个程序应该不存在C和C++之间的问题,因为程序用的都是基本语句.
如果还有错,那就靠楼主自己调试了.
一步一步的调试,在conversion函数里,你可以一个语句一个语句的调试,不要一口气都调试完,这样你总能找到问题语句.

#22


20楼的
你的是vc6.0 吗,为什么我按你的写还是出现相同的错误
Pop.obj : error LNK2005: _Pop already defined in ClearStack.obj
StackEmpty.obj : error LNK2005: _StackEmpty already defined in ClearStack.obj
Debug/Stack.exe : fatal error LNK1169: one or more multiply defined symbols found
运行错误,这是错误提示

#23


我晕。。。。lz你怎么这样啊!~
在VS里,负责函数声明和实现的.h和.cpp(或者.c)是一一对应的。对应的判别依据就是 文件名一样!!
lz你不得不把你那些分.c文件的内容都放到stack.c里面去!!
是不是编译时出现“无法解析的外部符号”错误?是的话就是这个问题。

#24


引用 22 楼 xueresnowfoxsnowwolf 的回复:
20楼的
你的是vc6.0 吗,为什么我按你的写还是出现相同的错误
Pop.obj : error LNK2005: _Pop already defined in ClearStack.obj
StackEmpty.obj : error LNK2005: _StackEmpty already defined in ClearStack.obj
Debug/Stack.exe : fatal error LNK1169: one or more multiply defined symbols found
运行错误,这是错误提示

嗯,是VC6.0.
既然说Pop有错,那你就把有Pop的地方注释起来,看看还有什么错误.
一个一个函数来,一条语句一条语句来调试,总会找到问题所在的.

#25


lz。你的工程我用2005编译了,好像编译没问题。。。。

#26


引用 25 楼 ltmit 的回复:
lz。你的工程我用2005编译了,好像编译没问题。。。。

我一开始就说了能编译但不能运行阿,而且不是运行时出错,害我都没办法调试
我也觉得是头文件重复包含了,可不知道怎么解决,以上各位的方法我都试了,都不行,错误还是一样

#27


引用 26 楼 xueresnowfoxsnowwolf 的回复:
引用 25 楼 ltmit 的回复:
 lz。你的工程我用2005编译了,好像编译没问题。。。。

 我一开始就说了能编译但不能运行阿,而且不是运行时出错,害我都没办法调试
 我也觉得是头文件重复包含了,可不知道怎么解决,以上各位的方法我都试了,都不行,错误还是一样

我不是给你解决了吗?

#28


引用 27 楼 kouwenlong 的回复:
引用 26 楼 xueresnowfoxsnowwolf 的回复:
引用 25 楼 ltmit 的回复:
lz。你的工程我用2005编译了,好像编译没问题。。。。

我一开始就说了能编译但不能运行阿,而且不是运行时出错,害我都没办法调试
我也觉得是头文件重复包含了,可不知道怎么解决,以上各位的方法我都试了,都不行,错误还是一样

我不是给你解决了吗?

我看看有没有人能够 在不把各个函数文件放到一起的情况下解决这个问题,呵呵

#29


引用 28 楼 xueresnowfoxsnowwolf 的回复:
引用 27 楼 kouwenlong 的回复:
 引用 26 楼 xueresnowfoxsnowwolf 的回复:
 引用 25 楼 ltmit 的回复:
 lz。你的工程我用2005编译了,好像编译没问题。。。。

 我一开始就说了能编译但不能运行阿,而且不是运行时出错,害我都没办法调试
 我也觉得是头文件重复包含了,可不知道怎么解决,以上各位的方法我都试了,都不行,错误还是一样

 我不是给你解决了吗?

 我看看有没有人能够 在不把各个函数文件放到一起的情况下解决这个问题,呵呵

你是不是想每个函数单独放一个文件里?
如果是这样,你拆分,然后在加进工程里就行了。

#30


同志们,我搞定了
只要把#endif写在紧跟结构体的后面就可以了,楼上虽然有人说到了endif,但都是直接加在头文件最后。
#ifndef STACK_H 

#define STACK_H

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#include <stdio.h>
#include <stdlib.h>

typedef int SElemType;
typedef struct
{
    int *base;
    int *top;
    int stacksize;
}SqStack;
#endif

void InitStack(SqStack *S); 
void Pop(SqStack *S, int *e);
void Push(SqStack *S,int e);
int StackLength(SqStack *S);
int StackEmpty(SqStack *S);

问题就出在头文件的重复包含上,今晚,谢谢各位了,大家的互助精神是最强大的,嘿嘿,谢谢大家花了一个晚上时间帮助我,在此把最后答案贴上,也算对于这么长时间的回报了,嘿嘿,大家一起加油!

#31


引用 30 楼 xueresnowfoxsnowwolf 的回复:
同志们,我搞定了
只要把#endif写在紧跟结构体的后面就可以了,楼上虽然有人说到了endif,但都是直接加在头文件最后。#ifndef STACK_H
#define STACK_H

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#include <stdio.h>
#include <stdlib.h>

typedef int SElemType;
typedef struct
{
    int *base;
    int *top;
    int stacksize;
}SqStack;
#endif

void InitStack(SqStack *S);
void Pop(SqStack *S, int *e);
void Push(SqStack *S,int e);
int StackLength(SqStack *S);
int StackEmpty(SqStack *S);

问题就出在头文件的重复包含上,今晚,谢谢各位了,大家的互助精神是最强大的,嘿嘿,谢谢大家花了一个晚上时间帮助我,在此把最后答案贴上,也算对于这么长时间的回报了,嘿嘿,大家一起加油!


这个endif有点诡异了啊!
你前面都没有#if的宏定义?

#32


楼上都是牛人  学习啦 帮顶

#33


up

#34


lz有C语言版的,我用过!是一个搞数据结构的硕士写的!

#35


引用 31 楼 jianzhibeihang 的回复:
这个endif有点诡异了啊!
你前面都没有#if的宏定义?


呵呵,代码没排版好,#ifndef在第二行最后,看到了吧