关于C语言链表的问题
链表的题目应该怎么处理啊有什么方法么请指教最好能帮忙分析一下下面的两道题万分感谢啦1)有下列结构体说明和变量定义,如图所示,指针p、q、r分别指向此链表中的三个连续结点。...
链表的题目应该怎么处理啊 有什么方法么 请指教 最好能帮忙分析一下下面的两道题 万分感谢啦
1)有下列结构体说明和变量定义,如图所示,指针p、q、r 分别指向此链表中的三个连续结点。
struct node
{ int data;
struct node *next;
}*p,*q,*r;
现要将q 所指结点从链表中删除,同时要保持链表的连续,下列不能完成指定操作的
语句是( )。
A)p->next=q->next; B)p-next=p->next->next;
C)p->next=r; D)p=q->enxt;
2)现有以下结构体说明和变量定义,如图所示,指针p、q、r 分别指向一个链表中连续
的3 个结点。
struct node
{ har data;
truct node *next; }*p,*q,*r;
现要将q 和r 所指结点交换前后位置,同时要保持链表的连续,下列不能完成此操作
的语句是( )。
A)q? >next=r->next;p->next=r;r->next=q;
B)p? >next=r;q->next=r->next;r->next=q;
C)q? >next=r->next;r->next=q;p->next=r;
D)r? >next=q;p->next=r;q->next=r->next; 展开
1)有下列结构体说明和变量定义,如图所示,指针p、q、r 分别指向此链表中的三个连续结点。
struct node
{ int data;
struct node *next;
}*p,*q,*r;
现要将q 所指结点从链表中删除,同时要保持链表的连续,下列不能完成指定操作的
语句是( )。
A)p->next=q->next; B)p-next=p->next->next;
C)p->next=r; D)p=q->enxt;
2)现有以下结构体说明和变量定义,如图所示,指针p、q、r 分别指向一个链表中连续
的3 个结点。
struct node
{ har data;
truct node *next; }*p,*q,*r;
现要将q 和r 所指结点交换前后位置,同时要保持链表的连续,下列不能完成此操作
的语句是( )。
A)q? >next=r->next;p->next=r;r->next=q;
B)p? >next=r;q->next=r->next;r->next=q;
C)q? >next=r->next;r->next=q;p->next=r;
D)r? >next=q;p->next=r;q->next=r->next; 展开
3个回答
展开全部
两个答案都是D。
第一题p=q->next的话节点也丢失了,也就是删除了p,q两个节点。
第二题先r->next = q;的话,最后面的一句q->next = r->next相当于q->next = q;后面的节点就都丢了。
理 解链表操作要把握好实际内存存储的东西是不变的,变得是操作他们的指针。要时刻把握指针指向哪里,比如最开始p->next = q; q->next = r;
还有不明白的请追问。
第一题p=q->next的话节点也丢失了,也就是删除了p,q两个节点。
第二题先r->next = q;的话,最后面的一句q->next = r->next相当于q->next = q;后面的节点就都丢了。
理 解链表操作要把握好实际内存存储的东西是不变的,变得是操作他们的指针。要时刻把握指针指向哪里,比如最开始p->next = q; q->next = r;
还有不明白的请追问。
追问
能否帮忙解释一下链表使用的原理呢 不是很懂 所以做题就困难了 多谢啦
追答
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。要详细解释也就是书上那样了,不过不知道你看的哪本书,一般C语言的书里讲的比较简略,要看数据结构的书,还有从网上搜资料。
展开全部
指针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不对。
其实你对链表还不熟悉,多看看链表的结构,理解理解你也就会了。从原理出手
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不对。
其实你对链表还不熟悉,多看看链表的结构,理解理解你也就会了。从原理出手
追问
我确实对链表不熟悉 书上就一点点内容 我不怎么理解的了 还请指教啦~~~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
测试):
//---------------------------------------------------------------------------
#include<stdio.h>
#include<stdlib.h>
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<n)
{
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<n)
{
printf("%d\n",p->date);
p=p->next;
i++;
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include<stdio.h>
#include<stdlib.h>
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<n)
{
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<n)
{
printf("%d\n",p->date);
p=p->next;
i++;
}
}
//---------------------------------------------------------------------------
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询