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

[通用编程] 还是问链表

[复制链接]
发表于 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]
发表于 2007-6-4 01:42:57 | 显示全部楼层
...............听你说得不清楚啊,你说的那个setnull是初使化结构指针的啊,跟你说的next为NULL有何关系,那个函数是不正确的...设置时应当考虑将next设为NULL,链表形成的最初就应当考虑到
发表于 2007-6-4 02:02:14 | 显示全部楼层
[s:5] LZ链表结构还不是很清楚啊..- -
不过这块攻克了之后,在了解下Vector,其他一切数据结构也就好办了
发表于 2007-6-5 05:38:54 | 显示全部楼层
linklist这东西学了以后就再也没有用过…… [s:5]
 楼主| 发表于 2007-6-5 07:35:30 | 显示全部楼层
引用第2楼duzhi5368于2007-06-03 18:02发表的  :
[s:5] LZ链表结构还不是很清楚啊..- -
不过这块攻克了之后,在了解下Vector,其他一切数据结构也就好办了


不过这一题,是我从清华大学出版的数据结构里写下来的啊!!!![s:6][s:6][s:6][
发表于 2007-6-5 14:25:19 | 显示全部楼层
可以考虑在insert中设定指针的next为null,在整个插入函数中均没有考虑到设NULL问题,而是把它当成......已设好的来用....或者在setnull时考虑一下....以上
发表于 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]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-11-6 19:20 , Processed in 0.011654 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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