Больше связанных списков в 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();
}
Опять же, я не ожидаю ответа на проблему, просто объяснения и толчок в правильном направлении.
Ответы
Ответ 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;
}