我试着问我的问题,但我似乎没有正确地问它,而且我已经被困了2个月了。 (这很难过)
仅供参考:我从节点构建了一个链表:
struct node {
int number;
node *next; };
在我使用的主要链接这些 - >分配值
void insertAsFirstElement(node *&head, node *&tail, int number){
node *temp = new node;
temp->number = number;
temp->next = NULL;
head = temp;
tail = temp; }
现在我正在尝试创建一个skiplist,它应该与我的原始节点具有相同的结构,除了node * next应该是node类型的指针数组。
struct node {
int number;
node *next[3];
};
我对如何拥有一个节点指针数组感到困惑。我注意到它们看起来像这样:node ** next然后声明要动态分配内存。我只是希望我的阵列大小为4.所以[3]。
我的问题是如何使用main()中的节点指针数组创建新节点,并将某些内容放在nodes数组的第一个插槽中?
这不适用于将数据放入数组中,但它可以用于输入数字。
void insertAsFirstElement(node *&head, node *&tail, int number){
node *temp = new node;
temp->number = number;
cout<<temp->number<<endl;
temp->next[0] = tail;
cout<<temp->next[0]<<endl;
head->next[0] = temp;
cout<<head->next[0]<<endl;
}
请帮帮我。
答案 0 :(得分:4)
->
运算符是简写。
如果没有->
运算符,您可以编写
(*var).prop;
使用->
运算符,您可以写:
var->prop;
因此,要将节点存储在列表的第一个位置,请编写:
void StoreNode(node *node){
node *temp = new node;
temp->next[0]=node;
}
要从列表中的节点检索数据,您可以写:
temp->next[0]->number
与写作
相同(*temp).next[0]->number
与写作
相同( *((*temp).next[0]) ).number
你的代码这一行似乎有点困惑:
void insertAsFirstElement(node *&head, node *&tail, int number){
请记住,您只是将您的函数传递给节点的地址。因此,您只需要
void insertAsFirstElement(node *head, node *tail, int number){
在函数本身内部,您必须在列表中找到正确的位置,即进入**
符号时。
答案 1 :(得分:0)
初看起来的代码似乎没问题。指针数组就是这样一个元素数组,每个元素都是一个指针,你可以使用它与代码显示的语法完全一致。
但请注意,在类中声明指针数组时,元素不会自动初始化,因此您可能希望将尚未使用的元素修复为NULL。此外,在跳过列表中,您可能需要知道哪个&#34;级别&#34;节点已插入。
你确定你的问题出在那个部分吗?通常使用C ++,错误并不会在它完成的时候出现,但很久以后就会出现。这是因为&#34;未定义的行为&#34;语言规则(又名&#34;程序员从不犯错误&#34;)。