목록을 작성하고 인쇄하고 목록에서 제거하는 프로그램을 작성 중입니다 (3 함수).목록에서 값을 제거하십시오.
인쇄 및 푸시 백은 훌륭하지만 잘 작동하지만 removeFromList() 함수에서 목록에서 제거 할 숫자를 선택하는 방법을 알 수 없습니다.
이름 (클라이언트, 소켓 등)에주의하지 마십시오. 내 클라이언트 - 서버 응용 프로그램이 활성 소켓을 저장하기 때문에 클라이언트가 연결이 끊어지면 목록에서 제거해야합니다. listElement 및 clientList
struct listElement
{
SOCKET socket;
struct listElement* next;
};
struct clientList
{
listElement * head;
};
내 푸시 백 기능 (listElement의 요소 머리에 대한 포인터를 포함합니다) :
int pushBackСlient(struct clientList* list, int socket)
{
struct listElement* newClient = (struct listElement*)malloc(sizeof(struct listElement));
struct listElement* currentElement = list->head;
newClient->socket = socket;
newClient->next = 0;
do
{
// IT'S PUSHBACK
if (list->head == 0)
{
list->head = newClient;
break;
}
while (currentElement->next != 0)
{
currentElement = currentElement->next;
}
currentElement->next = newClient;
} while (false);
return 0;
}
내 인쇄 :
void print(struct clientList* list)
{
struct listElement* currentElement = list->head;
while (currentElement != 0)
{
printf("%d\n", currentElement->socket);
currentElement = currentElement->next;
}
}
을 여기
나는 2 개 구조를 가지고
그리고 문제가 있습니다 (소켓이 추가되었는지 확인하기 위해 디버그 메시지를 만들었습니다. 바르게). 처음 3 줄은 필요 없지만 확실하지는 않습니다. 업데이트 13/05/2017
void removeFromList(struct clientList* list, int socket)
{
struct listElement* currentElement = list->head;
do
{
if (list->head == 0)
{
return;
}
while (currentElement != 0 && currentElement->next != 0)
{
if (currentElement->socket == socket)
{
printf("currentElement == %d\n", currentElement);
currentElement = currentElement->next;
printf("currentElement == %d\n", currentElement);
free(currentElement);
//break; // if I only want to remove the first socket?
}
currentElement = currentElement->next;
}
} while (false);
}
감사합니다. 다음과 같은
목록 구조로void removeFromList(struct clientList* list, int socket)
{
struct listElement* aux, prev;
if(list->head == 0)
return;
aux = list->head;
prev = aux;
while(aux != 0){
if(aux->socket == socket) {
prev->next = aux->next;
free(aux);
break; // if you only want to remove the first socket
}
prev = aux;
aux = aux->next;
}
}
, 내가 구조체의 구조를 사용하는 것이 좋습니다 :
struct list
{
int numberOfElements;
NODE * first;
} LIST;
struct node
{
ELEMENT * info;
NODE * prev; // If you want to have a double connection between the nodes
NODE * next;
} NODE;
struct element
{
int id;
/* Other Properties */
} ELEMENT;
그것은 당신에게를 제공해야합니다 당신의 제거 기능에 대한
가장 중요한 오류는 이것이 C라고 생각하는 것입니다. – Olaf
수업 (학습) 연습입니까? 그냥'std :: list'를 사용하지 않는다면. –
@Olaf 왜 그런 말을하는지 이해하지 못했습니다. 또한 stdio.h, stdlib.h 및 winsock2.h 라이브러리를 사용하고 있습니다. –