| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 358 人关注过本帖
标题:求帮忙改错!拜托.....
只看楼主 加入收藏
whxych
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2014-4-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
求帮忙改错!拜托.....
# include<stdio.h>
# include<malloc.h>
typedef struct snode*slink;
typedef struct snode{int element;slink next;}
StackNode;
typedef struct lstack*Stack;
typedef struct lstack{
     slink top;
}Lstack;
   Stack StackInit()
{
   Stack S=(Lstack*)malloc(sizeof*S);
   S->top=0;
   return S;
}
  slink NewStackNode()
{
  slink p;
  if((p=((StackNode*)malloc(sizeof(StackNode)))==0
  printf ("ERROR")
else
  return p;
}
  int StackFull(Stack S)
{
  slink p;
  if((p=(StackNode*)malloc(sizeof(StackNode)))==0)
  return 1;
else
{
    free(p);
    return 0;
}
}
  int StackEmpty(Stack S)
  {
  slink p;
  if(StackFull(S))
    printf("Stack is full");
  p=NewStackNode();
  p->element=x;
  p->next=S->top;
  S->top=p;
  }
  int pop(Stack S)
  {
      slink p;
      int x;
      if(StackEmpty(s))
          printf("Stack is empty");
      x=S->top->element;
      p=S->top;
      S->top=->next;
      free (p);
      return x;
  }
  StackItem StackTop(Stack S)
  {
      if(StackEmoty(S))Error("Stack is empty");
      else return S->top->element;
  }
  void main()
  {
  int i,x,a,b,c;
  Lstack L;
  Stack S=&L;
  StackInit();
  printf("从键盘输入4个入栈的值:")
  for(i=0;i<4;i++)
  {
   scanf("%d",&x);
   push(x,S);
  }
  printf("栈顶元素为:%d\n",StackTop(S))
  a=pop(S)
  b=pop(S)
  c=pop(S)
  push(a,S)
  printf("栈顶元素为:%d\n",StackTop(S))
  }
搜索更多相关主题的帖子: element include return 
2014-04-14 19:06
Andrew_Lee
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:185
专家分:626
注 册:2014-3-21
收藏
得分:10 
基本上编译错误都清楚了,还有两个:一个是StackEmpty()中的一个x没有声明,再一个就是StackItem 这个类型在整个程序中就没有声明,编译器不知道这是什么类型。
程序代码:
# include<stdio.h>
# include<malloc.h>
typedef struct snode{
    int element;
    struct snode* next;
}StackNode;
typedef struct snode* slink;

typedef struct lstack{
     slink top;
}Lstack;

typedef struct lstack* Stack;

Stack StackInit()
{
   Stack S=(Lstack*)malloc(sizeof*S);
   S->top=0;
   return S;
}

slink NewStackNode()
{
  slink p;
  if((p=((StackNode*)malloc(sizeof(StackNode))))==0)
  printf("ERROR");
  else
  return p;
}

int StackFull(Stack S)
{
    slink p;
    if((p=(StackNode*)malloc(sizeof(StackNode)))==0)
        return 1;
    else
    {
        free(p);
        return 0;
    }
}

 int StackEmpty(Stack S)

 {
      slink p;
      if(StackFull(S))
        printf("Stack is full");
      p=NewStackNode();
      p->element=x; /* 这里的x未声明 */
      p->next=S->top;
      S->top=p;

 }


 int pop(Stack S)

 {
      slink p;
      int x;
      if(StackEmpty(S))
          printf("Stack is empty");
      x=S->top->element;
      p=S->top;
      S->top=->next;
      free (p);
      return x;

 }

 /*StackItem 这个类型没有声明 */

 StackItem StackTop(Stack S)

 {
      if(StackEmoty(S))Error("Stack is empty");
      else return S->top->element;

 }


 void main()

 {
      int i,x,a,b,c;
      Lstack L;
      Stack S=&L;
      StackInit();
      printf("从键盘输入4个入栈的值:");
      for(i=0;i<4;i++)
      {
           scanf("%d",&x);
           push(x,S);
      }
      printf("栈顶元素为:%d\n",StackTop(S));
      a=pop(S);
      b=pop(S);
      c=pop(S);
      push(a,S);
      printf("栈顶元素为:%d\n",StackTop(S));

 } 
2014-04-14 21:09
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:10 
我实在是改不动了~~
程序代码:
# include<stdio.h>
# include<malloc.h>

typedef struct snode *slink;
typedef struct snode
{
    int element;
    slink next;
}StackNode;

typedef struct lstack *Stack;
typedef struct lstack
{
    slink top;
}Lstack;


Stack StackInit()
{
   Stack S=(Lstack*)malloc(sizeof*S); // 这里是调用malloc函数,看着反正是怪怪的。。
                                      // 感觉前面的typedef用的有点画蛇添足。。
   S->top=0;
   return S;   // 这里有返回值,但是main函数里面并没有一个变量来接收它
}


slink NewStackNode()
{
  slink p;
  if((p=((StackNode*)malloc(sizeof(StackNode)))==0 // 这里的if语句咋这么别扭 0.0
  printf ("ERROR") // 分号没有,呃,建议楼主先找下教材,比着书本敲一敲几个长的经典的代码
else
  return p;       // 这里也有问题,嗯,并没有所有的分支语句都有return路径,
                  // 编译时,编译器应该是会报错提醒
}


int StackFull(Stack S)
{  // 这个是?内存分配失败的意思吗。。。
  slink p;
  if((p=(StackNode*)malloc(sizeof(StackNode)))==0)
  return 1;
else
{
    free(p);
    return 0;
}
}


int StackEmpty(Stack S)
{   // 这个函数的意思应该是说,如果链表还是空的,怎么开始建立链表吧。
  slink p;
  if(StackFull(S))  // 同样这里调用函数应该是参数传递出现问题。
                    // 上一句的p和StackFull()被调函数里面的p不是同一个p,
                    // 它们有不同的生存期和作用域,建议楼主再复习一下函数的参数传递相关知识
    printf("Stack is full");
  p=NewStackNode();
  p->element=x;     // 同样是变量作用域和有效期问题,,这里的x和main里面的x不是一个东西。
  p->next=S->top;
  S->top=p;
  }


int pop(Stack S)
{ // 续接结点
      slink p;
      int x;
      if(StackEmpty(s))
          printf("Stack is empty");
      x=S->top->element;
      p=S->top;
      S->top=->next;
      free (p);
      return x;
  }
  

StackItem StackTop(Stack S)
  {
      if(StackEmoty(S))Error("Stack is empty");
      else return S->top->element;
  }


void main()
{
    int i,x,a,b,c;
    Lstack L;   // 这里的L应该是struct lstack类型,但是struct lstack类型里面是 slink
                // 类型,slink是指向struct snode的指针。这个 Lstack L 本身只给slink
                // 分配了内存空间(指针变量的空间),并没有给数组非配空间。
    Stack S=&L; // 这里应该是用做头结点的,但是下面的StackInit()并没有和这里的S联系起来
                // 所以一般情况下,如果从S访问链表神马的,会断链,然后或者是非法访问某内存

    StackInit(); 
    printf("从键盘输入4个入栈的值:"); // 少了分号
    for(i=0;i<4;i++)
    {  // 应该是旨在接入四个结点。
        scanf("%d",&x);
        push(x,S);     // 实在是没找到push()函数
    }
    printf("栈顶元素为:%d\n",StackTop(S));
    a=pop(S);                                  // 各种没有分号
    b=pop(S);
    c=pop(S);
    push(a,S);
    printf("栈顶元素为:%d\n",StackTop(S));
}

未知令人期待!
2014-04-14 22:13
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
根据我理解的楼主的意思,重新编了一套程序。。。呃,建议楼主重新学习一下基础知识~

程序代码:
#include<stdio.h>
#include<stdlib.h>

#define LEN sizeof(STACKNODE)
// 数组定义
typedef struct snode
{
    int element;
    struct snode *next;
}STACKNODE;  // 变量定义时候用 STACKNODE *p; 就表示定义了一个struct snode型的指针了


// 因为楼主的程序,有一部分我没有理解到位,做什么用的,所以我尽量以我能理解到的内容改编
// 了一下程序,另外,typedef的定义我只用了一个。
// 我理解为,楼主想要创建的是一个后入先出的那种单链表。。

// 函数名称:NewStack
// 函数作用:创建新的结点栈,返回地址
// 建立时间:2014年4月14日21:28:20
// 返回值类型:STACKNODE *
// 形式参数:void
STACKNODE *NewStack(void)
{
    STACKNODE *p = NULL;
    if (NULL == (p = (STACKNODE *)malloc(LEN)) )
    {    
        fprintf(stdout, "Stack creat FAILED.\n");
        exit(0);
    }
    return(p);
}

// 函数名称:Assign
// 函数作用:通过参数传递给参数传递过来的指针指向的构造体变量的element变量成员赋值
// 建立时间:2014年4月14日21:48:28
// 返回值类型:void
// 形式参数:STACKNODE *, int
void Assign(STACKNODE *temp, int x)
{
    if (NULL == temp)
    {
        fprintf(stdout, "Pointer is NULL.\n");
        exit(0);
    }
    else
    {
        temp->element = x;
    }
}

// 函数名称:Connet
// 函数作用:把新的结点栈接入链表中,保持后入先出的顺序,即接在头结点之前
// 建立时间:2014年4月14日21:37:05
// 返回值类型:STACKNODE * 
// 形式参数:STACKNODE *, STACKNODE *
STACKNODE *Connect(STACKNODE *linkList, STACKNODE *newStack)
{
    if (NULL == newStack)
    {
        fprintf(stdout, "Pointer is NULL.\n");
        exit(0);
    }    
    else
    {
        newStack->next = linkList;
    }
    return(newStack);
}

// 函数名称:Print
// 函数作用:通过头结点,输出栈顶元素
// 建立时间:2014年4月14日21:52:45
// 返回值类型:void
// 形式参数:STACKNODE *
void Print(STACKNODE *head)
{
    if (NULL == head)
    {
        fprintf(stdout, "Link_list is NULL.\n");
        exit(0);
    }
    else
    {
        fprintf(stdout, "现在,栈顶元素值是:%d\n", head->element);
    }
}

// 函数名称:main
// 建立时间:2014年4月14日21:55:40
void main()
{
    int x;
    int i;
    STACKNODE *head = NULL;
    STACKNODE *temp = NULL;
    
    for (i = 0; i < 4; i++)
    {
        temp = NewStack();
        fprintf(stdout, "请输入第%d个元素:\n", i+1);
        fscanf(stdin, "%d", &x);
        fflush(stdin);
        Assign(temp, x);
        head = Connect(head, temp);
        Print(head);
    }
}

未知令人期待!
2014-04-14 22:15
快速回复:求帮忙改错!拜托.....
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020553 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved