C:即使条件仍然满足,循环也会弹出

C:即使条件仍然满足,循环也会弹出,c,loops,linked-list,C,Loops,Linked List,这是一个用C编写的链接列表的演示 描述:代码是关于操作链接列表,如插入、删除、显示链接列表 // ============================== // Linked List Demo // ============================== // 1. Insert to head // 2. Delete elements by value // 3. Display all elements // 4. Search an element // 5. Delete

这是一个用C编写的链接列表的演示

描述:代码是关于操作链接列表,如插入、删除、显示链接列表

// ==============================
// Linked List Demo
// ==============================
// 1. Insert to head
// 2. Delete elements by value
// 3. Display all elements
// 4. Search an element
// 5. Delete an element by position
// 6. Exit
// ==============================
// Your choice:

#include<stdio.h>
#include<stdlib.h>

struct Node{
    int value;
    struct Node *next;
};
typedef struct Node intLinkedList;

int insertToHead();
void display(intLinkedList *head);
void displayForLoop(intLinkedList *head);
int deleteFromHead(intLinkedList **head);
int delete(int value, intLinkedList **head);
int indexOf(int value, intLinkedList *head);

void menu();
void menu(){
    char* mainMenu[] = {"Insert to head", "Delete", "Display", \
                         "Search Element", "Delete by position", "Exit"};
    printf("=====================================\n");
    for(int i = 0; i < 6; i++)
    {
        printf("%d. %s \n", i + 1,  mainMenu[i]);
    }
    printf("=====================================\n");
}
int main(){
    int choice;
    int value;
    intLinkedList *head;

    do{
        menu();
        printf("#Choice: ");
        scanf("%d", &choice);
        printf("--> %d", choice);
        switch(choice){
            case 1:
                printf("Input new Value to Linked List: ");
                scanf("%d", &value);
                insertToHead(value, &head);
                break;
            case 2:
                printf("Input new Value to delete : ");
                scanf("%d", &value);
                if(delete(value, &head)){
                    printf("%d removed from linked list \n", value);
                }else{
                    printf(" %d not in linked  list \n", value);
                }
                break;
            case 3:
                printf("Display all elements \n");
                display(head);
                break;
            case 4: 
                printf("Input value to search: ");
                scanf("%d", &value);
                int found = indexOf(value, head);
                if( found < 0){
                    printf("%d is isn't in linked list ", value);
                }else{
                    printf("%d is in linked list at %d positino \n", value, found);
                }
                break;
            case 5:
                printf("Delete by position : ");
                break;
            case 6:
                printf("EXIT..");
                return 0;

            default:
                printf(": \n");
                break;
        } 
    }while(choice != 6);  
}

int insertToHead(int value, intLinkedList **head){
    intLinkedList *newElement;
    newElement = (intLinkedList*)malloc(sizeof(intLinkedList));
    newElement -> value = value;
    newElement -> next = *head;
    *head = newElement;
    return 1;
}


void displayForLoop(intLinkedList *head){
    intLinkedList *iterator;
    for(iterator=head; iterator!=NULL; iterator=iterator->next){
        printf("|value: %d| ->", iterator->value);
    }
    printf(" NULL\n");
}

void display(intLinkedList *head){
    intLinkedList *iterator;
    iterator = head;
    while( iterator != NULL){
        printf("|value : %d| -> ", iterator -> value);
        iterator = iterator -> next;
    }
    printf("NULL \n");
}
int deleteFromHead(intLinkedList **head){
    if( *head == NULL){
        return 0;
    }
    intLinkedList *del;
    del = *head;
    *head = del -> next;
    free(del);
    return 1;
}
int delete(int value, intLinkedList **head){
    intLinkedList *current;
    intLinkedList *pre;
    current = *head;
    pre = *head;
    int deleted = 0;

    if(current->value == value){
        printf("get here\n");
        deleteFromHead(head);
        return 1;
    }

    while(current != NULL){
        if(current->value == value){
            deleted = 1;
            if(current==*head){
                deleteFromHead(head);
                current = *head;
                pre = *head;
            }else{
                pre->next = current->next;
                free(current);
                current = pre->next;
            }
            continue;
        }
        pre = current;
        current = current->next;
    }
    return deleted;
}

int indexOf(int value, intLinkedList *head){
    intLinkedList *iterator;
    int i;
    for( iterator = head, i = 0; iterator != NULL; iterator = iterator -> next, i++){
        if(iterator -> value = value){
            return i;
        }
    }
    return -1;
}
问题:

  • 我选择1向节点插入值(例如:1),然后选择值;2,3,4
  • 然后我删除代码退出时的head元素。它应该在循环条件仍然满足时继续运行
  • 如果要显示链接列表,也会出现同样的问题

    // ==============================
    // Linked List Demo
    // ==============================
    // 1. Insert to head
    // 2. Delete elements by value
    // 3. Display all elements
    // 4. Search an element
    // 5. Delete an element by position
    // 6. Exit
    // ==============================
    // Your choice:
    
    #include<stdio.h>
    #include<stdlib.h>
    
    struct Node{
        int value;
        struct Node *next;
    };
    typedef struct Node intLinkedList;
    
    int insertToHead();
    void display(intLinkedList *head);
    void displayForLoop(intLinkedList *head);
    int deleteFromHead(intLinkedList **head);
    int delete(int value, intLinkedList **head);
    int indexOf(int value, intLinkedList *head);
    
    void menu();
    void menu(){
        char* mainMenu[] = {"Insert to head", "Delete", "Display", \
                             "Search Element", "Delete by position", "Exit"};
        printf("=====================================\n");
        for(int i = 0; i < 6; i++)
        {
            printf("%d. %s \n", i + 1,  mainMenu[i]);
        }
        printf("=====================================\n");
    }
    int main(){
        int choice;
        int value;
        intLinkedList *head;
    
        do{
            menu();
            printf("#Choice: ");
            scanf("%d", &choice);
            printf("--> %d", choice);
            switch(choice){
                case 1:
                    printf("Input new Value to Linked List: ");
                    scanf("%d", &value);
                    insertToHead(value, &head);
                    break;
                case 2:
                    printf("Input new Value to delete : ");
                    scanf("%d", &value);
                    if(delete(value, &head)){
                        printf("%d removed from linked list \n", value);
                    }else{
                        printf(" %d not in linked  list \n", value);
                    }
                    break;
                case 3:
                    printf("Display all elements \n");
                    display(head);
                    break;
                case 4: 
                    printf("Input value to search: ");
                    scanf("%d", &value);
                    int found = indexOf(value, head);
                    if( found < 0){
                        printf("%d is isn't in linked list ", value);
                    }else{
                        printf("%d is in linked list at %d positino \n", value, found);
                    }
                    break;
                case 5:
                    printf("Delete by position : ");
                    break;
                case 6:
                    printf("EXIT..");
                    return 0;
    
                default:
                    printf(": \n");
                    break;
            } 
        }while(choice != 6);  
    }
    
    int insertToHead(int value, intLinkedList **head){
        intLinkedList *newElement;
        newElement = (intLinkedList*)malloc(sizeof(intLinkedList));
        newElement -> value = value;
        newElement -> next = *head;
        *head = newElement;
        return 1;
    }
    
    
    void displayForLoop(intLinkedList *head){
        intLinkedList *iterator;
        for(iterator=head; iterator!=NULL; iterator=iterator->next){
            printf("|value: %d| ->", iterator->value);
        }
        printf(" NULL\n");
    }
    
    void display(intLinkedList *head){
        intLinkedList *iterator;
        iterator = head;
        while( iterator != NULL){
            printf("|value : %d| -> ", iterator -> value);
            iterator = iterator -> next;
        }
        printf("NULL \n");
    }
    int deleteFromHead(intLinkedList **head){
        if( *head == NULL){
            return 0;
        }
        intLinkedList *del;
        del = *head;
        *head = del -> next;
        free(del);
        return 1;
    }
    int delete(int value, intLinkedList **head){
        intLinkedList *current;
        intLinkedList *pre;
        current = *head;
        pre = *head;
        int deleted = 0;
    
        if(current->value == value){
            printf("get here\n");
            deleteFromHead(head);
            return 1;
        }
    
        while(current != NULL){
            if(current->value == value){
                deleted = 1;
                if(current==*head){
                    deleteFromHead(head);
                    current = *head;
                    pre = *head;
                }else{
                    pre->next = current->next;
                    free(current);
                    current = pre->next;
                }
                continue;
            }
            pre = current;
            current = current->next;
        }
        return deleted;
    }
    
    int indexOf(int value, intLinkedList *head){
        intLinkedList *iterator;
        int i;
        for( iterator = head, i = 0; iterator != NULL; iterator = iterator -> next, i++){
            if(iterator -> value = value){
                return i;
            }
        }
        return -1;
    }
    
    //==============================
    //链表演示
    // ==============================
    // 1. 插入到头部
    // 2. 按值删除元素
    // 3. 显示所有元素
    // 4. 搜索元素
    // 5. 按位置删除元素
    // 6. 出口
    // ==============================
    //您的选择:
    #包括
    #包括
    结构节点{
    int值;
    结构节点*下一步;
    };
    typedef结构节点intLinkedList;
    int insertToHead();
    无效显示(intLinkedList*头);
    void displayForLoop(intLinkedList*头);
    int deleteFromHead(intLinkedList**head);
    int delete(int值,intLinkedList**head);
    int indexOf(int值,intLinkedList*head);
    无效菜单();
    无效菜单(){
    char*main菜单[]={“插入到头部”、“删除”、“显示”\
    “搜索元素”、“按位置删除”、“退出”};
    printf(“==========================================================\n”);
    对于(int i=0;i<6;i++)
    {
    printf(“%d.%s\n”,i+1,主菜单[i]);
    }
    printf(“==========================================================\n”);
    }
    int main(){
    智力选择;
    int值;
    intLinkedList*头;
    做{
    菜单();
    printf(“#选择:”);
    scanf(“%d”,选择(&C);
    printf(“-->%d”,选项);
    开关(选择){
    案例1:
    printf(“将新值输入到链接列表:”);
    scanf(“%d”,和值);
    插入头(值和头);
    打破
    案例2:
    printf(“输入要删除的新值:”);
    scanf(“%d”,和值);
    如果(删除(值和标题)){
    printf(“%d已从链接列表中删除,\n”,值);
    }否则{
    printf(“%d不在链接列表中\n”,值);
    }
    打破
    案例3:
    printf(“显示所有元素\n”);
    显示器(头部);
    打破
    案例4:
    printf(“要搜索的输入值:”);
    scanf(“%d”,和值);
    int found=indexOf(值,头);
    如果(发现<0){
    printf(“%d不在链表中”,值);
    }否则{
    printf(“%d位于链接列表中的%d位置,\n”,找到值);
    }
    打破
    案例5:
    printf(“按位置删除:”);
    打破
    案例6:
    printf(“退出”);
    返回0;
    违约:
    printf(“:\n”);
    打破
    } 
    }while(选项!=6);
    }
    int insertToHead(int值,intLinkedList**head){
    intLinkedList*新元素;
    newElement=(intLinkedList*)malloc(sizeof(intLinkedList));
    新元素->值=值;
    新元素->下一步=*头部;
    *head=新元素;
    返回1;
    }
    void displayForLoop(intLinkedList*头){
    intLinkedList*迭代器;
    for(迭代器=head;迭代器!=NULL;迭代器=iterator->next){
    printf(“|值:%d |->”,迭代器->值);
    }
    printf(“NULL\n”);
    }
    无效显示(intLinkedList*头){
    intLinkedList*迭代器;
    迭代器=头;
    while(迭代器!=NULL){
    printf(“|值:%d |->”,迭代器->值);
    迭代器=迭代器->下一步;
    }
    printf(“NULL\n”);
    }
    int deleteFromHead(intLinkedList**head){
    如果(*head==NULL){
    返回0;
    }
    intLinkedList*del;
    del=*头;
    *head=del->next;
    免费(del);
    返回1;
    }
    int delete(int值,intLinkedList**head){
    intLinkedList*当前;
    intLinkedList*pre;
    电流=*水头;
    pre=*头;
    int=0;
    如果(当前->值==值){
    printf(“到这里来\n”);
    删除头(头);
    返回1;
    }
    while(当前!=NULL){
    如果(当前->值==值){
    删除=1;
    如果(当前==*头){
    删除头(头);
    电流=*水头;
    pre=*头;
    }否则{
    前->下一步=当前->下一步;
    自由(电流);
    当前=前->下一步;
    }
    继续;
    }
    pre=电流;
    当前=当前->下一步;
    }
    返回已删除;
    }
    int indexOf(int值,intLinkedList*head){
    intLinkedList*迭代器;
    int i;
    for(iterator=head,i=0;iterator!=NULL;iterator=iterator->next,i++){
    如果(迭代器->值=值){
    返回i;
    }
    }
    返回-1;
    }
    
    您通过不初始化
    头来调用未定义的行为。考虑第一次插入元素时,调用<代码> INSERTATOTHOME/<代码>。然后执行
    newElement->next=*head<代码>头
    未初始化,因此
    *头
    是垃圾,您的第一个元素
    ->下一个
    值被“初始化”为某个不确定的值。例如,您的
    displayForLoop
    函数会一直循环,直到
    ->next
    为空。这可能不是唯一的问题,但肯定是一个问题。每当您遍历链接列表,寻找
    ->next==NULL
    作为列表末尾的标记时,这将导致问题。使用
    intLinkedList*head=NULL初始化
    head
    来解决此问题。

    是必需的。首先使用调试器单步检查代码。这是一个“完整的”、“可验证的示例”,你的意思是什么?@VeronykaMunteanu它肯定是完整的、可验证的,但不是min