Команда прекращается сигналом 11 - PullRequest
0 голосов
/ 17 октября 2018
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
struct node{
  char data;
  int p;
  struct node *ptr;
};
struct node *start=NULL;
struct node *insert()
{
  struct node *new_node,*z;
  int num;
  char s;
  printf("\nEnter -1 to stop.");
  printf("\nEnter the characters and their priorities: ");
  scanf("\n%c %d",&s,&num);
  while(num!=-1)
  {
    new_node=(struct node *)malloc(sizeof(struct node));
    new_node->data=s;
    new_node->p=num;
    if(start==NULL)
    {
      start=new_node;
      z=start;
      new_node->ptr=NULL;
    }
    else
    {
      z->ptr=new_node;
      new_node->ptr=NULL;
      z=z->ptr;
    }
    scanf("%c %d",&s,&num);
  }
  return start;
}
struct node *display()
{
  struct node *z;
  z=start;
  printf("\nDisplaying elements:\n");
  while(z!=NULL)
  {
    printf("\t%c [Priority=%d]\n",z->data,z->p);
    z=z->ptr;
  }
  return start;
}
struct node *sortit()
{
  struct node *z,*q;
  int t;
  char x;
  z=start;
  while(z->ptr!=NULL)
  {
    q=z->ptr;
    while(q!=NULL)
    {
      if(z->p>q->p)
      {
        t=z->p;
        x=z->data;
        z->p=q->p;
        z->data=q->data;
        q->p=t;
        q->data=x;
      }
      q=q->ptr;
    }
    z=z->ptr;
  }
  return start;
}
struct node *new_insert()
{
  struct node *y,*z;
  int n;
  char s;
  y=(struct node *)malloc(sizeof(struct node));
  printf("\nEnter character and priority for new node:");
  scanf("%c %d",&s,&n);
  printf("%c",s);
  y->data=s;
  y->p=n;
  printf("%c",y->data);
  printf("%d",y->p);
  if(n<start->p)
  {
    y->ptr=start;
    start=y;
    printf("%d",y->p);
  }
  else
  {printf("\nff");
    z=start;
  while(z->ptr->p<=n&&z->ptr!=NULL)
    z=z->ptr;
  y->ptr=z->ptr;
  z->ptr=y;
}
  return start;
}
int main()
{
  insert();
  display();
  sortit();
  display();
  new_insert();
  display();
  return 0;
}

В этом коде C я попытался реализовать приоритетные очереди.

Все отлично работает, кроме функции new_insert().Операторы print после y->p=n; в new_insert() функция print 0.

Следовательно, функция не работает должным образом.Кроме того, в функции display() оператор print печатает [Priority] дважды.

Следовательно, я не могу добавить внешний узел в мою очередь с приоритетами.

1 Ответ

0 голосов
/ 17 октября 2018

Ну, я думаю, что ваш код не слишком далек от работы.

Есть некоторые проблемы, которые можно исправить:

  • использование scanf проблематично *Селектор 1008 *

    • %c должен использоваться с осторожностью, используйте " %c %d" для предотвращения проблем конца строки
    • необходимо проверить возвращаемое значение
  • в функции вставки, z может не инициализироваться (если insert() вызывается, когда start не NULL)

  • Вам не нужно cast malloc возвращаемое значение.

Я проверил следующий код с этим вводом:

a 2
b 3
c 1
d -1
e 0 

И получил такой результат:

Enter -1 to stop.
Enter the characters and their priorities: 
Displaying elements:
    a [Priority=2]
    b [Priority=3]
    c [Priority=1]

Displaying elements:
    c [Priority=1]
    a [Priority=2]
    b [Priority=3]

Enter character and priority for new node:
s: 'e' n: '0'
e00
Displaying elements:
    e [Priority=0]
    c [Priority=1]
    a [Priority=2]
    b [Priority=3]    

Кажется, работает не так ли?Вы можете проверить это онлайн

А вот исправленный код:

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
struct node{
    char data;
    int p;
    struct node *ptr;
};
struct node *start=NULL;

struct node *insert()
{
    /* initialize z in case of start is not null */
    struct node *new_node,*z = start;
    int num, ok;
    char s;
    printf("\nEnter -1 to stop.");
    printf("\nEnter the characters and their priorities: ");

    /* read the scanf return value */
    ok = scanf(" %c %d",&s,&num);
    /* and assert two elements have been read*/
    while(ok == 2 && num!=-1)
    {
        new_node=malloc(sizeof(struct node));
        new_node->data=s;
        new_node->p=num;
        if(start==NULL)
        {
            start=new_node;
            z=start;
            new_node->ptr=NULL;
        }
        else
        {
            z->ptr=new_node;
            new_node->ptr=NULL;
            z=z->ptr;
        }
        ok = scanf(" %c %d",&s,&num);
    }
    return start;
}
struct node *display()
{
    struct node *z;
    z=start;
    printf("\nDisplaying elements:\n");
    while(z!=NULL)
    {
        printf("\t%c [Priority=%d]\n",z->data,z->p);
        z=z->ptr;
    }
    return start;
}
struct node *sortit()
{
    struct node *z,*q;
    int t;
    char x;
    z=start;
    while(z->ptr!=NULL)
    {
        q=z->ptr;
        while(q!=NULL)
        {
            if(z->p>q->p)
            {
                t=z->p;
                x=z->data;
                z->p=q->p;
                z->data=q->data;
                q->p=t;
                q->data=x;
            }
            q=q->ptr;
        }
        z=z->ptr;
    }
    return start;
}
struct node *new_insert()
{
    struct node *y,*z;
    int n, ok;
    char s;

    printf("\nEnter character and priority for new node:");
    ok = scanf(" %c %d",&s,&n);
    if (2 == ok)
    {
        /* alloc y after having check that user gave usage stuff */
        y = malloc(sizeof(struct node));
        y->data=s;
        y->p=n;
        printf("%c",y->data);
        printf("%d",y->p);
        if(n<start->p)
        {
            y->ptr=start;
            start=y;
            printf("%d",y->p);
        }
        else
        {
            printf("\nff");
            z=start;
            while(z->ptr->p<=n&&z->ptr!=NULL)
                z=z->ptr;

            y->ptr=z->ptr;
            z->ptr=y;
        }
    }
    return start;
}
int main()
{
    insert();
    display();
    sortit();
    display();
    new_insert();
    display();
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...