| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 922 人关注过本帖, 1 人收藏
标题:链表里怎么把有数据的节点变成空表头那样的空表
只看楼主 加入收藏
hellengoodd
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2011-4-17
结帖率:75%
收藏(1)
已结贴  问题点数:20 回复次数:9 
链表里怎么把有数据的节点变成空表头那样的空表
单链表是不是有个头结点,头结点是不是为空,是不是这样定义head=(linklist)malloc(sizeof(linklist)); 然后什么内容都不赋予给它;
typedef struct *linklist
{
    int data;
    linklist *next;
}linklist;
那如果单链表中的一个结点P已经有内容了  那如何把它变成空表头那样的   是不是用P=NULL  还是free(P)  还是delete(P); 又或是用其他方法?求大虾指点迷津~
搜索更多相关主题的帖子: 如何 
2011-04-21 12:49
mayuebo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:257
专家分:1282
注 册:2005-9-8
收藏
得分:7 
不是。单链表的头节点只有头指针。没有数据域

成功贵在坚持
2011-04-25 10:34
Demon_JIE
Rank: 2
来 自:成都 西华大学
等 级:论坛游民
帖 子:26
专家分:39
注 册:2011-4-27
收藏
得分:7 
typedef struct Node
{
    Elemtype data;
    struct Node *next'
}Node, *Linklist;
head = (Linklist) malloc (sizeof(Node));
2011-04-27 23:44
三月的雪
Rank: 2
等 级:论坛游民
帖 子:18
专家分:35
注 册:2011-4-14
收藏
得分:7 
头节点head的data域不赋值,next指向链表中第一个有内容(data赋值)的节点。
假如p指向链表中的某一个节点,那么不能delete和free的,否则链表就断了。
如果你想表示p的data域回到“初值”的话,可以用特殊值,比如data域为char类型的话,可以p->data = '0'

朝花夕拾
2011-04-29 16:00
hellengoodd
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2011-4-17
收藏
得分:0 
回复 4楼 三月的雪
就不能把原来有值的变成 不赋值的状态吗???
2011-05-04 17:55
三月的雪
Rank: 2
等 级:论坛游民
帖 子:18
专家分:35
注 册:2011-4-14
收藏
得分:0 
可以,但比较麻烦了些。
这么做没有必要的吧。这样做不释放内存空间的。

朝花夕拾
2011-05-05 20:30
hellengoodd
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2011-4-17
收藏
得分:0 
回复 6楼 三月的雪
我做的是要把表逆置  所以要把有赋值的表尾变成无赋值的表头 但next要有  怎么办
2011-05-07 12:49
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
回复 楼主 hellengoodd
还是不能很好地理解你要表达的意思

生成链表 根据需要 可以使带头结点的 和 不带头结点的即只有一个头指针
程序代码:
//不带头结点的单链表 建立和打印
#include <stdio.h>
#include <stdlib.h>

struct node
{
    int data;
    struct node *next;
};

struct node* create(struct node *head)
{
    struct node *temp = NULL;
    int unm = 10;
    

    while ( unm -- )
    {
        temp = (struct node*) malloc (sizeof(struct node));
        temp->next = NULL;
        temp->data = unm;

        if ( head )
        {
            temp->next = head;
            head = temp;
        }
        else
        {
            head = temp;
        }
    }

    return head;
}

void display(struct node * head)
{
    struct node *temp = NULL;
   
    temp = head;
    while (temp)
    {
        printf("%d ", temp->data);
        temp = temp->next;
    }

    printf("\n");
}

int main(void)
{
    struct node *head = NULL;

    head = create(head);
    display(head);

    return 0;
}


图片附件: 游客没有浏览图片的权限,请 登录注册


程序代码:
//带头结点的单链表 建立和打印
#include <stdio.h>
#include <stdlib.h>

struct node
{
    int data;
    struct node *next;
};

void create(struct node *head)
{
    struct node *temp = NULL;
    int unm = 10;
   
    while ( unm -- )
    {
        temp = (struct node*) malloc (sizeof(struct node));
        temp->data = unm;
        temp->next = head->next;
        head->next = temp;
    }
}

void display(struct node * head)
{
    struct node *temp = NULL;
   
    temp = head->next;
    while (temp)
    {
        printf("%d ", temp->data);
        temp = temp->next;
    }

    printf("\n");
}

int main(void)
{
    struct node *head = (struct node*) malloc (sizeof(struct node));
    head->next = NULL;

    create(head);
    display(head);

    return 0;
}
2011-05-07 18:59
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
其实感觉差不多 但是在使用的过程当中自己要具体分清楚

一般来说如果你要使用的是带头结点的  一般都带上下面两句
    struct node *head = (struct node*) malloc (sizeof(struct node));
    head->next = NULL;
通过头结点的初始化后 使用头结点就很方便 例如create(head); 能发现自己写这个代码的时候不用返回值也是能达到目的的
如果你想使用头结点 但是在调用的函数当中(也就是说你的主函数当中)只是简单声明一下例如:
    struct node *head = NULL;
这样子的 那么在使用的时候 就有点退化(头指针)的感觉啦 那么create(head) 不返回点东西是不能用的 当然前提是 在一级指针的
情形下。

而对于头指针 可以很清楚的看到 它的使用不需要另外再分配内存空间(当然指针本身也是要占用内存空间的(sizeof(int)大小))
只是指向了第一个结点。

综上: 当你使用的是头指针(head = NULL) 那么第一次用的时候 就要当心这里 head->next; 如果没有指向一个结点的时候这句是不能用的
    当使用的是带头结点的时候 (head != NULL)  而head->next 一般初始化的时候是为head->next = NULL;  不管怎么说一切都是为了使用方便
而制定的。 其实明白了也就那么点东西。


2011-05-07 19:14
三月的雪
Rank: 2
等 级:论坛游民
帖 子:18
专家分:35
注 册:2011-4-14
收藏
得分:0 
回复 7楼 hellengoodd
原来data有值的节点逆转,再把头结点指向原来的最后一个节点。
以上,没有用到你说的那个操作。

也就是说,假设原来链表有n个节点(1到n号),那么算上头结点实际上是n+1个节点。逆转操作,实际上是将除头结点之外的那n个节点逆转,然后头结点由原来的指向1号改为指向n号即可。

估计你理解成:将包括头结点在内的n+1个节点在内的链表,全部参与逆转了。这样其实改变了头结点的地址(改成了原来的最后一个节点的地址)。我们说,一个链表给定,实际上是给定了它的头结点,init操作的时候实际上也是分配了头节点的地址,如果改变了头节点地址的话,这个链表就不是这个链表了,变成了另外一个链表。显然这是不对的。

朝花夕拾
2011-05-11 13:03
快速回复:链表里怎么把有数据的节点变成空表头那样的空表
数据加载中...
 
   



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

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