Подтвердить что ты не робот

Больше связанных списков в C

Прежде чем я начну, хочу пояснить, что я не хочу отвечать на мою проблему HOMEWORK, мне просто хотелось бы, чтобы кто-то мог объяснить, что именно мой инструктор просит в этом задании (желательно, тупой вариант ) и, возможно, полезный толчок в правильном направлении. У меня много проблем с этой темой, и всякий раз, когда я спрашиваю инструктора, я нахожу, что он смущает меня больше всего на свете.

Итак, вот назначение:

1. Добавьте новую функцию insertN (struct list * x, int num, int pos, int n), которая будет вставлять n копий целочисленного числа в позиции pos, если это возможно (если pos слишком большой, возьмите соответствующее действие).  Главное, что я смущен здесь, это то, что он подразумевает под позицией pos.

Здесь код, с которым я работаю, - который был написан моим учителем, и я должен его изменить.

#include<stdio.h>
#include<stdlib.h>

struct list {
    int data;
    struct list * next;
        };

struct list *slist;

/*adds a node at the end of the linked list*/
void insert(struct list *x,int num){
  /*if the list is empty*/
  if(x==NULL){
    /*create first node*/
    slist=malloc(sizeof(struct list));
    slist->data=num; 
    slist->next=NULL;
    }
  else{
    /*go to the last node*/
    while(x->next!=NULL) x=x->next;
    /*add node at the end*/
      x->next=malloc(sizeof(struct list));
      x->next->data=num;
      x->next->next=NULL;

  }
}


void display(struct list *x){
  /*traverse the entire linked list*/
  while(x!=NULL){
    printf("%d->",x->data);
    x=x->next;
  }
  printf("NULL");
}

void reverse(struct list *x){
  struct list *prev,*rev,*temp;

  prev=x;
  rev=NULL;

  while(prev!=NULL){
    temp=rev;
    rev=prev;
    prev=prev->next;
    rev->next=temp;
  }
  slist=rev;
}

void search(struct list *x,int a){
struct list *runner;
int found=0;
  for(runner=x;runner!=NULL;runner=runner->next){
  if(runner->data==a){
    printf("data found"); 
    found=1;
break;
  }
  }
if(found==0) printf("data not found");

}

main(){
  int number,a;

  slist=NULL;/*empty linked list*/

  printf("Enter the element for data part:");
  scanf("%d",&number);
  insert(slist,10);
  insert(slist,number);

  insert(slist,20);

  display(slist);
  printf("\n");

  reverse(slist);

  display(slist);
  printf("\nEnter the element for searching:");
  scanf("%d",&a);
  search(slist,a);
  printf("\n");
  getchar();
  getchar();
}

Опять же, я не ожидаю ответа на проблему, просто объяснения и толчок в правильном направлении.

4b9b3361

Ответ 1

Говоря "в позиции 5", он означает, что он хочет, чтобы вы выполнили итерацию ( "пройдете" ) с 5-ступенчатого списка, а затем вставьте туда.

Если у вас есть ссылка на такой список:

struct list * current;

Один шаг может быть выполнен следующим образом:

current = current -> next;

Теперь вам нужно сделать это, пока вы не окажетесь в правильном положении, а затем вставьте туда.

Ответ 2

Итак, скажем, slist имеет в нем 3 элемента:

+---+    +----+    +---+
| 7 | -> | 48 | -> | 9 | -> NULL
+---+    +----+    +---+

Что вы создали, сделав что-то вроде:

slist=NULL;
insert(slist, 7);
insert(slist, 48);
insert(slist, 9);

Ваша задача - реализовать функцию под названием insertN(struct list *x, int num, int pos, int n), которая вставляет один или несколько повторяющихся элементов в список в данной позиции.

Когда я использую эту функцию, я могу сказать:

insertN(slist, 69, 1, 2);

что означает "вставить 2 элемента, содержащие 69, в слайдер в положении 1".
Поэтому после вызова slist должно выглядеть так:

+---+    +----+    +----+    +----+    +---+
| 7 | -> | 69 | -> | 69 | -> | 48 | -> | 9 | -> NULL
+---+    +----+    +----+    +----+    +---+

Ответ 3

Позиция я может быть найдена с помощью указателей я next. Итак, 0 - это начало списка, так как вы добираетесь туда без указателя next. Если список содержит n элементов, то позиция n относится к концу.

Вам нужно будет изменить цикл, следующий за комментарием go to the last node. Вам также придется обрабатывать несколько угловых случаев, 0 - один из них. (Подсказка: он очень похож на случай, когда список пуст.)

Ответ 4

Ребята уже ответ был принят, но что нужно делать, когда pos большой. Как это было бы очень дорого. Я думаю, лучше было бы сохранить два указателя один на начало списка и один в конце.

Но так как это единственный список, мы не можем его перебросить назад. Так ребята, что мы должны сделать для случая, когда pos большой. Это важный аспект проблемы, которую пропустил eveyone.

Ответ 5

что-то вроде этого (вставьте только один node, продолжите его, чтобы вставить n элементов):

 function insertN(struct list *x, int num, int pos, int n){
    int k=0;
    struct list *nd=x,*tmp;
    while(nd){
        if(k==pos){           // position reached ?
            tmp=nd->next;
            nd->next= new_node(num); 
            nd->next->next=tmp;
            return 1;         // succedd node inserted
        }
        nd=nd->next;          //next node
        k++;                 // next position
    }
    // nd == null means pos is too large
    return 0; // failed to insert node at position pos;

}