关于C语言链表的问题

2025-05-10 05:13:48
推荐回答(3个)
回答1:

两个答案都是D。
第一题p=q->next的话节点也丢失了,也就是删除了p,q两个节点。
第二题先r->next = q;的话,最后面的一句q->next = r->next相当于q->next = q;后面的节点就都丢了。
理 解链表操作要把握好实际内存存储的东西是不变的,变得是操作他们的指针。要时刻把握指针指向哪里,比如最开始p->next = q; q->next = r;
还有不明白的请追问。

回答2:

指针p、q、r 分别指向此链表中的三个连续结点,你可以假设p=1,q=2,r=3,
1),要删除2节点,把1和3连接起来。
p->next = 2,q->next = 3,r->next = 4
最后能达到p->next = r就行了,A)可以,B、也可以(p->next-next=q->next) C、可以,D不行
2)q,r 倒换过来。
p->next = 2,q->next = 3,r->next = 4
结果p->next=r(3),r->next=q(2),q->next=4
1、p->next =3(p->next=r), 选项ABCD都有
2、r->next = q ABCD都有
3、q->next=4 ABC都对,D不对,r->next已经修改成q了,不再是4了,
所以D不对。
其实你对链表还不熟悉,多看看链表的结构,理解理解你也就会了。从原理出手

回答3:

测试):

//---------------------------------------------------------------------------
#include
#include
typedef struct NODE
{
int date;
struct NODE *next;
} NODE;

//paixi()函数有问题,而且没有必要。
NODE *travers(NODE *,int ); //插入排序函数
int init(NODE *);
void visit(NODE *,int );
void main()
{
int n;
NODE *h,*p;
h=(NODE *)malloc(sizeof(NODE));

n=init(h);
p=travers(h,n);
visit(p,n);
}
NODE *travers(NODE *h,int n)
{
NODE *headl,*l,*p=h->next,*te;
l=headl=(NODE *)malloc(sizeof(NODE));
headl->next=NULL;
headl->date=1;
l->next=(NODE *)malloc(sizeof(NODE));
l->next->date=p->date;
l->next->next=headl;
p=p->next;
while (p->date&&headl->date {
while (l->next!=headl&&p->date>=l->next->date)
{
l=l->next;

}
te= (NODE *)malloc(sizeof(NODE));
te->date=p->date;
te->next=l->next;
l->next=te;
l=headl;
p=p->next;
}

return headl;
}

int init(NODE *h) //原函数有误,不能生成循环链表
{
int i=0;
NODE *l;
l=h;
printf("输入线性表的数据\n");
l->next=(NODE *)malloc(sizeof(NODE));
l=l->next;
scanf("%d",&l->date);
i++;
while(l->date!=0)
{
l->next=(NODE *)malloc(sizeof(NODE));
l=l->next;
scanf("%d",&l->date);

i++;
}
l->next=h->next;
return i;
}
void visit(NODE *p,int n)
{
int i=1;
p=p->next;

while(p->date&&i {
printf("%d\n",p->date);
p=p->next;
i++;
}
}

//---------------------------------------------------------------------------