我真的需要帮助关于c中的链表问题。
我需要创建一个函数,其中我必须读取列表中的节点,并且对于每个节点,我必须找到出现的节点。如果该值的出现次数等于或大于某个变量值,则必须删除该节点。
的例子:5 8 1→3→→→→6 8→3→8→9
#of occurrences>= 3
所以所有值为8的节点必须被删除。
修改列表:1→3→5→6→3→9
谢谢你。
哦,对不起,我错了。是的,我尝试了一些解决方案,但仍然没有找到一个工作。对于删除所有出现的值,我这样做:
void deleteOccurrences(List *head, int val){
Lista *temp = *testa, *prev;
while(temp != NULL && temp->val == val){
*head = temp->next;
free(temp);
temp = *head;
}
while(temp != NULL){
while (temp != NULL && temp->val != val){
prev = temp;
temp = temp->next;
}
if(temp == NULL)
return;
prev->next = temp->next;
free(temp);
temp = prev->next;
}
}
和count出现次数:
bool countOccurrences(List head, int val, int occur){
int count = 0;
while(head != NULL){
if(head->val == val)
count++;
head = testa->next;
}
if(count >= occur)
return true;
return false;
}
然后我要使用的函数是这样的:
void manageList(List head){
while(head != NULL){
int val = head->val;
if(countOccurences(head, val, 3))
deleteOccurrences(&head, val);
head = head->next;
}
}
这是主要的:
int main(){
List head;
head = NULL;
head = insert(head,9);
head = insert(head,8);
head = insert(head,3);
head = insert(head,8);
head = insert(head,6);
head = insert(head,5);
head = insert(head,8);
head = insert(head,3);
head = insert(head,1);
manageList(head);
return 0;
}
其中insert()
函数只是在列表的开头插入。
节点的定义:
typedef struct El{
int val;
struct El *next;
}ElemList;
typedef ElemList *List;
当我编译和运行这个我得到一个分割错误错误。如果我尝试只运行deleteOccurrences()函数或countooccurrences()函数,它们会按预期工作。问题是在这个函数manageList(),我不明白如何读取列表,并在同一时间找到事件和删除节点。
void manageList(List *head){
ElemList *cur = *head;
while(cur != NULL){
int val = cur->val;
if(countOccurences(cur, val, 3)){
deleteOccurrences(cur, val);
cur = *head;
}else
head = head->next;
}
}