c -在循环链表的末尾添加一个元素



我会尽量说清楚。

我在一个名为"esercizio.h"的文件中有这个结构体(由于我的老师,我不能改变它):

#ifndef ESERCIZIO_H
#define ESERCIZIO_H
struct ElemSCL{
    int info;
    struct ElemSCL* next;
};
typedef struct ElemSCL NodoSCL;
typedef NodoSCL* TipoSCL;
void accoda(TipoSCL* pscl, int i);
#endif

函数"accoda"必须在循环链表(由TipoSCL* pscl指向)的末尾添加一个元素(int i)。我尝试在一个名为"esercizio.c"的文件中编写函数体:

#include <stdio.h>
#include <stdlib.h>
#include "esercizio.h"
void accoda(TipoSCL* pscl, int i){
    NodoSCL* temp = (NodoSCL*) malloc(sizeof(NodoSCL));
    temp->info = i;
    temp->next = temp;
    if (pscl == NULL){
        return;}
    while ((*pscl)->next != *pscl){
        *pscl = (*pscl)->next;}
    (*temp)->next = (*pscl)->next; //Problems starts here
    (*pscl)->next = *temp;
    }

正如我让你注意到的,在我的代码中,一切都是好的,如果我不添加最后两行。如果函数中没有TypeSCL*而是NodeSCL*,我会使用:

temp->next = pscl->next;
pscl->next = temp;}

但是我的老师决定用TypeSCL* pscl代替NodeSCL* pscl。

我有一个"test.h"文件…

#include "esercizio.h"
#ifndef TEST_H
#define TEST_H
char* toString(TipoSCL scl);
#endif

…还有一个"test.c"文件,其中包含main()函数和所有让我检查代码是否正常工作的输入:

#include <stdlib.h>
#include <string.h>
#include "../libtest/libtest.h"
#include "test.h"
#include "esercizio.h"

const int NTEST=5;
TipoSCL input[5];
int add[5] = {1,2,3,4,5};
TipoSCL expected[5];

int main(int argc, char** argv){

    input[0] = NULL;
    input[1] = (TipoSCL) malloc(sizeof(NodoSCL));
    input[1] -> info = 1;
    input[1] -> next = input[1];
    input[2] = (TipoSCL) malloc(sizeof(NodoSCL));
    input[2] -> info = 1;
    input[2] -> next = (TipoSCL) malloc(sizeof(NodoSCL));
    input[2] -> next -> info = 2;
    input[2] -> next -> next = input[2];
    input[3] = (TipoSCL) malloc(sizeof(NodoSCL));
    input[3] -> info = 1;
    input[3] -> next = (TipoSCL) malloc(sizeof(NodoSCL));
    input[3] -> next -> info = 2;
    input[3] -> next -> next = (TipoSCL) malloc(sizeof(NodoSCL));
    input[3] -> next -> next -> info = 3;
    input[3] -> next -> next -> next = input[3];
    input[4] = (TipoSCL) malloc(sizeof(NodoSCL));
    input[4] -> info = 1;
    input[4] -> next = (TipoSCL) malloc(sizeof(NodoSCL));
    input[4] -> next -> info = 2;
    input[4] -> next -> next = (TipoSCL) malloc(sizeof(NodoSCL));
    input[4] -> next -> next -> info = 3;
    input[4] -> next -> next -> next = (TipoSCL) malloc(sizeof(NodoSCL));
    input[4] -> next -> next -> next -> info = 4;
    input[4] -> next -> next -> next -> next = input[4];
    expected[0] = (TipoSCL) malloc(sizeof(NodoSCL));
    expected[0] -> info = 1;
    expected[0] -> next = expected[0];
    expected[1] = (TipoSCL) malloc(sizeof(NodoSCL));
    expected[1] -> info = 1;
    expected[1] -> next = (TipoSCL) malloc(sizeof(NodoSCL));
    expected[1] -> next -> info = 2;
    expected[1] -> next -> next = expected[1];
    expected[2] = (TipoSCL) malloc(sizeof(NodoSCL));
    expected[2] -> info = 1;
    expected[2] -> next = (TipoSCL) malloc(sizeof(NodoSCL));
    expected[2] -> next -> info = 2;
    expected[2] -> next -> next = (TipoSCL) malloc(sizeof(NodoSCL));
    expected[2] -> next -> next -> info = 3;
    expected[2] -> next -> next -> next = expected[2];
    expected[3] = (TipoSCL) malloc(sizeof(NodoSCL));
    expected[3] -> info = 1;
    expected[3] -> next = (TipoSCL) malloc(sizeof(NodoSCL));
    expected[3] -> next -> info = 2;
    expected[3] -> next -> next = (TipoSCL) malloc(sizeof(NodoSCL));
    expected[3] -> next -> next -> info = 3;
    expected[3] -> next -> next -> next = (TipoSCL) malloc(sizeof(NodoSCL));
    expected[3] -> next -> next -> next -> info = 4;
    expected[3] -> next -> next -> next -> next = expected[3];
    expected[4] = (TipoSCL) malloc(sizeof(NodoSCL));
    expected[4] -> info = 1;
    expected[4] -> next = (TipoSCL) malloc(sizeof(NodoSCL));
    expected[4] -> next -> info = 2;
    expected[4] -> next -> next = (TipoSCL) malloc(sizeof(NodoSCL));
    expected[4] -> next -> next -> info = 3;
    expected[4] -> next -> next -> next = (TipoSCL) malloc(sizeof(NodoSCL));
    expected[4] -> next -> next -> next -> info = 4;
    expected[4] -> next -> next -> next -> next = (TipoSCL) malloc(sizeof(NodoSCL));
    expected[4] -> next -> next -> next -> next -> info = 5;
    expected[4] -> next -> next -> next -> next  -> next = expected[4];


    test_reset();
    for (int i = 0; i < NTEST; i++) {
        print_test_start(i+1);
        printf("Funzione: accodan");
        printf("Input: %sn", toString(input[i]));
        accoda(&input[i],add[i]);
        test_compare_strings(toString(expected[i]),toString(input[i]));
        print_test_end();
        print_n_success("#Test superati: ");
    }
    print_test_result("Percentuale test corretti:");
}

char* toString(TipoSCL scl){
    char* res = (char*) malloc(200*sizeof(char));
    res[0] = '[';
    res[1] = '';
    TipoSCL aux = scl;
    if (aux != NULL) {
        char buf[10];
        do{
            sprintf(buf,"%d->",aux -> info);
            strcat(res,buf);
            aux = aux -> next;
        }
        while(aux != scl);
        sprintf(buf,"|%d",aux -> info);
        strcat(res,buf);
        aux = aux -> next;
    }
    strcat(res,"]");
    return res;
}

我的意思是"一切都好,如果我不添加最后两行"到我的代码?当我运行不带

的程序时(感谢终端和cd make )
(*temp)->next = (*pscl)->next; //Problems starts here
(*pscl)->next = *temp;

测试运行没有问题(当然,它告诉我,我没有一个正确的结果。)但是,如果我将这两行添加到我的代码中,我得到了"分割错误:11"。

尝试将add函数更改为::

void add(TypeSCL* pscl, int i){
    NodeSCL* temp = (NodeSCL*) malloc(sizeof(NodeSCL));
    temp->info = i;
    temp->next = temp;
    if (*pscl == NULL){
    *pscl = temp;
        return;} 
    NodeSCL *tempCheck = *pscl;
    while(tempCheck->next != *pscl) {
        tempCheck = tempCheck->next;
    }
    tempCheck->next = temp;
    temp->next = (*pscl); 
}

你做错的事情::你需要意识到C中的所有东西都是按值传递的,所以如果你传递一个指针,那个指针也是按值传递的。所以,当你的老师告诉你使用TypeSCL* pscl时,它意味着NodeSCL **pscl,她是对的,因为你不能用NodeSCL *pscl来做,这可能有助于你理解我为什么这么说::在链表中添加节点时使用双指针的原因是什么?

此外,在您的情况下,当pscl == NULL首先应该是*pscl == NULL时,您需要将*pscl设置为新节点。

接下来,如果你想在末尾添加一个新节点,你应该使用一个while循环,正如@Neha Chauhan所提到的。

接下来,您使用的最后两个语句::

(*temp)->next = (*pscl)->next;
(*pscl)->next = *temp;

您将新添加节点的next设置为链表的第二个元素,这没有任何意义。

我已经使用变量NodeSCL *tempCheck移动到链表的最后一个节点!

最后两行应该是

tempCheck->next = temp;
temp->next = (*pscl); 

最后,兄弟,你需要在指针的基础上工作。(不介意!)

编辑::

为什么你的测试没有最后两行::因为,用你写的代码,你的链表总是大小为1,没有元素添加到第一个元素之后!所以,测试运行了,但是失败了!

我认为你的PSCL指针必须走到链接列表的末尾,然后它应该插入temp元素。你能做的是

    void add(TypeSCL* pscl, int i){
    NodeSCL* temp = (NodeSCL*) malloc(sizeof(NodeSCL));
    temp->info = i;
    temp->next = temp;
    if (pscl == NULL){
    return;
    while(pscl->next != pscl)
    pscl = pscl->next;
    temp->next = (*pscl)->next; //THINGS GO WRONG HERE...
    (*pscl)->next = temp;       //...AND HERE
     }

"

相关内容

  • 没有找到相关文章

最新更新