标题:单链表删除第一个节点出现错误,不明白为什么。
取消只看楼主
chenxd
Rank: 2
来 自:北京
等 级:论坛游民
帖 子:20
专家分:24
注 册:2015-5-19
结帖率:33.33%
已结贴  问题点数:2 回复次数:4 
单链表删除第一个节点出现错误,不明白为什么。
新手刚学数据结构,写了一个删除链表节点的代码。其他都正常,但是删除第一个节点出现问题,不明白为什么。请大神给予解惑。感激不尽!
下面是代码:
#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
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
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
chenxd
Rank: 2
来 自:北京
等 级:论坛游民
帖 子:20
专家分:24
注 册:2015-5-19
得分:0 
回复 10楼 hellovfp
我也在疑惑自己是不是压根没有创建头结点,现在明白了。非常感谢!!!确实指针这一块我现在还是感觉很模糊

不要嘲笑我家樱木!
2015-11-21 22:02



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




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

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