标题:单链表删除第一个节点出现错误,不明白为什么。
只看楼主
chenxd
Rank: 2
来 自:北京
等 级:论坛游民
帖 子:20
专家分:24
注 册:2015-5-19
结帖率:33.33%
已结贴  问题点数:2 回复次数:15 
单链表删除第一个节点出现错误,不明白为什么。
新手刚学数据结构,写了一个删除链表节点的代码。其他都正常,但是删除第一个节点出现问题,不明白为什么。请大神给予解惑。感激不尽!
下面是代码:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

struct listnode{
    int data;
    struct listnode *next;
};
//创建长度为n的单链表
struct listnode *create(int n)
{
    int i;
    int a;
    struct listnode *p,*q,*head;
    head = (struct listnode *)malloc(sizeof(struct listnode));
    head = NULL;
    for( i = 1; i <= n; i++ )
    {
        scanf("%d",&a);
        p = (struct listnode *)malloc(sizeof(struct listnode));
        p->data = a;
        if(head == NULL)
        {
            head = p;
            q = p;
        }
        else
        {
            q->next = p;
            q = p;
        }
    }
    q->next = NULL;
    return head;
}
//打印单链表
void print_list(struct listnode *head)
{
    while(head)
    {
        printf("%d ",head->data);
        head = head->next;
    }
}
//删除单链表的第i个节点
struct listnode *delete_list(struct listnode *head, int i)
{
    int j = 0;
    struct listnode *p;
    p = head;
    while(p && j < i-1)
    {
        p = p->next;
        j++;
    }
    if( !p->next || j > i-1)
    {
        exit(1);
    }
    p->next = p->next->next;
    return head;
   
}

int main()
{
    int n;
    int del;
    struct listnode *head;
    //head = NULL;
    printf("输入链表的长度: ");
    scanf("%d",&n);
    head = create(n);    //    创建长度为n的单链表
    printf("\n输出单链表的值:\n");
    print_list(head);
    printf("\n输入要删除节点的位置:");
    scanf("%d",&del);
    head = delete_list(head,del);
    printf("\n删除后的单链表为:\n");
    print_list(head);
    return 0;
}

[此贴子已经被作者于2015-11-20 21:15编辑过]

搜索更多相关主题的帖子: create include 
2015-11-20 21:14
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
得分:0 
首先你并没有“删除”节点,那些节点的内存还在,其次你是delete
函数最后返回的是head而head并没有变

一片落叶掉进了回忆的流年。
2015-11-20 21:19
chenxd
Rank: 2
来 自:北京
等 级:论坛游民
帖 子:20
专家分:24
注 册:2015-5-19
得分:0 
回复 2楼 诸葛欧阳
//删除单链表的第i个节点
struct listnode *delete_list(struct listnode *head, int i)
{
    int j = 0;
    struct listnode *p,*q;
    p = head;
    while(p && j < i-1)
    {
        p = p->next;
        j++;
    }
    if( !p->next || j > i-1)
    {
        exit(1);
    }
    q = p->next;
    p->next = q->next;
    //p->next = p->next->next;
    free(q);
   // return head;  
}
按照你说的我也把那个内存释放掉了,但是运行结果还是错的。是我其他地方有问题吗?还是这个改的就不对?

不要嘲笑我家樱木!
2015-11-20 21:48
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
得分:2 
程序代码:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

struct listnode{
    int data;
    struct listnode *next;
};
//创建长度为n的单链表 
struct listnode *create(int n)
{
    int i;
    int a;
    struct listnode *p,*q,*head;

    head = (struct listnode *)malloc(sizeof(struct listnode));
    if(head) head->next = NULL;
    q= head;

    for(i = 0; i < n; i++)
    {
        scanf("%d", &a);
        p = (struct listnode *)malloc(sizeof(struct listnode));
        p->data = a;
        p->next = NULL;
        
        q->next = p;
        q = q->next;
    }

    return head;
}
//打印单链表 
void print_list(struct listnode *head)
{
    struct listnode *p;
    p = head->next;
    while(p)
    {
        printf("%d ",p->data);
        p = p->next;
    }
}
//删除单链表的第i个节点 
struct listnode *delete_list(struct listnode *head, int i)
{
    int j = 0;
    struct listnode *p,*q;

    p = head;
   while(p && j < i-1)
    {
        p = p->next;
        j++;
    }
    if( !p->next || j > i -1)
    {
        exit(1);
    }
    q = p->next;
    p->next = q->next;

    free(q);
    return head;  
}

int main()
{
    int n;
    int del;
    struct listnode *head;
    //head = NULL;
    printf("输入链表的长度: ");
    scanf("%d",&n);
    head = create(n);    //    创建长度为n的单链表 
    printf("\n输出单链表的值:\n");
    print_list(head);
    printf("\n输入要删除节点的位置:");
    scanf("%d",&del);
    head = delete_list(head,del);
    printf("\n删除后的单链表为:\n");
    print_list(head);
    return 0;
}


我们都在路上。。。。。
2015-11-21 11:38
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
得分:0 
删除第i个节点只需要将第i-1个节点和第i+1个节点相连

一片落叶掉进了回忆的流年。
2015-11-21 11:44
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
得分:0 
将就你的程序改了一下,头节点链表的表头一般不放数据,哑节点。
当条件不满足时,用Exit(0)直接退出让人感到莫明妙。
这时链表分配的节点内存还没有释放你就退出了。
其它问题自己思考修改吧。


[此贴子已经被作者于2015-11-21 11:49编辑过]


我们都在路上。。。。。
2015-11-21 11:47
chenxd
Rank: 2
来 自:北京
等 级:论坛游民
帖 子:20
专家分:24
注 册:2015-5-19
得分:0 
非常感谢楼上。
另外对于头结点与头指针我还有点不懂。struct listnode *head;这个head是头结点呢?还是头指针呢?是不是只要分配了内存空间就代表是头结点啊?就像下面这个语句。
head = (struct listnode *)malloc(sizeof(struct listnode));

不要嘲笑我家樱木!
2015-11-21 18:42
chenxd
Rank: 2
来 自:北京
等 级:论坛游民
帖 子:20
专家分:24
注 册:2015-5-19
得分:0 
回复 5楼 诸葛欧阳
那如果没有头结点,删除第一个节点,就没办法用你说的那个了。另外怎么样才算是有头结点啊?我现在还不明白我这个程序是否有头结点?一直搞不懂......是不是就是head = (struct listnode *)malloc(sizeof(struct listnode));这样才算是有头结点啊?

不要嘲笑我家樱木!
2015-11-21 18:46
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
得分:0 
以下是引用chenxd在2015-11-21 18:42:05的发言:

非常感谢楼上。
另外对于头结点与头指针我还有点不懂。struct listnode *head;这个head是头结点呢?还是头指针呢?是不是只要分配了内存空间就代表是头结点啊?就像下面这个语句。
head = (struct listnode *)malloc(sizeof(struct listnode));


头指针啊,指针指向分配了节点大小内存。我们称第一个节点为头节点,你程序的问题是执行上面这条语句后,head=NULL,直接让刚分配的头节点内存丢失,再也无法释放。

我们都在路上。。。。。
2015-11-21 19:21
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
得分:0 
以下是引用chenxd在2015-11-21 18:46:16的发言:

那如果没有头结点,删除第一个节点,就没办法用你说的那个了。另外怎么样才算是有头结点啊?我现在还不明白我这个程序是否有头结点?一直搞不懂......是不是就是head = (struct listnode *)malloc(sizeof(struct listnode));这样才算是有头结点啊?


俺并木有修改你的删除代码,带头节点的链表一共有n+1个节点,比如创建3个大小长度的链表,实际有4个节点,头节点占一个,你的创建程序把第一个数据1的节点接到head上,压根就没有头节点,虽然也生成了链表,但删除第一个节点用那段代码就删除不到一节点,除非你自己修改代码处理删除第一个节点的情况。

或许你对指针和动态分配内存理解还有模糊的地方,慢慢来吧,拿笔画画链表,继续写插入,排序,释放链表的代码,总有一天会顿悟的。

[此贴子已经被作者于2015-11-21 19:57编辑过]


我们都在路上。。。。。
2015-11-21 19:48



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-459421-1-1.html




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

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