удаление случайного узла в связанном списке - PullRequest
0 голосов
/ 20 апреля 2011

Я написал этот код для удаления любого элемента из связанного списка,

this is the output after insertion
 16 -->  15 -->  14 -->  13 -->  12 -->  11 --> 

when i delete 11 the output is like this
16 -->  15 -->  14 -->  13 -->  12 -->  0 --> 

как убрать этот ноль в последний раз?

typedef struct node
{
int data;
struct node *next;
}node;

node *getnode()
{
node *x;
x = (node*)malloc(sizeof(node));
if (x==NULL)
    {
        printf("no memory \n");
        exit(1);
    }
return x;
}

node *insert_front(int item , node *first)
{

node *temp;
temp = first;

temp = getnode();
temp -> data = item;
temp -> next = first;
return temp;
}

void *display(node *first)
{
node *temp;
temp = first;
if (temp == NULL)
    {
        printf("list is empty \n");
        return ;
    }
while (temp != NULL)

    {
        printf(" %d --> ",temp -> data);
        temp = temp -> next;

    }
}


void delete_middle(int item, node *first)
{
node *temp;
node *store_addr;
int value;
temp = first;
if (temp == NULL)
{
   printf("list is empty \n");
   return ;
}

while(temp!=NULL)
{
if (temp->data == item)
{
    if(temp->next != NULL)
    {
    temp->data =  temp->next->data;
            temp->next = temp->next->next;
    }
    else
     free(temp); 
    break;
}
temp = temp->next;
}


}


main()
{

node *first;
int item = 11,ch,i;
first = NULL;
while(1)
{
    printf("\n 1.insert front \n 2.display \n 3. delete middle \n 4.quit\n");
            scanf ("%d",&ch);
    switch(ch)
    {

    case 1:  // printf("\nenter the item to be inserted \n");
          //scanf("%d",&item);
           for(i=0 ;i<6;i++)
          first = insert_front (item++ , first);
          break;

    case 2:   display(first);
          break;


    case 3 :  printf("delete in middle \n");
          scanf("%d",&item);
          delete_middle(item, first);
          break;

    case 4:   exit(0);
          break;
}
}
}

Ответы [ 2 ]

3 голосов
/ 20 апреля 2011

При удалении необходимо сохранить предыдущий узел в списке и изменить его. Например, вы можете обрабатывать первый узел отдельно и выполнять цикл следующим образом

struct node* tmp;    
while(temp->next!=NULL)
{
    if (temp->next->data == item)
    {
        tmp = temp->next->next;
        free(temp->next); 
        temp->next = tmp;
    }
    temp = temp->next;
}

В вашем коде вы освобождаете (temp), если он последний, но вы не удаляете его из списка. Это делает список поврежденным и может привести к плохому поведению вашего программного обеспечения. НИКОГДА не держите ссылку на освобожденный указатель.

0 голосов
/ 20 апреля 2011

В вашем коде попробуйте это,

while(temp!=NULL)
{
   if (temp->data == item)
   {
        if(temp->next != NULL)
        {
            prev->next = temp->next;
        }

        free(temp);
        break; 
   } 
   prev = temp;
   temp = temp->next; 
 }  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...