| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2502 人关注过本帖
标题:关于串链表求子串的算法,一直运行不了,求帮助
只看楼主 加入收藏
Unxglwy
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-11-13
收藏
 问题点数:0 回复次数:8 
关于串链表求子串的算法,一直运行不了,求帮助
代码如下:
#include<stdio.h>
#include<stdlib.h>
//#define NULL 0
typedef struct node
{
    char ch;
    int len;
    struct node *next;
}STRNODE;                 //串的链式存储结构表示
int str_len(STRNODE *s)
{
    return s->len;
}
void str_input(STRNODE *s)
{
    char ch;
    STRNODE *p,*q;
    p=s;
    q=s->next;
    s->len=0;
    while((ch=getchar())!='\n')
    {
        q=(STRNODE*)malloc(sizeof(STRNODE));
        q->ch=ch;
        q->next=NULL;
        p->next=q;
        p=q;
        s->len++;
    }
}
void str_sub(STRNODE *sub,STRNODE *s,int pos,int len)
{
    STRNODE *p,*q;
    int i=0,t=0;
    p=s->next;
    q=sub;
    while(p!=NULL&&i!=pos)
    {
        i++;
        p=p->next;
    }
    while(p!=NULL&&t!=len)
    {
        q->ch=p->ch;
        p=p->next;
        q->len++;
        t++;
    }
}
void str_output(STRNODE *s)
{
    STRNODE *p;
    p=s->next;
    int i;
    for(i=0;i<str_len(s);i++)
    {
        putchar(p->ch);
        p=p->next;
    }
    printf("\n");
}
int main()
{
    STRNODE str,str1;
    int pos,len;
    printf("请输入一段字符串:");
    str_input(&str1);
    printf("请输入插入的位置及长度:");
    scanf("%d %d",&pos,&len);
    str_sub(&str,&str1,pos,len);
    printf("子串为:");
    str_output(&str);
    return ;
}
运行结果如下:
图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2016-11-13 23:29编辑过]

搜索更多相关主题的帖子: include return 
2016-11-13 22:45
Unxglwy
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-11-13
收藏
得分:0 
有大神教教吗
2016-11-13 23:14
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
问题被查出来了,一个细节,改一个字母就行~
程序代码:
   for(i=0;i<p->len;i++)//是s->len不是p->len
    {
        putchar(p->ch);
        p=p->next;
    }

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-13 23:50
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 2楼 Unxglwy
怎么~这么快又有新问题了~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-13 23:52
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
str里面都没有初始化字母~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-14 00:18
Unxglwy
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-11-13
收藏
得分:0 
回复 5楼 九转星河
图片附件: 游客没有浏览图片的权限,请 登录注册

运行结果:
图片附件: 游客没有浏览图片的权限,请 登录注册

怎么改这段代码啊?
2016-11-14 00:29
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
str是单个变量,所以程序运行到void str_output就出错,毕竟str.next是一个野指针。
修改void str_sub(STRNODE *sub,STRNODE *s,int pos,int len)这个函数,申请str后续结点空间,并放入元素。
或者利用str1.len直接申请一个大小为sizeof(STRNODE)*str1.len大小的空间。
2016-11-14 09:39
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
诶,你那个代码我有时间再慢慢细看,我现阶段也是在学习链表~正好借你题来作为练习……你那题我真的要自己重做一遍才理解~
虽然我的代码风格和你的不同,但功能应该是能够实现的~
当然,我的代码不一定能帮你解决问题,但也许会对你有所帮助~
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(Node)
void creat(int flag);
void print();
void Insert();
typedef struct Node
{
    char ch;
    struct Node *next;
}Node;
Node *head=NULL,*head_2=NULL,*end=NULL;//head和head_2分别代表原字符串和子字符串的头,end代表子字符串的尾
int n=0,n2=0;//n为统计原字符串的字符数目,n2为统计子字符串的字符数目,略加修改后可以省略
void creat(int flag)//为了书写方便,原字符串和子字符串都写在一个函数里了,其实是可以分开写的~
{
    struct Node *p1,*p2;
    printf("请输入字符串\n");
    p1=p2=(Node*)malloc(LEN);
    fflush(stdin);
    while ((p1->ch=getchar())!='\n')
    {
        if (flag==0)n++;
        else n2++;
        if (n==1&&flag==0)head=p1;
        else if (n2==1&&flag==1)head_2=p1;
        else p2->next=p1;
        p2=p1;
        p1=(Node*)malloc(LEN);
    }
    p2->next=NULL;
    free(p1);
    if (flag==1)
        end=p2;
}
void print()
{
    Node *p=head;
    printf("输出的字符串为:\n");
    while (p)
    {
        printf("%c",p->ch);
        p=p->next;
    }
    printf("\n");
}
void Insert()
{
    Node *p=head;
    int num;
    printf("现在共有%d个显示字符请插入所选择的字符位置之前\n(head之前为1,插入在结尾为%d输入-1终止处理)\n",n,n+1);
    while(scanf("%d",&num)!=1||num<-1||num>n+1)//为了防止输入非法数据出错~
    {
        fflush(stdin);
        printf("输入数据有误,请重新输入\n");
    }
    if (num==-1)
        exit(0);
    while (num>1)
    {
        p=p->next;
        num--;
    }
    creat(1);
    end->next=p;
    if (end->next==head)//如果插入点在头部,则head指针位置应该改为head_2~
    {
        head=head_2;
        return;
    }
    p=head;//使p重新指向头结点
    while (end->next!=p->next)
        p=p->next;
    p->next=head_2;
}
int main()
{
    creat(0);
    print();
    Insert();
    printf("插入字符后数据如下\n\n");
    print();
    return 0;
}


[此贴子已经被作者于2016-11-15 14:38编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-15 14:34
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
突然弄懂题意,上面发的贴我以为是插入一段字符串,原来题意是提取输入的子字符串~感觉比插入的过程简单一点~,就是Insert()函数略加修改和去除上贴一些插入子串的处理,基本上是一个模式的~
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(Node)
void creat();
void print();
void Insert();
typedef struct Node
{
    char ch;
    struct Node *next;
}Node;
Node *head=NULL;
int n=0;
void creat()
{
    struct Node *p1,*p2;
    printf("请输入字符串\n");
    p1=p2=(Node*)malloc(LEN);
    fflush(stdin);
    while ((p1->ch=getchar())!='\n')
    {
        n++;
        if (n==1)head=p1;
        else p2->next=p1;
        p2=p1;
        p1=(Node*)malloc(LEN);
    }
    p2->next=NULL;
    free(p1);
}
void print()
{
    Node *p=head;
    printf("输出的字符串为:\n");
    while (p)
    {
        printf("%c",p->ch);
        p=p->next;
    }
    printf("\n");
}
void Insert()
{
    Node *p=head;
    int num,l;
    printf("现在共有%d个显示字符,请输入提取子串的位置和长度\n(head之前为1,插入在结尾为%d输入位置0终止处理)\n",n,n+1);
    while(scanf("%d%d",&num,&l)!=2||num<0||num+l>n+1||l<=0)//为了防止输入非法数据出错~
    {
        fflush(stdin);
        printf("输入数据有误,请重新输入\n");
    }
    if (num==0)
        exit(0);
    while (num>1)
    {
        p=p->next;
        num--;
    }
    printf("输出的子串如下\n");
    while (l)
    {
        printf("%c",p->ch);
        p=p->next;
        l--;
    }
    printf("\n");
}
int main()
{
    creat(0);
    print();
    Insert();
    return 0;
}


[此贴子已经被作者于2016-11-15 16:19编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-15 16:13
快速回复:关于串链表求子串的算法,一直运行不了,求帮助
数据加载中...
 
   



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

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