C中的结构:使用数组实现链表

C中的结构:使用数组实现链表,c,struct,C,Struct,在这个程序中,我尝试使用数组实现一个链表。我将数组TabLIST的元素初始化为-1,这样我就可以将数组中的每个元素的值都看作是一个空的框,我可以用来在列表中存储一个新的元素。 尝试运行此程序时出现分段错误。你能解释一下我的代码有什么错误吗 我试着调试我的代码,它说在 第75行:while(list.tabList[i].valeurElem!=-1) 这是我的密码: typedef struct elementList { int valeurElem; int indexSui

在这个程序中,我尝试使用数组实现一个链表。我将数组TabLIST的元素初始化为-1,这样我就可以将数组中的每个元素的值都看作是一个空的框,我可以用来在列表中存储一个新的元素。 尝试运行此程序时出现分段错误。你能解释一下我的代码有什么错误吗

我试着调试我的代码,它说在 第75行:while(list.tabList[i].valeurElem!=-1)

这是我的密码:

typedef struct elementList
{
    int valeurElem;
    int indexSuivant;
    int indexElem;

} elementList;


typedef struct list{

    elementList tabList[tailleMax];
    int debut;
    int fin;

} listT;

// To initialize the list 
void initListT(listT list)
{

for(int i = 0; i < tailleMax; i++)
   {
        list.tabList[i].valeurElem      = -1;
        list.tabList[i].indexSuivant    = -1;
        list.tabList[i].indexElem       = -1;

   }

}

// To create a new linked list
listT creerListeT()
{
    listT alist;

    initListT(alist);
    alist.debut = 0;
    alist.fin   = 0;

   return alist;
}


// To test if the list is empty
bool estVideListT(listT list)
{
    return list.tabList[ 0 ].valeurElem   ==  -1 ; 
}

// Function To insert in the head of the linked list 
listT insererTeteListT(listT list, int elemInserer)
{
    if( estVideListT(list) )
    {
        int a = list.debut;
        list.tabList[ a ].valeurElem     = elemInserer;
        list.tabList[ a ].indexSuivant   = list.debut + 1;
        list.tabList[ a ].indexElem      = list.debut;

        return list;
    }
    else 
    {
        int i = 0;

    while(list.tabList[i].valeurElem != -1)
    {
        i++;
    }

    list.tabList[ i ].valeurElem   = elemInserer;
    list.tabList[ i ].indexSuivant = list.debut;
    list.debut = i;

    return list;
    }

}



void printList(listT list)
{
    if( estVideListT(list) )  // testing if the array is empty
    {
        printf("The array is empty\n");
    }
    else
    {
        int i = list.debut;

        while( list.tabList[i].indexSuivant != -1 )
        {
            printf("Element with index %d is : %d \n", i, list.tabList[i].valeurElem);
            i++;
        }

    printf("Element with index %d (Last element) is : %d \n", i, list.tabList[i].valeurElem);

    }
}

int main()
{
    // Creating the list
    listT myList =  creerListeT();

    // Insertion of the elements in the list (each element in the head of the list)
    insererTeteListT(myList, 5);
    insererTeteListT(myList, 3);
    insererTeteListT(myList, 2);
    insererTeteListT(myList, 4);
    insererTeteListT(myList, 7);

    // Printing the list 
    printList(myList);

    return 0;
}
typedef结构元素列表
{
瓦勒勒勒姆国际酒店;
int指数;
int-indexElem;
}元素列表;
类型定义结构列表{
元素列表列表列表[tailleMax];
int首次亮相;
内鳍;
}利斯特;
//初始化列表的步骤
void initListT(列表列表)
{
对于(int i=0;i
在以下代码中:

// To initialize the list 
void initListT(listT list)
{
    for(int i = 0; i < tailleMax; i++)
    {
        list.tabList[i].valeurElem      = -1;
        list.tabList[i].indexSuivant    = -1;
        list.tabList[i].indexElem       = -1;

    }

}
//初始化列表的步骤
void initListT(列表列表)
{
对于(int i=0;i

由于您是按值传递
列表
,因此所有更改都是此函数中
列表
变量的本地更改。

这里是一个与基本代码相关的工作示例,请不要忘记释放与malloc对应的内存。我将把它作为一种锻炼留给你们去享受。此外,还需要检查与tailleMax关联的边界条件

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#define tailleMax 100


typedef struct elementList
{
    int valeurElem;
    int indexSuivant;
    int indexElem;

} elementList;


typedef struct list{

    elementList tabList[tailleMax];
    int debut;
    int fin;

} listT;


// To initialize the list 
void initListT(listT *list)
{
    for(int i = 0; i < tailleMax; i++)
    {
        list->tabList[i].valeurElem      = -1;
        list->tabList[i].indexSuivant    = -1;
        list->tabList[i].indexElem       = -1;

    }

}


// To create a new linked list
listT *creerListeT()
{
    listT *alist = (listT *)malloc(sizeof(listT));

    initListT(alist);
    alist->debut = 0;
    alist->fin   = 0;

    return alist;
}


// To test if the list is empty
bool estVideListT(listT *list)
{
    return list->tabList[ 0 ].valeurElem   ==  -1 ; 
}


// Function To inser in the head of the linked list 
listT *insererTeteListT(listT *list, int elemInserer)
{
    if( estVideListT(list) )
    {
        int a = list->debut;
        list->tabList[ a ].valeurElem     = elemInserer;
        list->tabList[ a ].indexSuivant   = list->debut + 1;
        list->tabList[ a ].indexElem      = list->debut;

        return list;
    }
    else // Cas de liste non vide
    {
        int i = 0;

        // On cherche l'indice de la première case vide
        while(list->tabList[i].valeurElem != -1)
        {
            i++;
        }

        // Un élément est dans la tête de la liste s'il n'y aucun élément qui le pointe
        list->tabList[ i ].valeurElem   = elemInserer;
        list->tabList[ i ].indexSuivant = list->debut;
        list->debut = i;

        return list;
    }

}


// Function to print the elements of  the list 
void printList(listT *list)
{
    if( estVideListT(list) )  // testing if the array is empty
    {
        printf("The array is empty\n");
    }
    else
    {
        // To revise
        int i = 0;

        while( list->tabList[i].indexSuivant != -1 )
        {
            printf("Element with index %d is : %d \n", i, list->tabList[i].valeurElem);
            i++;
        }

        printf("Element with index %d (Last element) is : %d \n", i-1, list->tabList[i-1].valeurElem);

    }
}

int main()
{
    // Creating the list
    listT *myList =  creerListeT();

    // Insertion of the elements in the list 
    insererTeteListT(myList, 5);
    insererTeteListT(myList, 3);
    insererTeteListT(myList, 2);
    insererTeteListT(myList, 4);
    insererTeteListT(myList, 7);

    // Printing the list 
    printList(myList);

    return 0;
}
#包括
#包括
#包括
#定义tailleMax 100
类型定义结构元素列表
{
瓦勒勒勒姆国际酒店;
int指数;
int-indexElem;
}元素列表;
类型定义结构列表{
元素列表列表列表[tailleMax];
int首次亮相;
内鳍;
}利斯特;
//初始化列表的步骤
无效初始列表(列表*列表)
{
对于(int i=0;i表格列表[i]。ValureLem=-1;
列表->表格列表[i]。索引向导=-1;
列表->表格列表[i].indexElem=-1;
}
}
//创建新的链接列表的步骤
listT*creerListeT()
{
listT*alist=(listT*)malloc(sizeof(listT));
初始列表(alist);
初始值=0;
alist->fin=0;
回归主义者;
}
//测试列表是否为空
bool estVideListT(列表*列表)
{
返回列表->表格列表[0]。ValureLem==-1;
}
//函数在链表的头部插入
listT*INSERETETELISTT(listT*list,int elemInserer)
{
if(estVideListT(列表))
{
INTA=列表->首次登场;
列表->表格列表[a]。ValureLem=elemInserer;
列表->小报列表[a]。索引向导=列表->首次登场+1;
列表->表格列表[a]。indexElem=list->首次登场;
退货清单;
}
else//Cas de liste未提供
{
int i=0;
//关于普莱米埃案件的调查
while(list->tabList[i].valeurElem!=-1)
{
i++;
}
//这是一个很好的例子
列表->表格列表[i]。ValureLem=elemInserer;
列表->小报[i].索引向导=列表->首次登场;
列表->首次登场=i;
退货清单;
}
}
//函数打印列表中的元素
作废打印列表(列表*列表)
{
if(estVideListT(list))//测试数组是否为空
{
printf(“数组为空\n”);
}
其他的
{
//修改
int i=0;
while(list->tabList[i].indexSuivant!=-1)
{
printf(“索引为%d的元素是:%d\n”,i,list->tabList[i].valurelem);
i++;
}
printf(“索引为%d(最后一个元素)的元素是:%d\n”,i-1,list->tabList[i-1].valurelem);
}
}
int main()
{
//创建列表
listT*myList=CreerListT();
//在列表中插入元素
insererTeteListT(myList,5);
insererTeteListT(myList,3);
insererTeteListT(myList,2);
insererTeteListT(myList,4);
insererTeteListT(myList,7);
//印刷李