使用链接列表实现的任意索引处的序列插入

时间:2013-03-07 18:42:41

标签: c insert linked-list

我正在尝试使用add_to_front函数实现sequence_insert_at here

之前的一切

typedef struct sequence *Sequence;

从另一个c文件粘贴。

void sequence_insert_at(Sequence s, int pos, int item)
{
    struct node* temp = s->lst;
    for(; pos > 0; --pos)
    {
        temp = temp->rest;
    }
    add_to_front(&temp, item);
    ++s->length;
    if(!temp->rest)
    {
        s->end = temp;
    }
    //s->lst = temp;
}

我不知道为什么我一直收到运行时错误。如果我克隆s-> lst并遍历克隆,我不会修改s中节点的指针,但是如果我改变temp,s-> lst应该有反射的变化,因为节点都是静止链接的。关于如何解决这个问题的任何想法?我尝试在遍历之后的temp之前创建另一个节点,然后设置它 - > rest = temp,但也失败了。

1 个答案:

答案 0 :(得分:2)

以下错误可以发现,但只有到目前为止才能运行主要功能

new_sequence不会初始化它创建的Sequence中的任何内容。在lst

中访问时,sequence_insert_at未初始化
struct node* temp = s->lst;

这里应该是什么样子

Sequence new_sequence()
{
    Sequence s = malloc(sizeof(struct sequence));
    if(!s)
    {
        printf("Out of memory. Can't allocate s\n");
        exit(EXIT_FAILURE);
    }
    s->lst = malloc(sizeof(struct node));
    if(! s->lst) {
        printf("Out of memory. Can't allocate lst\n");
    }
    s->lst->rest = NULL;
    s->length = 0;
    return s;
}

还必须将s->lst->rest设置为NULL,这就是说明列表中没有更多元素而end已经过时了。

struct sequence
{
    struct node* lst;
    int length;
};

您应该将序列本身传递给函数,而不是指向序列中某些内部数据的指针。

add_to_front(&temp, item);

您的sequence_insert_at函数应该是可以处理任何位置而不是add_to_front()的函数,因此通过0的{​​{1}}位置调用更容易在一个功能中完成孔工作,而不是一半半。

add_to_front()

并且在void sequence_insert_at(Sequence s, int pos, int item) { if(s && pos <= s->length) { print_sequence(s); struct node *newnode = malloc(sizeof(struct node)); if (newnode == NULL) { printf("ERROR! add_to_front ran out of memory!\n"); exit(EXIT_FAILURE); } newnode->first = item; struct node* temp = s->lst; struct node* prv = NULL; for(int i = 0; i < pos; i++) { printf("skip %d\n", temp->first); prv = temp; temp = temp->rest; } newnode->rest = temp; if(pos == 0) { printf("insert as first\n"); s->lst = newnode; } else { printf("insert before %d\n", temp->first); prv->rest = newnode; } ++s->length; } } 中只需要一个陈述

add_to_front

插入列表的后面

void add_to_front(Sequence s, int item) {
    sequence_insert_at(s, 0, item);
}

使用主要功能的小测试

void add_to_back(Sequence s, int item) {
    sequence_insert_at(s, s->length, item);
}

输出是:

void print_sequence(Sequence s)
{
    struct node* temp = s->lst;
    for(int i = 0; i < s->length; temp = temp->rest) {
        printf("%d ", temp->first);
        i++;
    }
    printf("\n");
}

int main()
{
    Sequence derp = new_sequence();
    sequence_insert_at(derp, 0, 14);
    add_to_front(derp, 16);
    sequence_insert_at(derp, 0, 17);
    sequence_insert_at(derp, 2, 15);
    add_to_back(derp, 13);
    print_sequence(derp);
    delete_sequence(derp);
    return 0;
}

你必须通过其他功能并修复它们。

最后我应该注意,你选择的变量名称有点混乱,如果没有误导,我会这样命名

17 16 15 14 13