我有点咸菜。我有一个链表的变体,其中不仅节点包含一个值,而且每个节点都会有一个标志来声明它是否为有效节点(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;
}