问答

求大佬们解惑一下,为啥我的链表末尾插入的是一个垃圾值?

作者:admin 2021-04-22 我要评论

有没有大佬能帮我解决一下,为啥我的链表末尾插入的是一个垃圾值,不胜感激!!! #include stdio.h#include malloc.h#include stdlib.h #include stdbool.h //定...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

有没有大佬能帮我解决一下,为啥我的链表末尾插入的是一个垃圾值,不胜感激!!!

image.png

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h> 
#include <stdbool.h> 

//定义一个链表节点
 typedef struct node
{
    int data;
    struct node * next;
} node,*pnode;

//创建一个单链表 
pnode create_list(void)
{
    int len;
    int i;
    int val;
    pnode phead = (pnode)malloc(sizeof(node));
    pnode ptail = phead;
    ptail->next = NULL;
    if(NULL == phead)
    {
        printf("内存分配失败,停止!!!\n");
        exit(-1); 
    } 
    printf("请输入你要输入的节点个数:len = \n");
    scanf("%d",&len);
    for( i= 0;i<len;i++)
    {
        printf("请输入你要输入的%d节点值\n",i+1);
        scanf("%d",&val); 
        pnode pnew = (pnode)malloc(sizeof(node));
        if(NULL == pnew)
        {
            printf("内存分配失败,停止!!!\n");
            exit(-1); 
        } 
        pnew->data = val;
        ptail->next = pnew;
        pnew->next = NULL;
        ptail = pnew;      
    } 
    return phead;
    
}
//显示一个链表 
void traverse_list( pnode phead)
{
    pnode p = phead->next;
    while(NULL != p)
    {
        printf("%d",p->data);
        p = p->next;
    } 
    printf("\n");
    return; 
}

//判断链表是否为空 
int is_empty(pnode phead)
{
    if(NULL == phead->next)
        return 1;
    else
        return 0;
} 


//求链表的长度 
int length_list(pnode phead)
{
    pnode p = phead->next;
    int len = 0;
    while(NULL != p)
    {
        len++;
        p = p->next;
    }
    return len;
}

//给链表添加一个节点 
bool insert_list(pnode phead,int pos,int val)
{
    int i = 0;
    pnode p = phead;
    while((NULL != p)&&(i<pos-1))
    {
        p = p->next;
        ++i;
    }    
    if((NULL == p)&&(i>pos-1))
        return false;
    pnode pnew = (pnode)malloc(sizeof(node));
    if(NULL == pnew)
    {
        printf("内存分配失败\n");
        exit(-1); 
    }       
    p->data = val;
    pnode q = p->next;
    p->next = pnew;
    pnew->next = q;
    
    return true;
     
      
}

/*int delete_list(pnode,int,int*)
{
    
}*/

//给链表排序 
void sort_list(pnode phead)
{
    int i,j,t;
    int len = length_list(phead);
    pnode p,q;
    for(i = 0,p = phead->next;i<len-1;i++,p = p->next)
    {
        for(j = i+1,q = p->next;j<len;j++,q = q->next)
        {
            if(p->data>q->data)
            {
                t = p->data;
                p->data = q->data;
                q->data = t;
            }
        }
    }
    return; 
}

int main(void) 
{
    pnode phead = NULL;
    phead = create_list();
    traverse_list(phead);
    if(is_empty(phead))
        printf("链表为空\n");
    else
        printf("链表非空\n");
    printf("链表的长度为%d\n" ,length_list(phead));
    sort_list(phead);
    traverse_list(phead);    
    insert_list(phead,4,0);
    traverse_list(phead);
    
    return 0;    
} 
###

insert_list 里,新值赋错地方了,修改见下:

- p->data = val;
+ pnew->data = val;
  pnode q = p->next;
  p->next = pnew;
  pnew->next = q;

这样写更简单,少一行:

pnew->data = val;
pnew->next = p->next;
p->next = pnew;

运行良好,截图:
konsole

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 求助!Mysql workbench connections出

    求助!Mysql workbench connections出

  • c++ 的dll 转golang可以调用

    c++ 的dll 转golang可以调用

  • c++的 new int{10}  和 new int(10) 有

    c++的 new int{10} 和 new int(10) 有

  • Grafana MySQL为数据源时, 折线图无法

    Grafana MySQL为数据源时, 折线图无法

腾讯云代理商
海外云服务器