我正在学习C ++中的数据结构。这是一个简单的插入程序 使用链接和节点。插入发生在节点的开头。 我不明白代码的某些部分。
在函数display()
中,指针np
指向插入的信息,然后使用下一个节点获取先前信息的值。下一个指针使用insert_beginning()
函数指向先前的信息。
使用while
循环完成显示。下一个指针在每个循环中如何改变它的值?
PS:程序运行良好。
#include<iostream>
#include<process.h>
#include<cstdlib>
using namespace std;
struct node
{
int info;
node *next;
}*start,*newptr,*save,*ptr;
node *create_new_node(int);
void insert_beg(node*);
void display(node*);
/*----------------------------------------------------------------------------------------------------------------------------
The pointer 'start' points to the beginning of the list.
Function 'create_new_node()' takes one integer argument , allocates memory to create new node and returns
the pointer to the new node.(return type: node*)
Function 'insert_beg()' takes node* type pointer as an argument and inserts this node in the beginning of the list.
Function display takes node* type pointer as an argument and displays the list from this pointer till the end of the list
------------------------------------------------------------------------------------------------------------------------------
*/
int main()
{
start=NULL;
int inf;
char ch='y';
while(ch=='y'||ch=='Y')
{
system("cls");
cout<<"enter information for the new node ";
cin>>inf;
cout<<"\ncreating new node. Press enter to continue ";
system("pause");
newptr = create_new_node(inf);
if(newptr!=NULL)
{
cout<<"\nnew node created successfully. Press enter to
continue. ";
system("pause");
}
else
{
cout<<"\nCannot create new node. ABORTING!! ";
exit(1);
}
cout<<"\nnow inserting this node in the beginning of the list.
Press enter to continue ";
system("pause");
insert_beg(newptr);
cout<<"\nNow the list is \n";
display(start);
cout<<"\nPress 'Y' to enter more nodes, 'N' to exit\n";
cin>>ch;
}
return 0;
}
node *create_new_node(int n)
{
ptr=new node;
ptr->info=n;
ptr->next=NULL;
}
void insert_beg(node *np)
{
if(start==NULL)
start=np;
else
{
save=start;
start=np;
np->next=save;
}
}
void display(node *np)
{
while(np!=NULL)
{
cout<<np->info<<" ->";
np=np->next;
}
cout<<"!!!\n";
}
答案 0 :(得分:0)
简而言之 - 根据我的理解,你的基本问题是: -
使用while循环完成显示。下一个指针如何变化 它在每个循环中的值??
这恰好发生在这一行: -
np=np->next;
您基本上将指向node
结构的指针推进到另一个node
结构,该结构的地址位于第一个节点结构的next
成员中。这是教科书的内容,任何基本算法书都应该涵盖这一点
HTH!
答案 1 :(得分:0)
你的问题有点不清楚。特别是因为你声明:
PS:程序运行良好。
肯定会不。有一个错误只是意味着这个程序不起作用。
问题是create_new_node
没有返回指针值
node *create_new_node(int n)
{
ptr=new node;
ptr->info=n;
ptr->next=NULL;
return ptr; // This line is missing
}
除此之外,使用全局指针变量是一个非常糟糕的主意!
下面
struct node
{
int info;
node *next;
}*start,*newptr,*save,*ptr;
你定义struct node
,但你也定义了4个变量,即4个指向节点的指针。这些变量将是全局变量,即在所有代码中都可用。你应该从不做的事情。
而是根据需要创建局部变量 - 例如:
node *create_new_node(int n)
{
node *ptr; // Local variable instead of global
ptr=new node;
ptr->info=n;
ptr->next=NULL;
return ptr;
}
然后为insert_beg
更改它以便它返回一个新的开始指针 - 如:
node* insert_beg(node* start, node *np)
{
np->next=start;
return np;
}
并在main
中使用它,如:
node* start = NULL;
...
...
start = insert_beg(start, newptr);
BTW - 在现代C ++中,你永远不会使用原始指针,你永远不会编写自己的列表。使用智能指针而不是原始指针。使用标准容器而不是自己编写容器。