Привет Я пытаюсь реализовать общий связанный список. У меня есть что-то работающее с использованием следующего кода, но я не вижу очевидного и аккуратного способа удалить зависимость от глобальных указателей (curr и root) и, таким образом, разрешить определение нескольких связанных списков. Если бы я использовал C++, я бы, вероятно, просто обернул все это в классе, но поскольку я могу видеть только одно решение, которое обрабатывает вручную и передает root и curr в функции, которые в них нуждаются. Я уверен, что есть лучший способ, чем это, так как бы вы это сделали. БлагодаряРеализованная реализация связанных списков
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
struct Node{
int value;
struct Node *next;
};
struct Node * curr = NULL;
struct Node * root = NULL;
struct Node * createList(int val){
struct Node *n = malloc(sizeof(struct Node));
if(n==NULL){
printf("Node creation failed\n");
return NULL;
}
n->value = val;
n->next = NULL;
root=curr=n;
return n;
}
struct Node * extendList(int val, bool end){
if(curr == NULL){
return createList(val);
}
struct Node * newNode = malloc(sizeof(struct Node));
if(newNode==NULL){
printf("Node creation failed\n");
return NULL;
}
newNode->value = val;
newNode->next = NULL;
if(end){
curr->next = newNode;
curr = newNode;
}
else{
newNode->next = root;
root=newNode;
}
return curr;
}
void printList(void){
struct Node *ptr = root;
while(ptr!=NULL){
printf("%d\n",ptr->value);
ptr = ptr->next;
}
return;
}
struct Node * pos_in_list(unsigned int pos, struct Node **prev){
struct Node * ptr = root;
struct Node * tmp = NULL;
unsigned int i = 0;
while(ptr!=NULL){
if(i == pos){
break;
}
tmp = ptr;
ptr=ptr->next;
i++;
}
*prev = tmp;
return ptr;
}
void deletefromlist(int pos){
struct Node * del = NULL;
struct Node * prev = NULL;
del = pos_in_list(pos,&prev);
if(del == NULL)
{
printf("Out of range\n");
}
else
{
if(prev != NULL)
prev->next = del->next;
if(del == curr)
{
curr = prev;
}
else if(del == root)
{
root = del->next;
}
}
free(del);
del = NULL;
}
void deleteList(){
struct Node * del = root;
while(curr!=NULL){
curr = del->next;
free(del);
del=curr;
}
root = NULL;
curr = NULL;
}
int main(void)
{
int i;
for(i=0;i<10;i++){
extendList(i,true);
}
for(i=10;i>0;i--){
extendList(i,false);
}
printList();
deletefromlist(5);
printList();
deleteList();
return 0;
}
Но это все равно будет передано моим функциям, не так ли? – wookie1
Ну, вам нужно создать имя LinkedLists да. Поэтому давайте скажем, что у вас есть LInkedList a и LinkedList b, если вы хотите работать только с a, вам нужно будет передать его по имени переменной. Как еще вы хотите работать с n-числом LInkedLists? Во всем мире? Вы можете сделать это через глобальный массив LinkedLists, но тогда вам нужно будет выяснить, какие списки вы хотите использовать по индексу. – Magn3s1um
Хорошо, просто проверял. Я думал об этом объектно-ориентированным способом, возможно, используя указатели функций в структуре связанных списков. – wookie1