链接列表与向量

时间:2014-06-28 15:17:35

标签: c++ vector linked-list

我试图通过向量上的链表执行某些操作。

我们已经获得了结构类型向量

typedef struct{
int *array;   // a pointer to vector's storage
int size;     // the current number of elements in the vector
int cap;      // the current capacity of the vector;
int init_cap; // the initial capacity the vector was initialised with.
} vector;

现在,我想创建一个函数,它接受一个指向vector结构的指针,并用给定的容量初始化它。所有字段都要初始化。我想用链表来做这件事。

这是我的代码

#include <iostream>
using namespace std;

typedef struct node {
int *array;     // a pointer to the vector's storage
int size;       // the current number of elements in the vector
int cap;        // the current capacity of the vector
int init_cap;   // the initial capacity the vector was initialised with
node *next;

} vector;

node *head = NULL;

我可以从矢量结构中创建节点,就像我在上面编写的代码中尝试过的那样吗?

void vector_init(vector *v, int capacity){

//initialising the vector with the given capacity
v->size     = capacity;
v->cap      = capacity;
v->init_cap = capacity;

//linked list with nodes created and values initialised

node *temp, temp2;
temp = head;
temp = new node;
temp->size     = capacity;
temp->cap      = capacity;
temp->init_cap = capacity;


temp->next = temp2
temp2 = new node;
temp2->size     = capacity;
temp2->cap      = capacity;
temp2->init_cap = capacity;
    temp2->next = NULL;
}

我是否制作了链接列表,并正确初始化了值?如果我们不创建临时点temp和temp2,只使用v-&gt; size等来初始化字段,那会使它成为一个链表吗?

1 个答案:

答案 0 :(得分:1)

您的代码存在许多问题。

  • 不要使用名称 vector - 有一个名为std :: vector的结构,很容易混淆。
  • 如果你想初始化结构的值,不要为它创建一个外部的单独函数 - 它不是c ++'ish。创建一个初始化所有值的结构构造函数。
  • 您不会在代码中的任何位置初始化数组变量。您应该为它分配空间,具体取决于构造函数中给出的容量。
  • 不要为变量使用名称'array'。在C ++中有一个名为std :: array的结构,它可能会令人困惑。
  • 你的实施对我来说没什么意义。您现在有数组链接列表;如果您希望在功能上用整合的链接列表替换整数,则每个节点应包含一个int值。
  • 如果出于某种原因,您希望坚持使用此实现,则还需要某种更新功能,以便在添加时自动更新大小上限变量或从数组中删除元素。否则你肯定会忘记它,你的结构会变得混乱。使这个功能成为结构的一部分 - 它不应该是一个外部功能。
  • typedef struct node 即使在将 vector 更改为其他内容后也没有意义 - 您仍然无法在代码中使用它。
  • 您对两种不同的结构使用相同的名称; 向量最初定义为包含4个字段,在下一行中定义为包含5个字段。

从技术上讲,这是一个链接列表,但您的 vector_init()功能无法正常工作。除了我上面所写的内容:

  • 您应该避免使函数依赖于全局变量,在本例中为 head 。它可以作为参数传递。
  • 这两行:
  

temp = head;

temp = new node;

没有意义。第一个使变量 temp 指向 head ;第二个告诉temp开始指向新变量,因为你正在使用运算符 new ,它分配空间并返回指向新创建的变量的指针。因此,当您执行进一步操作时,您不会对变量头进行操作,而是在 temp 指针失效后将丢失的另一个变量上运行。

  • 您根本不需要 temp temp2 变量。他们只是膨胀代码。

  • 这两行:

  

temp-&gt; next = temp2;

temp2 = new node;

应该切换位置,因为现在你分配一个尚未初始化的指针。

  • 写完所有这些东西之后,我意识到这个功能一般都是不正确的。出于某种原因,您首先处理参数 v ,然后执行与其无关的操作。

此外,您的教练说你可以使用链接列表解决所有类型的问题是不对的。它可以在某些情况下解决一些问题,或者根据上下文创建新问题。

我不想变得粗鲁,但是你所给予的任务的概念似乎存在根本性的错误。我想有人真的没想过。