Я реализовал список в 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;
}