| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1039 人关注过本帖
标题:请高手帮看看我写的这个链表操作的小程序
只看楼主 加入收藏
小焦叔叔
Rank: 1
来 自:广西 河池
等 级:新手上路
帖 子:59
专家分:2
注 册:2020-2-15
结帖率:78.57%
收藏
已结贴  问题点数:20 回复次数:1 
请高手帮看看我写的这个链表操作的小程序
这两天开始研究链表操作。写了一个测试操作方法的小程序,节点删除好像节点只删了半个汉字,删得成功也会有一个ASCII码的空格,有时候还会出现乱码。一下子还想不出哪里有问题,望有经验的朋友帮我看看,谢谢!

#include"STDIO.H"
#include"STDLIB.H"
#include"CONIO.H"

#define Enter 0x0D

struct Text
{
    char text;
    struct Text *next;
};
typedef struct Text Text;
Text *HEAD;

Text *Link_Build();
void Link_Output(Text *Head);
void Node_Delect(Text *Head);
void Link_Delect(Text *Head);

void main()
{
    HEAD=Link_Build();
    putch('\n');
    Link_Output(HEAD);
    Node_Delect(HEAD);
    putch('\n');
    Link_Output(HEAD);
    Link_Delect(HEAD);   
}

Text *Link_Build()
{
    Text *Head=NULL,*ptr_1,*ptr_2;
   
    ptr_1=(Text *)malloc(sizeof(Text));
    ptr_1->next=NULL;
    Head=ptr_1;
    ptr_2=ptr_1;
    printf("\n请输入文字,并以Enter键结束:");
    ptr_1->text=getch();
    putch(ptr_1->text);
    while(ptr_1->text!=Enter)
    {
        ptr_1=(Text *)malloc(sizeof(Text));
        ptr_1->text=getch();
        putch(ptr_1->text);
        ptr_1->next=NULL;
        ptr_2->next=ptr_1;
        ptr_2=ptr_1;
    }
   
    return(Head);
}

void Link_Output(Text *Head)
{
    Text *ptr=Head;
   
    while(ptr!=NULL)
    {
        putch(ptr->text);
        ptr=ptr->next;
    }
}

void Node_Delect(Text *Head)
{
    Text *ptr_1,*ptr_2=Head,*ptr_3,*ptr_4;
    char text_h,text_l;
    char Flag=0;
   
    printf("\n请输入要删除的文字:");
    text_l=getch();
    text_h=getch();
    putch(text_l);
    putch(text_h);
    putch('\n');
    while(ptr_4->text!=text_h&&ptr_3->text!=text_l&&ptr_4->next!=NULL)
    {
        ptr_1=ptr_2;
        ptr_2=ptr_1->next;
        if(ptr_2->text==text_h&&ptr_1->text==text_l)
        {
            Flag=1;
            break;                        
        }
        else
        {
            ptr_3=ptr_2->next;
            ptr_4=ptr_3->next;
        }            
    }
    if(Flag==1)
    {
        Head=ptr_3;
        free(ptr_2);
        free(ptr_1);   
    }   
    else if(ptr_4->next==NULL)
    {
        ptr_2->next=NULL;
        free(ptr_4);
        free(ptr_3);
    }
    else
    {
        ptr_1=ptr_4->next;
        ptr_2=ptr_1->next;
        free(ptr_4);
        free(ptr_3);
    }
}

void Link_Delect(Text *Head)
{
    Text *ptr_1,*ptr_2=Head;
   
    while(ptr_2!=NULL)
    {
        ptr_1=ptr_2->next;
        free(ptr_2);
        ptr_2=ptr_1;
    }
    printf("\n内容已删除!\n");
}

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

图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: HEAD next free NULL Text 
2020-02-15 18:11
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:20 
主要是对你的Node_Delect函数进行了修改,你的函数有几处明显的错误:
1:while(ptr_4->text!=text_h&&ptr_3->text!=text_l&&ptr_4->next!=NULL)开始循环时,ptr_3和ptr_4未初始化,调试时报错
2:显然你没有考虑到删除的字符在链表头部时的情况
3:你不能显式认为每次删除的是两个字符,如果是中英文混合的情况时,删除一个英文字符你将怎么处理?
4:我的编译器不能很好地支持putch,我都改成printf了
修改后的代码及运行效果如下:
程序代码:
#include"STDIO.H"
#include"STDLIB.H"
#include"CONIO.H"

#define Enter 0x0D

struct Text
{
    char text;
    struct Text *next;
};
typedef struct Text Text;
Text *HEAD;

Text *Link_Build();
void Link_Output(Text *Head);
Text *Node_Delect(Text *Head);
void Link_Delect(Text *Head);

void main()
{
    HEAD = Link_Build();
    printf("\n");
    Link_Output(HEAD);
    HEAD=Node_Delect(HEAD);
    printf("\n");
    Link_Output(HEAD);
    Link_Delect(HEAD);
}

Text *Link_Build()
{
    Text *Head = NULL, *ptr_1, *ptr_2;

    ptr_1 = (Text *)malloc(sizeof(Text));
    ptr_1->next = NULL;
    Head = ptr_1;
    ptr_2 = ptr_1;
    printf("\n请输入文字,并以Enter键结束:");
    ptr_1->text = getch();
    printf("%c",ptr_1->text);
    while (ptr_1->text != Enter)
    {
        ptr_1 = (Text *)malloc(sizeof(Text));
        ptr_1->text = getch();
        printf("%c", ptr_1->text);
        ptr_1->next = NULL;
        ptr_2->next = ptr_1;
        ptr_2 = ptr_1;
    }
    return(Head);
}

void Link_Output(Text *Head)
{
    Text *ptr = Head;

    while (ptr != NULL)
    {
        printf("%c",ptr->text);
        ptr = ptr->next;
    }
}

Text *Node_Delect(Text *Head)
{
    Text *ptr_1, *ptr_2 ;
    int i;
    char text[20];
    printf("\n请输入要删除的文字:");
    scanf("%s", text);
    for (i = 0; text[i]; i++)
    {
        for (ptr_1 = NULL, ptr_2 = Head; ptr_2&&text[i] != ptr_2->text; ptr_2 = ptr_2->next)
            ptr_1 = ptr_2;                            //只删除最先碰到的相同字
        if (!ptr_1&&ptr_2)Head = ptr_2->next;         //如果删除的字符在链表头部,则需要改变头指针
        if (ptr_1&&ptr_2)ptr_1->next = ptr_2->next;   //如果删除的字符在链表中部,则只需要改变上一个链表指向跳过要删除的位置
        free(ptr_2);                                  //释放删除的空间
    }
    return Head;
}

void Link_Delect(Text *Head)
{
    Text *ptr_1, *ptr_2 = Head;

    while (ptr_2 != NULL)
    {
        ptr_1 = ptr_2->next;
        free(ptr_2);
        ptr_2 = ptr_1;
    }
    printf("\n内容已删除!\n");
}


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

能编个毛线衣吗?
2020-02-15 23:16
快速回复:请高手帮看看我写的这个链表操作的小程序
数据加载中...
 
   



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

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