august 发表于 2007-6-4 01:11:44

还是问链表


#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);
}


在这程序中,在表头是赋了个NULL 但是在插入值以后并没有在最后一个值后赋以NULL 那像
while(j<i-1&&q->next!=NULL)
      {
            q=q->next;
            j++;
怎么来判断q->next是否等于NULL 它在插入后差没给最后一个赋NULL
请问这到底是怎么理解呢?

Zelsazgh 发表于 2007-6-4 01:42:57

...............听你说得不清楚啊,你说的那个setnull是初使化结构指针的啊,跟你说的next为NULL有何关系,那个函数是不正确的...设置时应当考虑将next设为NULL,链表形成的最初就应当考虑到

duzhi5368 发表于 2007-6-4 02:02:14

LZ链表结构还不是很清楚啊..- -
不过这块攻克了之后,在了解下Vector,其他一切数据结构也就好办了

锦涛卖灌饼 发表于 2007-6-5 05:38:54

linklist这东西学了以后就再也没有用过……

august 发表于 2007-6-5 07:35:30

引用第2楼duzhi5368于2007-06-03 18:02发表的:
LZ链表结构还不是很清楚啊..- -
不过这块攻克了之后,在了解下Vector,其他一切数据结构也就好办了


不过这一题,是我从清华大学出版的数据结构里写下来的啊!!!![

Zelsazgh 发表于 2007-6-5 14:25:19

可以考虑在insert中设定指针的next为null,在整个插入函数中均没有考虑到设NULL问题,而是把它当成......已设好的来用....或者在setnull时考虑一下....以上

lw 发表于 2007-6-7 07:25:05

不是很理解……当创建一个新的节点的时候总是在末尾(假设末尾)追加一个节点,然后必须要把这个新增加的节点的next域赋值为NULL,

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

这样当FOR进行遍历的时候就可以判断到达末尾了!
页: [1]
查看完整版本: 还是问链表