| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1264 人关注过本帖
标题:为什么输出窗口首字母会是乱码
只看楼主 加入收藏
及也
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-11-4
结帖率:0
收藏
 问题点数:0 回复次数:5 
为什么输出窗口首字母会是乱码
程序代码:
#include<stdio.h>
#include<malloc.h>

#define MAXLEN 100
typedef char DataType;

typedef struct node
{
    DataType data;
    struct node *next;
}ListNode,*LinkList;

int GetLength(LinkList head);//求单链表长度
LinkList CreatListF(void);//头插法建单链表
LinkList CreatListL(void);//尾插法建单链表
ListNode *GetNode(LinkList head, int i);//在单链表中按序号查找元素
ListNode *Locate(LinkList head, DataType x);//在单链表中按值查找元素
void InsertList(LinkList head, DataType x, int i);//在单链表中插入元素
void DeleteList(LinkList head, int i);//删除元素
void delete_list(LinkList head);//删除重复的元素
void PutOut(LinkList head);//单链表输出

int main(void)
{
    int Length;
    ListNode *p;
    LinkList head=NULL;
    head = CreatListL();
    p = (ListNode*)malloc(sizeof(ListNode));
    PutOut(head);
    Length = GetLength(head);
    printf("长度为:%d\n", Length);
    p=GetNode(head, 2);
    printf("该位置的值为:%c\n", p->data);
    p = Locate(head, 'F');
    printf("该位置的值为:%c\n", p->data);
    InsertList(head, 'L', 3);
    PutOut(head);
    DeleteList(head, '3');
    PutOut(head);

    free(p);

    return 0;
}

LinkList CreatListF(void)//头插法建单链表
{
    char ch;
    LinkList head = (ListNode*)malloc(sizeof(ListNode));
    ListNode *s;
    ch = getchar();
    while (ch != '\n')
    {
        s = (ListNode*)malloc(sizeof(ListNode));
        s->data = ch;
        s->next = head->next;
        head->next = s;
        ch = getchar();
    }
    return head;
}

LinkList CreatListL(void)//尾插法建单链表
{
    char ch;
    LinkList head = (LinkList *)malloc(sizeof(LinkList));
    ListNode *s, *r;
    r = head;
    ch = getchar();
    while ((ch = getchar()) != '\n')
    {
        s = (ListNode *)malloc(sizeof(ListNode));
        s->data = ch;
        r->next = s;
        r = s;
    }
    r->next = NULL;
    return head;
}

ListNode *GetNode(LinkList head, int i)//在单链表中按序号查找元素
{
    int j;
    ListNode *p;
    if (i<1 || i>GetLength(head))
        exit(1);
    p = head->next;
    j = 1;
    while (p != NULL&&j < i)
    {
        p = p->next;
        j++;
    }
    return p;
}

ListNode *Locate(LinkList head, DataType x)//在单链表中按值查找元素
{
    ListNode *p = head->next;
    while (p&&p->data != x)
        p = p->next;
    return p;
}

void InsertList(LinkList head, DataType x, int i)//在单链表中插入元素
{
    ListNode *p, *q, *s;
    int j = 1;
    p = head;
    if (i<1 || i>GetLength(head) + 1)
        exit(1);
    s = (ListNode *)malloc(sizeof(ListNode));
    s->data = x;
    while(j <= i)
    {
        q = p;
        p = p->next;
        j++;
    }
    s->next = q->next;
    q->next = s;
}

void DeleteList(LinkList head, int i)//在单链表中删除元素
{
    ListNode *p, *q;
    int j = 1;
    p = head;
    if (i<1 || i>GetLength(head))
        exit(1);
    while (j < i)
    {
        p = p->next;
        j++;
    }
    q = p->next;
    p->next = q->next;
    free(q);
}

void delete_list(LinkList head)//在单链表中删除重复的结点
{
    ListNode *p, *q, *s;
    p = head->next;
    if (p == NULL) 
        exit(1);
    while (p->next != NULL)
    {
        q = p;
        while (q->next)
        {
            if (q->next->data == p->data)
            {
                s = q->next;
                q->next = q->next->next;
                free(s);
            }
            else q = q->next;
        }
        p = p->next;
    }
}

int GetLength(LinkList head)//求单链表长度
{
    int Length=0;
    ListNode *p;
    p = head;
    while (p)
    {
        p = p->next;
        Length++;
    }

    return Length;
}

void PutOut(LinkList head)//单链表输出
{
    ListNode *p;
    p = head;
    while (p != NULL)
    {
        printf("%c", p->data);
        p = p->next;
    }
    printf("\n");
}

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

如图,输入ABCDEFG后输出中A变成了乱码,就算首字母换成其他也是同样问题,求大神帮助解决一下,非常感谢
搜索更多相关主题的帖子: 字母 color 
2017-03-29 22:36
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
一个一个排查呗。
首先排查输出函数,输出函数没有问题。
那就看看插入函数。

会出问题,也就这两个函数。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-29 22:49
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
程序代码:
LinkList CreatListL(void)//尾插法建单链表
{
    char ch;
    LinkList head = (LinkList *)malloc(sizeof(LinkList));//创建节点
    ListNode *s, *r;//调用malloc(),却不检查是否成功分配空间,这真的大丈夫?
    r = head;
    ch = getchar();//head的初始化在哪儿?也就是,head->data的值是什么?如果没有赋值的话,那么就应该是一个垃圾值,这很正确。是我没找到,还是就没有?
    while ((ch = getchar()) != '\n')
    {
        s = (ListNode *)malloc(sizeof(ListNode));
        s->data = ch;
        r->next = s;
        r = s;
    }
    r->next = NULL;
    return head;
}


[此贴子已经被作者于2017-3-29 23:06编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-29 22:54
及也
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-11-4
收藏
得分:0 
回复 3楼 renkejun1942
这都是书上的的源代码,我也不知道问题出现在哪里
2017-03-30 16:41
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 4楼 及也
问题出在没有初始化data的值。也就是第一个节点。所以会出现一个垃圾值。
你增加一条语句,给它一个值,垃圾值就不会出现了。
你两个函数都有这个问题,只创建了节点,但是没有对data进行初始化,而且后面的语句也不涉及对它的赋值操作。

上面说的一个解决办法。
另一个解决办法是不要那个节点。当然,估计得修改一下代码。

你自己选简单的来吧,先理解示例代码为什么要这样写。

你自己对照下,我怎么都怀疑你抄错了,很少有书上的示例代码这么不严谨,竟然漏了最重要的初始化,而且还不进行malloc的检查,这可以说是大忌,不检查调用函数是否成功。

[此贴子已经被作者于2017-3-30 16:55编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-30 16:50
及也
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-11-4
收藏
得分:0 
数据结构(马睿版)的教材,里面代码确实有些不严谨,不过还是谢谢大神
2017-03-30 21:04
快速回复:为什么输出窗口首字母会是乱码
数据加载中...
 
   



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

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