Я немного рассол.У меня есть вариант связанного списка, где не только узлы содержат значение, но также у каждого узла будет флаг, указывающий, является ли он действительным узлом или нет (1 действителен; 0 недействителен).У меня есть некоторые функции, с которыми я сталкиваюсь с трудностями.У меня есть deleteLast, который удаляет последний действительный узел, или, другими словами, очищает допустимый флаг в 0. Имейте в виду, что последний действительный узел может быть не последним узлом;Я надеялся, что тут будут полезны countNodes.deleteValue 'удаляет' первый действительный узел с указанным значением.restoreValue восстанавливает первый «удаленный» узел с указанным значением.наконец, compact создает новый список допустимых узлов только в обратном порядке старого списка.deleteLast - это функция, с которой у меня больше всего проблем.Любая обратная связь по этой функции или любой другой функции будет очень полезна.Вот некоторый код:
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
struct Node{
struct Node *link;
int value;
int valid;
}
int countNodes (Node *ptrToFirst){
int count=0;
if(ptrToFirst==NULL){
return 0;
}
else{
while(ptrToFirst!=NULL){
if(ptrToFirst->valid==1)
count++;
ptrToFirst=ptrToFirst->link;
}
}
int deleteLast(Node *ptrToFirst){
Node p;
if(countNodes||ptrToFirst!=NULL){
while(ptrToFirst!=NULL){
ptrToFirst->link;
if(ptrToFirst->valid==1)
if(ptrToFirst->link==NULL){
}
}
}
else return 0;
}
int deleteValue(Node *ptrToFirst, int val){
if(ptrToFirst==NULL){
return 0;
}
while(ptrToFirst!=NULL){
if(ptrToFirst->value==val&&ptrToFirst->valid==1){
ptrToFirst->valid=0;
return 0;
}
else
ptrToFirst=ptrToFirst->link;
}
}
int restoreValue(Node *start, int val){
if(start==NULL){
return 0;
}
while(start!=NULL){
if(start->value==val&&start->valid==0)
start->valid=1;
return 1;
else
start=start->link;
}
}
int compact(Node *old, **ptrToNewHeadPtr){
Node temp;
if(old!=NULL){
while(old!=NULL){
if(old->valid==1)
temp=old;
*ptrToNewHeadPtr=temp;
old=old->link;
}
return 1;
}
else return 0;
}