| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1541 人关注过本帖
标题:单链表结点的删除(不带头结点)
只看楼主 加入收藏
看谁都是你
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2016-10-13
结帖率:57.14%
收藏
已结贴  问题点数:20 回复次数:2 
单链表结点的删除(不带头结点)
下面这个只能删除一个节点,如果想把链表中所有等于m的节点删除应该怎么改?
程序代码:
struct ListNode *deletem( struct ListNode *L, int m )
{
    struct ListNode *p;
    struct ListNode *pre;
    pre=L;
    p=pre->next;
    if(pre->data==m)
    {
        L=p;
        free(pre);
    }
    while(p!=NULL)
    {
        if(p->data==m)
        {
            pre->next=p->next;
            free(p);
            p->next=NULL;
        }
        pre=pre->next;
        p=p->next;
    }
    return L;
} 
2017-04-16 11:44
marlow
Rank: 6Rank: 6
等 级:侠之大者
威 望:2
帖 子:125
专家分:419
注 册:2016-7-18
收藏
得分:10 
回复 楼主 看谁都是你
deletem()函数存在一些问题,例如如果头结点为m,那么把它free了后,while循环里面怎么还能够 pre=pre->next;?另外,free(p);后,p即为空指针,又怎么能p->next=NULL?
删除所有值为m的结点也不难:
struct ListNode *deletem( struct ListNode *L, int m )
{
    struct ListNode *ptr, temp;
   
    ptr = L;
    while(ptr)
    if(ptr->data == m && ptr == L){ //头结点值为m
        temp = ptr;
        L = ptr = ptr->next;
        free(temp);
    }else if(ptr->data == m){
        temp = ptr;
        ptr = ptr->next;
        free(temp);
    }else
        ptr = ptr->next;

    return L;
}

代码没经过测试,有问题反馈

[此贴子已经被作者于2017-4-17 11:36编辑过]


一切都在学习、尝试、摸索中
2017-04-17 11:34
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:10 
看来留以前写的代码还是有好处的,随手找找就有了。

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define T ListNode
typedef struct T *T;
void
Insert( T *RootPP, int value );
void
Delete( T *RootPP, int value );
void
PrintList( T RootP );

struct T{
    int data;
    T next;
};

int
main( void )
{
    T Root;
    int value;

    Root = NULL;

    while( 1 == scanf( "%d", &value ) && -1 != value )
            Insert( &Root, value );
    getchar();

    scanf( "%d", &value );
    Delete( &Root, value );

    PrintList( Root );


    return 0;
}

void
Insert( T *RootPP, int value )
{
    T This;
    T NewCell;

    while( NULL != ( This = *RootPP ) )
        RootPP = &This->next;

    NewCell = ( T )malloc( sizeof( struct T ) );
    assert( NULL != NewCell );
    NewCell->data = value;
    NewCell->next = This;
    *RootPP = NewCell;
}

void
Delete( T *RootPP, int value )//删除链表中值等于value的所有节点
{
    T This;

    while( NULL != ( This = *RootPP ) )
    {
        if( This->data == value )
        {
            *RootPP = This->next;
            free( This );
            continue;
        }
        RootPP = &This->next;
    }
}

void
PrintList( T RootP )
{
    while( NULL != Root )
    {
        printf("%d ",RootP->data );
        RootP = RootP->next;
    }
}


[此贴子已经被作者于2017-4-19 20:50编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-19 20:49
快速回复:单链表结点的删除(不带头结点)
数据加载中...
 
   



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

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