c++链表问题 10

创建一个链表环,链表最后一个节点的指针指向头结点。以0为结束标志,输入一个整数N,从头结点开始逐个数节点,数到第N个节点时删除该节点,并将该节点的前一个节点作为头结点。起... 创建一个链表环,链表最后一个节点的指针指向头结点。以0为结束标志,输入一个整数N,从头结点开始逐个数节点,数到第N个节点时删除该节点,并将该节点的前一个节点作为头结点。起始位置从输入的第一个节点算起,该节点的计数为N=0。 展开
 我来答
奇巧且敏捷的小抹香鲸E
2014-05-14 · 超过60用户采纳过TA的回答
知道答主
回答量:132
采纳率:0%
帮助的人:143万
展开全部
这你得对 指针很了解才可以 很难用语言描述, 你可以加断点 然后一步一步的走 随时看 这些 指针的指向 多看两遍就明白了

这是链表的入门 我也曾经在这很郁闷 慢慢看就懂了,最主要是要会断点调试,在vs2005里 编译然后加断点,然后在右侧的watch窗口里随时看指针的变化。就会好理解多了

下面我给你讲这个程序

你的 book这个类 本身定义了一个 book 类型的指针作为其自己的一个成员,

就是next这个成员。就是这个指针 指向了下一个节点,每个节点都是 book类的一个实例。

book *head=NULL; //创建一个头指针,并将它初始化为0,目的是避免使它成为野指针
//然后我们建立一个返回book类指针的creat()函数,该函数用来建立动态链表
//由于该函数会返回一个指向book类指针,所以我们看见它的返回值是book*
book *creat()
{
book *p1,*p2;//p1作为下一个结点的指针,p2作为本结点的指针

p1= new book;//p1 指针去开辟了一个sizeof(book)大小的内存

head=p1;//p1新开辟的节点成为链表头,也就是第一个节点。

p2=p1;//与其说 p2 指向刚开辟好的表头,还不如说p2保存了p1指向的地址。

cout<<"请输入图书编号,并以0作为结束"<<endl;

cin>>p1->num;//将编号保存在第一本书的编号中

if(p1->num!=0)
{
cout<<"请输入图书价格"<<endl;
cin>>p1->price;
}
else
{
delete p1;\\如果输入了0那么输入结束,没有插入任何记录,释放刚开辟的内存。
p2=NULL;\\p1释放后,继续释放p2
p2->next=NULL;
head=NULL;
return head;
}
while(p1->num!=0)\\判断上述之后,即 输入的ID不是0,进循环
{
p2=p1;\\刚才p1开辟的节点有效,因为id不是0,所以成功输入了一个节点。然后让p2保存输入好的节点地址,p1自己又去开辟新节点(此时p1还是指向刚输入好的节点)。
p1=new book;\\到这p1去开辟新节点,也就是开辟新内存(其实每次开辟新内存要判断是不是开辟成功的)。
cout<<"请输入图书编号,并以0作为结束"<<endl;
cin>>p1->num;//将编号保存在第一本书的编号中
if(p1->num!=0)
{
cout<<"请输入图书价格"<<endl;
cin>>p1->price;
}\\到这输入完新的一条信息,也就是p1新开辟的内存里有数据了,要保存到链表里了,所以下一条语句--
p2->next=p1;\\因为p2是上一次p1开辟节点的地址,也就是上一个节点,每个节点都是你的book类型的,他都有指向下一个节点的成员next指针。所以上个节点p2的成员next当然要指向下一个节点,也就是p1新开辟的地址,这样就完成了一次链表的节点之间的链接。然后继续循环,直到输入id是0为止。
}
delete p1;
p2->next=NULL;
return head;
}

int main()
{
creat();
return 0;
}

不知道讲清楚了没有,不过你这么写有点啰嗦,主程序第一段是 定义了类,
第二段是 先创建一个头结点,如果输入了0就丢弃新建的节点反悔NULL,
第三段又判断输入的是不是0,有些繁琐,不够优化

我这有一整套优化的代码类似于你的,有插入节点 删除节点 等函数,你的树图书我的是 学生信息,其实完全一样,你参考下,在vs2005下编译通过的。希望有帮助,再接再厉吧!

#include <stdlib.h>
#include <stdio.h>
#define NULL 0
#define LEN sizeof(student)

//class student
//{
//public: long num; /*学号*/
//public: float score; /*分数,其他信息可以继续在下面增加字段*/
//public: student *next; //= NULL; /*指向下一节点的指针*/
//}; //Student,*PPStudent;
//
//int n; /*节点总数*/
//
///*
//==========================
//功能:创建节点
//返回:指向链表表头的指针
//==========================
//*/
//student *create()
//{
// student *head = NULL; /*头节点*/
// student *p1= NULL; /*p1保存创建的新节点的地址*/
// student *p2= NULL; /*p2保存原链表最后一个节点的地址*/
//
//
// n = 0; /*创建前链表的节点总数为0:空链表*/
// do
// {
// p1 = ( student *)malloc(LEN); /*开辟一个新节点,我这里用了malloc,比较老,C语言用的多,你用new去开辟新内存完全可以*/
// if (p1 == NULL) /*节点开辟不成功*/
// {
// printf("\nCann't create it, try it again in a moment!\n");
// throw "\nCann't create it, try it again in a moment!\n";
// // return NULL;
// }
// // else /*节点开辟成功*/
// {
// //head = NULL; /*开始head指向NULL*/
//
// printf("Please input %d node -- num,score-> ",++n);
// scanf("%ld,%f",&(p1->num),&(p1->score)); /*录入数据*/
// /*
// 注意:
// 此时的p2就是p1,也就是p1->next指向NULL。
// 这样写目的是与下面else保持一致。
// */
// //p1->next = NULL;
// if (!head) /*如果节点总数是1,则head指向刚创建的节点p1*/
// {
// head = p1;
// }
// else
// {
// p2->next = p1; /*指向上次下面刚开辟的节点*/
// }
// p2 = p1; /*如果节点开辟成功,则p2先把它的指针保存下来以备后用*/
// }
// } while(p1->num != 0); /*只要学号不为0,就继续录入下一个节点*/
//
// return head; /*返回创建链表的头指针*/
//}
//
//
//
//
// void print( student *head)
// {
// int a = n-1;
// student *p;
// printf("\nNow,these %d records are->\n ",a);
// p = head;
//
//
// //if (head != NULL)
//
// printf("the head is-> %o\n",head);
//
// while(p!= NULL && p->num != 0)
// {
// printf("%o %ld %5.1f %o\n",p,p->num,p->score,p->next);
// p = p->next;
// }
// //do
//
// }
//
//
// void destroy ( student *head)
// {
// student *p = head;
// if (head == NULL)
// return;
//
// while (p != NULL)
// {
// head = head->next;
// free(p);
// p = head;//
// }
//
// }
//
// student * del( student * head,long num)
// {
// student *p3;
// student *p4;
//
// if (head == NULL)
// {
// printf("\n list is null\n");
// return head;
// }
//
// p3 = head;
// p4 = p3;
// while(p3->num != num && p3->next != NULL)
// {
// p4 = p3;
// p3 = p3->next;
// }
//
// if (p3->num = num)
// {
// if (p3 == head)
// {
// head = p3->next;
// }
// else
// {
// p4->next = p3->next;
//
// }
// free(p3);
// p3 = NULL;
// printf("\n delete the node whose num = %d complete\n",num);
// }
// else
// {
// printf("can not found the specified node whose num = %d",num);
// }
//
// return head;
// }
//
// student * insert( student *head,long num)
// {
// student * p1;
// student * p2;
// student * p5;
//
// if (head == NULL)
// {
// printf("\nsorry,there is no links.");
// p5 = create();
// }
// else
// {
// //p5 = (new ( student *))[LEN];
// p5 = ( student *)malloc(LEN);
// if (p5 == NULL)
// {
// printf("\nCann't create it, try it again in a moment!\n");
// return NULL;
// }
// else
// {
// printf("Please input new node info -- num,score-> ");
// scanf("%ld,%f",&(p5->num),&(p5->score));
// p5->next = NULL;
// p1 = head;
// }
//
// }
// while (p1->num != num && p1->next != NULL)
// {
// p1 = p1->next;
// p2 = p1;
// }
// if (p1->num = num)
// {
// if (p1 == head)
// {
// p1->next = p5;
//
// }
// else
// {
// p5->next = p1->next;
// p1->next = p5;
// }
// printf("insert completet!\n");
// }
// return head;
//
// }
//
//
// student *Reverse( student *head)
// {
// student *p;
// student *p1;
// student *p2;
//
// p1 = NULL;
// p2 = head;
// while (p2 != NULL)
// {
// p = p2->next;
// p2->next = p1;
// p1 = p2;
// p2 = p;
// }
// head = p1;
// return head;
// }
希望对你能有所帮助。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式