| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 381 人关注过本帖
标题:从链表中删除节点(修改问题)
只看楼主 加入收藏
达尔文
Rank: 2
等 级:论坛游民
帖 子:84
专家分:29
注 册:2015-8-22
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
从链表中删除节点(修改问题)
struct node *delete_from_list(struct node *list, int n)
{
 struct node *cur, *prev;

for (cur = list, prev = NULL;
      cur != NULL && cur->value != n;
      prev = cur, cur = cur->next)
    ;
 if (cur == NULL)
   return list;
 if (prev ==NULL)
   list = list->next;
else
   prev->next = cur->next;
  free(cur);
  return list;
}修改使用一个指针变量而不是两个(即cur和prev)

修改后如下:
struct node *delete_from_list(struct node **list, int n)   //**list为指向需要修改的list指针的指针
{
 struct node *cur;

while ((cur = (*list) != NULL && cur->value < new_node->value)
         *list = cur->list;
   
 if (cur == NULL)
   return *list;
 else
    *list = cur->list;
  free(cur);
  return *list;
}

修改为此,正确吗?
搜索更多相关主题的帖子: return 
2015-11-09 22:36
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:5 
自己实现一个链表实现一下不就知道了!

目测修改为二级指针画蛇添足了


[fly]存在即是合理[/fly]
2015-11-10 17:41
达尔文
Rank: 2
等 级:论坛游民
帖 子:84
专家分:29
注 册:2015-8-22
收藏
得分:0 
回复 2楼 azzbcc
如果不用2级指针,目测无法使用只1个指针.毕竟需要一个指针来删除节点,而它前面那个指针得指向被删除节点的下一个。

能有一件喜欢的事很不容易,就坚持下去吧.....
2015-11-10 23:14
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:15 
程序代码:
#include <stdio.h>
#include <stdlib.h>

typedef unsigned int uint;

typedef struct LinkNodeTag
{
    uint elem;
    struct LinkNodeTag *next;
} LinkNode, *LinkList;

LinkList CreateLink(uint *data, size_t length)
{
    LinkList s, tail, head = NULL;

    tail = head = calloc(1, sizeof(LinkNode));
    for (size_t i = 0;i < length;i++)
    {
        s = calloc(1, sizeof(LinkNode));
        s->elem = data[i], s->next = NULL;

        tail->next = s;
        tail = s;
    }
    return head;
}

void PrintLink(LinkList linkList)
{
    LinkList p = linkList->next;

    printf("LinkList : ");
    while (p)
    {
        printf("%u ", p->elem);
        p = p->next;
    }
    printf("NULL\n");
}

void DestroyLink(LinkList linkList)
{
    if (linkList->next) DestroyLink(linkList->next);
    free(linkList);
}

void DeleteFromLink(LinkList linkList, uint number)
{
    LinkList p;

    while (linkList->next)
    {
        if (linkList->next->elem == number)
        {
            p = linkList->next;
            linkList->next = linkList->next->next;
            free(p);
            return;
        }
        linkList = linkList->next;
    }
    return;
}

int main(void)
{
    uint data[] = { 1, 3, 5, 7 };
    LinkList linkList = CreateLink(data, sizeof(data) / sizeof(uint));

    PrintLink(linkList);
    DeleteFromLink(linkList, 7);
    PrintLink(linkList);

    DestroyLink(linkList);
    return 0;
}


这个是带头节点的


[fly]存在即是合理[/fly]
2015-11-11 09:54
达尔文
Rank: 2
等 级:论坛游民
帖 子:84
专家分:29
注 册:2015-8-22
收藏
得分:0 
我好好看看

能有一件喜欢的事很不容易,就坚持下去吧.....
2015-11-12 12:11
快速回复:从链表中删除节点(修改问题)
数据加载中...
 
   



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

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