还是问链表
#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
请问这到底是怎么理解呢? ...............听你说得不清楚啊,你说的那个setnull是初使化结构指针的啊,跟你说的next为NULL有何关系,那个函数是不正确的...设置时应当考虑将next设为NULL,链表形成的最初就应当考虑到 LZ链表结构还不是很清楚啊..- -
不过这块攻克了之后,在了解下Vector,其他一切数据结构也就好办了 linklist这东西学了以后就再也没有用过…… 引用第2楼duzhi5368于2007-06-03 18:02发表的:
LZ链表结构还不是很清楚啊..- -
不过这块攻克了之后,在了解下Vector,其他一切数据结构也就好办了
不过这一题,是我从清华大学出版的数据结构里写下来的啊!!!![ 可以考虑在insert中设定指针的next为null,在整个插入函数中均没有考虑到设NULL问题,而是把它当成......已设好的来用....或者在setnull时考虑一下....以上 不是很理解……当创建一个新的节点的时候总是在末尾(假设末尾)追加一个节点,然后必须要把这个新增加的节点的next域赋值为NULL,
然后根据需要插入的索引进行遍历,只有两种可能,对于第N个:
(1) 如果在其中找到位置,那样再把next赋值为下一个节点的地址,那么此时末尾仍然保持上一次更新末尾的next为NULL
(2)被加入到末尾,这样直接把自己的地址设置给原来的末尾地址,自己next为NULL
以上两种情况都保证了末尾是NULL的,因为第一个节点是满足这个情况的……所以第N+1必然可以保证末尾为NULL,得到证明(数学归纳法变形…………)
这样当FOR进行遍历的时候就可以判断到达末尾了!
页:
[1]