Почему я не смог вставить элементы в список с непрерывной реализацией в C? - PullRequest
0 голосов
/ 10 января 2020

Я реализовал список в C следующим образом. Проблема в том, что когда я пытаюсь вставить элементы с помощью функции InsertList(), возвращается « Попытка вставить в позицию, отсутствующую в списке ». Но вместо этого я хотел, чтобы список вставлял элементы в указанные позиции. Чтобы это произошло, как я должен изменить свой код?.

#include <stdlib.h>
#define MAX 20
#define EMPTY 0
#define FULL MAX-1

typedef enum {FALSE, TRUE} Boolean;
typedef char ListEntry;
typedef int Position;
typedef struct list
{
    int count;
    ListEntry entry[MAX];
}List;

void CreateList(List *l)
{
    l->count=EMPTY;
}

Boolean IsListEmpty(List *l)
{
    return (l->count==EMPTY);
}

Boolean IsListFull(List *l)
{
    return (l->count==FULL);
}

int ListSize(List *l)
{
    return (l->count);
}

void InsertLast(ListEntry x,List *l)
{
    if(IsListFull(l))
        printf("Try to insert to full list\n");
    else
    {
        l->entry[l->count]=x;
        l->count++;
        printf("The entered element at last is %d\n", x);
    }
}

void InsertList(Position p,ListEntry x,List *l)
{
    if(IsListFull(l))
        printf("Try to insert to full list\n");
    else if(p<0 || p>ListSize(l))
        printf("Try to insert to a position not in list\n");
    else
    {
        int i;
        for(i=ListSize(l)-1;i>=p;i--)
            l->entry[i+1]=l->entry[i];
        l->entry[p-1]=x;
        printf("The entered element is: %d\n",x);
        l->count++;
    }
}

void ReplaceList(Position p,ListEntry x,List *l)
{
    if(IsListFull(l))
        printf("Try to replace to full list\n");
    else if(p<0 || p>ListSize(l))
        printf("Try to replace a position not in list\n");
    else
        l->entry[p-1]=x;
}

void DeleteList(Position p,List *l)
{
    int i;
    if(IsListEmpty(l))
        printf("Try to delete from a empty list\n");
    else if(p<0 || p>ListSize(l))
        printf("Try to delete a position not in list\n");
    else
    {
        ListEntry x=l->entry[p-1];
        for(i=p-1;i<ListSize(l);i++)
            l->entry[i]=l->entry[i+1];
        l->count--;
        printf("Deleted element is %d\n", x);
    }
}

void RetrieveList(Position p,List *l)
{
    if(IsListEmpty(l))
        printf("Try to retrieve from a empty list\n");
    else if(p<0 || p>ListSize(l))
        printf("Try to retrieve a position not in list\n");
    else{
        ListEntry x=l->entry[p-1];
    printf("Retrieved element is: %d\n", x);
    }
}
void Traverse(List *l)
{
    if(IsListEmpty(l))
        printf("Try to traverse a empty list\n");
    else
        printf("The elements of this list are: ");
    {
        for(int i=0;i<ListSize(l);i++)
        {
            printf("%d ", l->entry[i]);
        }
    }
}

Моя main() функция выглядит следующим образом:

{
    List l;
    CreateList(&l);
    Traverse(&l);
    DeleteList(2,&l);
    //InsertLast(5,&l);
    //InsertLast(6,&l);
    InsertList(1,3,&l);
    InsertList(2,2,&l);
    InsertList(3,1,&l);
    RetrieveList(1,&l);
    DeleteList(2,&l);
    int results = ListSize(&l);
    printf("The size of the list%d\n",results);
    Traverse(&l);

    return 0;
}

Ответы [ 2 ]

2 голосов
/ 10 января 2020

В начале. Ваш список пуст. Итак, ListSize возвращает 0. Вы пытаетесь вставить в позицию 1, которая определенно находится за пределами границ списка. Попробуйте вставить в позицию 0. Это имеет смысл, так как список пуст, позиция 0 не установлена. Зачем вставлять в позицию 1?

В вашем коде есть еще несколько ошибок. Например, когда вы вставляете, вы хотите сначала сместить содержимое, а затем установить новый элемент. Вы устанавливаете его на индекс (p-1). Следуя вашей логике c, вставив в позицию 1, она может работать, но это сбивает с толку. Если вы вставите что-то в определенную позицию, оно должно быть вставлено именно там.

Ваш код может выглядеть следующим образом

 void InsertList(Position p,ListEntry x,List *l)                                                                                                                                                                                                                                             
 {                                                                                                                                                                                                                                                                                               
     if(IsListFull(l))                                                                                                                                                                                                                                                                               
         printf("Try to insert to full list\n");                                                                                                                                                                                                                                                 
     else if(p<0 || p>ListSize(l))                                                                                                                                                                                                                                                                   
         printf("Try to insert to a position not in list\n");                                                                                                                                                                                                                                    
     else                                                                                                                                                                                                                                                                                        
     {                                                                                                                                                                                                                                                                                               
         int i;                                                                                                                                                                                                                                                                                      
         for(i=ListSize(l)-1;i>=p;i--)                                                                                                                                                                                                                                                                   
             l->entry[i+1]=l->entry[i];                                                                                                                                                                                                                                                              
         l->entry[p]=x;                                                                                                                                                                                                                                                                              
         printf("The entered element is: %d\n",x);                                                                                                                                                                                                                                                   
         l->count++;                                                                                                                                                                                                                                                                             
     }                                                                                                                                                                                                                                                                                       
}  

Я видел, что у вас есть дополнительная функция InsertLast, но InsertList также может успешно добавить элемент. Вы можете оставить все как есть или запретить добавление в функцию вставки.

Итак, удачной отладки!

0 голосов
/ 10 января 2020

При первой вставке количество элементов в списке равно 0, поэтому ListSize () вернет 0. Следовательно, условие 'if (p <0 || p> ListSize (l))' не может быть выполнено.

void InsertList(Position p,ListEntry x,List *l)
    {
        if(IsListFull(l))
            printf("Try to insert to full list\n");
        else if(p<0 || p>ListSize(l)) // the condition is never satisfied
     ... 

Вместо этого попробуйте выполнить условие if (p <0 || p> = MAX). Кроме того, у вас есть дополнительные ошибки в вашей функции InsertList. Попробуйте написать что-то похожее на следующий код:

else if(p<0 || p>= MAX)
    printf("Try to insert to a position not in list\n");
else
{
    int i;
    for(i=MAX-2;i>=p;i--)  // important point
        l->entry[i+1]=l->entry[i];
    l->entry[p-1]=x;
    printf("The entered element is: %d\n",x);
    l->count++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...