网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月23日漏签0天
c语言吧 关注:801,255贴子:4,371,700
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 11回复贴,共1页
<<返回c语言吧
>0< 加载中...

单向链表问题

  • 只看楼主
  • 收藏

  • 回复
  • 黑緢灬
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
用单链表模拟的堆栈……也许挫了点
这是结构体
struct letter_{
char save;
struct letter_ *last_ptr;
};
typedef struct letter_ stack;
//为新节点分配内存并把数据扔进去
int AddStack(stack *sptr,char data)
{
stack *temp = NULL;
if((temp=(stack*)malloc(sizeof(stack)))==NULL)
{
puts("Error to deliver space to the new element of the stack.");
return 0;
}
temp->save = data;
temp->last_ptr = sptr;
sptr = temp;
return 1;
}
//检查链表有多少个节点
int CheckStack(stack *sptr)
{
stack *t_sptr = sptr;
int number;
//for这里条件设置得有点复杂……凑合一下吧
for(number = 0;t_sptr->last_ptr!=NULL;number++)
{
#ifdef check
puts("For loop are doing.");
#endif
t_sptr = t_sptr->last_ptr;
}
return number;
}
然后运行时执行CheckStack总是返回0
是Add那里就已经写错了还是Check的判断出现了逻辑错误?
找了2天 木有找到 =。=



  • 黑緢灬
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
//再贴一段执行代码……恩 OutStack是出栈函数 由于Check一直为0所以无法执行OutStack
所以那段函数代码就不贴出来了=。=
int main(int argc, char* argv[])
{
stack head = {'\0',NULL};
stack *bottom = &head;
char temp;
puts("Enter the string.");
while((temp=getchar())!=EOF)
{
if(temp=='\0') temp = '.';
AddStack(bottom,temp);
}
printf("Now,the stack has %d letters.\n",CheckStack(bottom));
while(CheckStack(bottom))
{
putchar(OutStack(bottom));
}
return 0;
}


2025-11-23 20:15:02
广告
不感兴趣
开通SVIP免广告
  • zx101y
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不应该是temp->last_ptr=NULL;吗?


  • 寒云似雾
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
sptr = temp;这句搞神马?


  • 寒云似雾
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
stack *AddStack(stack *sptr,char data){
stack *temp = (stack*)malloc(sizeof(stack));
if(temp){temp->save = data;temp->last_ptr = sptr;}
return temp;
}


  • 网络吸血鬼幻影
  • 路人
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
stack *sptr AddStack(stack *sptr,char data)
{
stack *temp = NULL;
if((temp=(stack*)malloc(sizeof(stack)))==NULL)
{
puts("Error to deliver space to the new element of the stack.");
return 0;
}
temp->save = data;
temp->last_ptr = sptr;
sptr = temp;
return sptr;
}
看上去像是没有返回任何指针。对栈不是了解,所以就无能为力了。



  • 寒云似雾
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
另外当前栈指针一般是top而不是bottom


  • 我是不是师兄
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
每次添加节点都加在同一个节点前面 然后检查是检查这个节点后面
你可以试试
stack* AddStack(stack *sptr,char data)
{
stack *temp = NULL;
if((temp=(stack*)malloc(sizeof(stack)))==NULL)
{
puts("Error to deliver space to the new element of the stack.");
return 0;
}
temp->save = data;
temp->last_ptr = sptr;
return temp;
}
然后在main函数里面
while((temp=getchar())!=EOF)
{
if(temp=='\0') temp = '.';
bottom=AddStack(bottom,temp);
}
应该可以 你试试


2025-11-23 20:09:02
广告
不感兴趣
开通SVIP免广告
  • 寒云似雾
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
NC中,干脆直接发一个完整的抽象
#include <stdio.h>
#include <stdlib.h>
typedef struct node_s{struct node_s*last_ptr;char save;}node_t;
typedef struct stack_s{struct node_s*top;}stack_t;
int AddStack(stack_t *sptr,char data){
    if(!sptr)return 0;
    node_t *temp = (node_t*)malloc(sizeof(node_t));
    if(temp){
        temp->save = data;
        temp->last_ptr = sptr->top;
        sptr->top = temp;
        return 1;
    }else return 0;
}
int PopStack(stack_t *sptr){
    if(!sptr)return 0;
    node_t *temp = sptr->top;
    if(temp){
        sptr->top=temp->last_ptr;
        free(temp);
        return 1;
    }else return 0;
}
int OutStack(stack_t *sptr){
    if(!sptr||!sptr->top)return 0;
    char temp=sptr->top->save;
    PopStack(sptr);
    return temp;
}
int CheckStack(stack_t stack){
    int cnt=0;
    for(;stack.top;++cnt,stack.top=stack.top->last_ptr);
    return cnt;
}
int main(int argc, char* argv[]){
    stack_t stack={0};
    
    char temp;
    puts("Enter the string.");
    while((temp=getchar())!=EOF){
        if(temp=='\0') temp = '.';
        AddStack(&stack,temp);
    }
    printf("Now,the stack has %d letters.\n",CheckStack(stack));
    while(CheckStack(stack)){
        putchar(OutStack(&stack));
    }
    return 0;
}


  • 寒云似雾
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
while(stack.top){
putchar(stack.top->save);
PopStack(&stack);
}


  • 黑緢灬
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
语义问题就表纠结了
貌似是我对结构体指针理解有错误
sptr = temp;
本意是想将sptr指向temp所指的内存位置
……这么做是不可以的嘛?


  • 黑緢灬
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
终于解决了……程序搞定……又学到了不少东西


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 11回复贴,共1页
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示