幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2629|回复: 6

[通用编程] 还是问链表

[复制链接]

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
发表于 2007-6-4 01:11:44 | 显示全部楼层 |阅读模式
[code]
#include<stdio.h>
#include<stdlib.h>
struct list
{
    char data;
    struct list *next;
}*head;
setnull(struct list **p)
{
    *p=NULL;
}
int length(struct list **p)
{
    int n=0;
    struct list *q=*p;
    while(q!=NULL)
    {
        n++;
        q=q->next;
    }
    return n;
}
void insert(struct list **p,char x,int i)
{
    int j=1;
    struct list *s,*q;
    s=(struct list *)malloc(sizeof(struct list));
    s->data=x;
    q=*p;
    if(i==1)
    {
        s->next=q;
        *p=s;
    }
    else
    {
        while(j<i-1&&q->next!=NULL)
        {
            q=q->next;
            j++;
        }
        if(j==i-1)
        {
            s->next=q->next;
            q->next=s;
        }
        else
            printf("位置不正确.");
    }
}
void del(struct list **p,int i)
{
    int j=1;
    struct list *t,*q;
    q=*p;
    if(i==1)
    {
        t=q;
        *p=q->next;
    }
    else
    {
        while(j<i-1&&q->next!=NULL)
        {
            q=q->next;
            j++;
        }
        if(j==i-1)
        {
            t=q->next;
            q->next=t->next;
        }
        else
            printf("位置不对.");
    }
        if(t!=NULL)
            free(t);
   
}
void display(struct list **p)
{
    struct list *q;
    q=*p;
    printf("单链表显示:");
    if(q==NULL)
        printf("链表为空!");
    else if(q->next==NULL)
        printf("%c",q->data);
    else
    {
        while(q->next!=NULL)
        {    printf("%c-",q->data);
            q=q->next;
        }
        printf("%c",q->data);
    }
    printf("\n");

}
void main()
{
    char ch;
    setnull(&head);
    printf("请输入字符:");
    scanf("%c",&ch);fflush(stdin);
    insert(&head,ch,1);
    insert(&head,'c',2);
    insert(&head,'b',2);
   
    printf("长度为%d\n",length(&head));
    display(&head);
    del(&head,1);
    display(&head);
}

[/cide]
在这程序中,在表头是赋了个NULL 但是在插入值以后并没有在最后一个值后赋以NULL 那像
while(j<i-1&&q->next!=NULL)
        {
            q=q->next;
            j++;
怎么来判断q->next是否等于NULL 它在插入后差没给最后一个赋NULL
请问这到底是怎么理解呢?[s:6][s:6][s:6]
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复

使用道具 举报

20

主题

197

帖子

2641

积分

⑥精研

积分
2641
QQ
发表于 2007-6-4 01:42:57 | 显示全部楼层
...............听你说得不清楚啊,你说的那个setnull是初使化结构指针的啊,跟你说的next为NULL有何关系,那个函数是不正确的...设置时应当考虑将next设为NULL,链表形成的最初就应当考虑到
签名要少于60,SO,i haven't upload my pic
回复 支持 反对

使用道具 举报

7

主题

190

帖子

1766

积分

⑥精研

....

积分
1766
发表于 2007-6-4 02:02:14 | 显示全部楼层
[s:5] LZ链表结构还不是很清楚啊..- -
不过这块攻克了之后,在了解下Vector,其他一切数据结构也就好办了
萝卜啊,白菜啊,土豆星啊,梦想有爱啊。
回复 支持 反对

使用道具 举报

1

主题

289

帖子

4万

积分

⑧专业

传说中的Bunny雷神~!

积分
46038
发表于 2007-6-5 05:38:54 | 显示全部楼层
linklist这东西学了以后就再也没有用过…… [s:5]
自从那个天神出现以后,爷的地位就降低了。 (\\__/) ("H.H)  H ( ~  )~| This is Bunny H God.
回复 支持 反对

使用道具 举报

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
 楼主| 发表于 2007-6-5 07:35:30 | 显示全部楼层
引用第2楼duzhi5368于2007-06-03 18:02发表的  :
[s:5] LZ链表结构还不是很清楚啊..- -
不过这块攻克了之后,在了解下Vector,其他一切数据结构也就好办了


不过这一题,是我从清华大学出版的数据结构里写下来的啊!!!![s:6][s:6][s:6][
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复 支持 反对

使用道具 举报

20

主题

197

帖子

2641

积分

⑥精研

积分
2641
QQ
发表于 2007-6-5 14:25:19 | 显示全部楼层
可以考虑在insert中设定指针的next为null,在整个插入函数中均没有考虑到设NULL问题,而是把它当成......已设好的来用....或者在setnull时考虑一下....以上
签名要少于60,SO,i haven't upload my pic
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-6-7 07:25:05 | 显示全部楼层
不是很理解……当创建一个新的节点的时候总是在末尾(假设末尾)追加一个节点,然后必须要把这个新增加的节点的next域赋值为NULL,

然后根据需要插入的索引进行遍历,只有两种可能,对于第N个:
(1) 如果在其中找到位置,那样再把next赋值为下一个节点的地址,那么此时末尾仍然保持上一次更新末尾的next为NULL
(2)被加入到末尾,这样直接把自己的地址设置给原来的末尾地址,自己next为NULL
以上两种情况都保证了末尾是NULL的,因为第一个节点是满足这个情况的……所以第N+1必然可以保证末尾为NULL,得到证明(数学归纳法变形…………[s:4])

这样当FOR进行遍历的时候就可以判断到达末尾了! [s:4]
Style-C
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-4-29 11:13 , Processed in 0.027349 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表