尾插法 C/C++

来源:百度知道 编辑:UC知道 时间:2024/05/05 13:55:08
我在做一个非常令人纠结的事,便是用c++来完成C语言的数据结构。。。下面的一个尾插法,没有子函数,我想让自己了解结构了解得清楚一点。可是问题我输出的时候有些问题,为什么?
#include <iostream>
using namespace std;
struct inode
{
int data;
inode*next;
};

int main()
{
int m=8;
int n=4;
int i;
inode*head;
inode*rear;
rear=NULL;
head=NULL;
rear=head;

for(i=1;i<=n;i++)
{
inode*p=new inode;
rear->next=p;
rear=p;
p->data=i;
}
rear->next=NULL;
inode*p;
p=head;
while(p!=NULL)
{
cout<<p->data<<endl;

p=p->next;
}

return 0;
}
我还想问几个问题,对不起,我的链表学得很不好。
如果rear为NULL的话,后面就不能接东西了吗??rear = head = p这句是什么意思?说明head和P一样了,内容是p->data?
一楼的程序已经成功运行,但是我不明白为什么。
二楼虽然解释得很清楚,但是用G++运行出来是有“段错误”的。
你们两个的区别是判断head和rear的NULL与否。到底是谁是谁非?
分数我不介意,如果懂了这个知识点我承诺再加20分。

//要先判断rear是否为空.
//你的原程序中在插入数的时候,没设置head,所以head一直为null,则while循环p的值初始就为null,所以不会有任何输出。况且运行的话会出现运行时错误,因为rear的初值为null,i=1的时候,rear=null,这时候调用rear->next程序会报错退出,所以应该先判断rear是否为空,即判断表中是否有元素,没有元素的话,就应该将第一个插入的元素设为rear,同时也要设为head。head=rear=p表示head = p; rear = p;第二次插入的时候head仍然指向头元素,rear指向新元素。判断使用head和rear效果是一样的。
struct增加一个构造函数,for循环的逻辑改了一下
#include <iostream>
using namespace std;
struct inode
{
inode(int i) : data(i), next(null) {}
int data;
inode*next;
};

int main()
{
int m=8, n = 4;
inode *head = NULL, *rear = NULL;

for(int i=1;i<=n;i++)
{
inode *p = new inode(i);
(rear == NULL ? head : rear->next) = p;
rear=p;
}

inode *p = head ;
while(p!=NULL)
{
cout<<p->data<<endl;
p=p->next;
}

return 0;
}

rear=NULL;
head=NULL;
rear=head;
for(i=1;i<=n;i++)