簡體   English   中英

打破這個while循環

[英]Break out of this while loop

我也從文本文件中讀取:

George Washington, 2345678
John Adams, 3456789
Thomas Jefferson, 4567890
James Madison, 0987654
James Monroe, 9876543
John Quincy Adams, 8765432
Andrew Jackson, 7654321
Martin Van Buren, 6543210
William Henry Harrison, 5432109
John Tyler, 4321098

刪除名稱的功能有效,但是成功后,printf語句將繼續在命令窗口中循環。 我嘗試在循環的末尾使用break語句,但是這只會導致說找不到該名稱。 有人可以提供任何見解嗎?

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

//Creates node for holding student's information
struct node
{
    char name [50];
    int id;
    struct node *next;
}*head;

//Create Function Prototypes
void readDataFile ();
void insert(char *inName, char *inID);
void display(struct node *d);
int deleteID(int num);
void deleteName(char *delete_name);


//Main function
int main()
{
    //Declare variables
    int i, num, delete_id, id;
    char *name;
    char nameDelete [50];
    char nameInsert [50];
    struct node *n;

    //initialize link list
    head = NULL;

    //Read in file
    readDataFile();

    //Create list of operations utilized in program
    while (1)
    {
        printf("\nList Operations\n");
        printf("===============\n");
        printf("1.Insert\n");
        printf("2.Display\n");
        printf("3.Delete by ID\n");
        printf("4.Delete by Name\n");
        printf("5.Exit\n");
        printf("Enter your choice : ");

        if(scanf("%d", &i) <= 0)
        {
            printf("Enter only an Integer\n");
            exit(0);
        }
        else
        {
            switch(i)
            {
                case 1:
                    getchar();
                    printf("Enter the name to insert:");
                    scanf("%[^\n]s", nameInsert);
                    printf("\nEnter the ID associated with the name: ");
                    scanf("%d", &id);
                    break;
                case 2:
                    if (head == NULL)
                        printf("List is Empty\n");
                    else
                    {
                        printf("Elements in the list are:\n");
                    }
                    display(n);
                    break;
                case 3:
                    if(head == NULL)
                        printf("List is Empty\n");
                    else
                    {
                        printf("Enter the ID number to delete: ");
                        scanf("%d", &delete_id);
                    }

                    if(deleteID(delete_id))
                        printf("%d deleted successfully \n", delete_id);
                    else
                        printf("%d not found in the list\n", delete_id);
                    break;
                case 4:
                    getchar();
                    if(head == NULL)
                        printf("List is Empty\n");
                    else
                    {
                        printf("Enter name to delete: ");
                        scanf("%[^\n]s", nameDelete);
                        printf("Checking for name %s...\n", nameDelete);
                        printf("%s not found in the list\n", nameDelete);
                        deleteName(nameDelete);
                    }
                    break;
                case 5:
                    return 0;
                default:
                    printf("Invalid option\n");
            }
        }
    }
    return 0;
}

//Define the functions
//Function to delete by name
void deleteName(char *delete_name)
{
    //Create temporary and helper node
    struct node *temp, *helper;

    //Set temp equal to head
    temp = head;

    //Loop until the end of the list
    while(temp != NULL)
    {
        if(strcmp(temp->name, delete_name) == 0)
        {
            if(temp == head)
            {
                head = temp->next;
                free(temp);
                printf("Found %s!\n", delete_name);
                printf("%s deleted successfully\n", delete_name);
            }
            else
            {
                helper->next = temp->next;
                free(temp);
                printf("Found %s!\n", delete_name);
                printf("%s deleted successfully\n", delete_name);
            }
        }
        else
        {
            helper = temp;
            temp = temp->next;
        }
    }
break;
}

請學習如何制作MCVE( 如何創建最小,完整和可驗證的示例? )或SSCCE( 簡短,自包含,正確的示例 )—兩個名稱和相同基本思想的鏈接。

這是從您的代碼派生的MCVE。 我添加了丟失的break; return; deleteName()的循環開始。 我基本上完全重寫了main() ,但它工作得很干凈:

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

struct node
{
    char name[50];
    int id;
    struct node *next;
} *head;

void deleteName(char *delete_name);

int main(void)
{
    struct node *n;

    head = NULL;

    head = malloc(sizeof(*head));
    assert(head != 0);
    strcpy(head->name, "Abraham Lincoln");
    head->id = 1;
    head->next = 0;

    n = malloc(sizeof(*n));
    strcpy(n->name, "George Washington");
    n->id = 2;
    n->next = head;
    head = n;

    n = malloc(sizeof(*n));
    strcpy(n->name, "John Adams");
    n->id = 3;
    n->next = head;
    head = n;

    deleteName("George Washington");
    deleteName("John Adams");
    deleteName("Abraham Lincoln");

    return 0;
}

void deleteName(char *delete_name)
{
    struct node *temp, *helper = 0;

    temp = head;

    while (temp != NULL)
    {
        if (strcmp(temp->name, delete_name) == 0)
        {
            if (temp == head)
            {
                head = temp->next;
                free(temp);
                printf("Found %s!\n", delete_name);
                printf("%s deleted successfully\n", delete_name);
            }
            else
            {
                helper->next = temp->next;
                free(temp);
                printf("Found %s!\n", delete_name);
                printf("%s deleted successfully\n", delete_name);
            }
            return;  // The key change!
        }
        else
        {
            helper = temp;
            temp = temp->next;
        }
    }
}

可以在valgrind和Mac OS X 10.10.2(帶有GCC 4.9.1)下正常運行。

Found George Washington!
George Washington deleted successfully
Found John Adams!
John Adams deleted successfully
Found Abraham Lincoln!
Abraham Lincoln deleted successfully

重要的是要學習如何在創建MCVE時殘酷地刪除不相關的代碼。

break關鍵字將脫離最近的開關或循環。 因此,您可以嘗試以下操作:

while(temp != NULL)
{
    if(strcmp(temp->name, delete_name) == 0)
    {
        if(temp == head)
        {
            head = temp->next;
            free(temp);
            printf("Found %s!\n", delete_name);
            printf("%s deleted successfully\n", delete_name);
            break;
        }
        else
        {
            helper->next = temp->next;
            free(temp);
            printf("Found %s!\n", delete_name);
            printf("%s deleted successfully\n", delete_name);
            break;
        }
    }
    else
    {
        helper = temp;
        temp = temp->next;
    }
}

另一種解決方案是在釋放溫度后將temp設置為NULL(無論如何這是一種好習慣,因此可能是另一個想法)

找到要刪除的名稱后,在if塊的末尾添加return語句

void deleteName(char *delete_name)
{
    //Create temporary and helper node
    struct node *temp, *helper;

    //Set temp equal to head
    temp = head;

    //Loop until the end of the list
    while(temp != NULL)
    {
        if(strcmp(temp->name, delete_name) == 0)
        {
            if(temp == head)
            {
                head = temp->next;
                free(temp);
                printf("Found %s!\n", delete_name);
                printf("%s deleted successfully\n", delete_name);
            }
            else
            {
                helper->next = temp->next;
                free(temp);
                printf("Found %s!\n", delete_name);
                printf("%s deleted successfully\n", delete_name);
            }
            return; 
        }
        else
        {
            helper = temp;
            temp = temp->next;
        }
    }
}

另外,您還將計划指示該名稱不是列表的一部分,而不是被查找和刪除。 您可以更改modify函數,以使其在列表中找不到名稱時返回錯誤代碼,然后使用該函數指示該名稱從未出現在列表中。

I did not really look at the delete() function,
however, the following code illustrates how the 
code should be formatted, etc.

notice the checking for input errors, which should always be performed
notice the separation of the struct definition from the struct declaration
notice the easy readability of the switch cases
    by incorporating some vertical white space
notice the simple comments after the closing braces
notice that no call to an action is performed if the linked list is empty



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

//define node for holding student's information
struct node
{
    char name [50];
    int id;
    struct node *next;
};

// create head pointer for linked list of student info
// and initialize
struct node *head = NULL;

// Function Prototypes
// note: if all these functions are only accessed within this file
//       then they should be declared with the 'static' modifier
void readDataFile (void);
void insert (char *inName, char *inID);
void display (struct node *d);
void deleteID (int delete_ID);
void deleteName (char *delete_name);


//Main function
int main()
{
    //Declare local variables
    // notice use of meaningful names
    // notice, for readability and documentation, 
    //         only one variable declared per line
    int i;  // receives user menu selection input
    int idDelete;
    int idInsert;
    char nameDelete [50];
    char nameInsert [50];
    // struct node *n; // unused variable
    int done = 0; // used to exit when user enters '5'



    //Read in file
    readDataFile();

    //Create list of operations utilized in program
    while (!done)
    {
        printf("\nList Operations\n");
        printf("===============\n");
        printf("1.Insert\n");
        printf("2.Display\n");
        printf("3.Delete by ID\n");
        printf("4.Delete by Name\n");
        printf("5.Exit\n");
        printf("Enter your choice : ");

        if( 1 != scanf("%d", &i) )
        { // then, scanf failed
            perror( "scanf for choice failed");
            exit( EXIT_FAILURE );
        }

        // implied else, scanf successful

        switch(i)
        {
            case 1:
                int ch;
                while(EOF != (ch = getchar()) && (ch != '\n'));

                printf("Enter the name to insert:");

                if( 1 != (scanf("%[^\n]s", nameInsert) ) )
                { // then scanf failed
                    perror( "scanf for new student name failed");
                    exit( EXIT_FAILURE );
                }

                // implied else, scanf successful

                printf("\nEnter the ID associated with the name: ");

                if( 1 != (scanf("%d", &idInsert) ) )
                { // then scanf failed
                    perror( "scanf for new student ID failed");
                    exit( EXIT_FAILURE );
                }

                // implied else, scanf successful

                insert( nameInsert, idInsert );
                break;

            case 2:
                if (head == NULL)
                    printf("List is Empty\n");
                else
                {
                    printf("Elements in the list are:\n");
                    display(n);
                } // end if
                break;

            case 3:
                if(head == NULL)
                    printf("List is Empty\n");
                else
                {
                    printf("Enter the ID number to delete: ");

                    if( 1 != (scanf("%d", &idDelete) ) )
                    { // then, scanf failed
                        perror( "scanf for ID to delete failed");
                        exit( EXIT_FAILURE );
                    } 

                    // implied else, scanf successful

                    deleteID(idDelete);
                } // end if
                break;

            case 4:
                int ch;
                while(EOF != (ch = getchar()) && (ch != '\n'));

                if(head == NULL)
                    printf("List is Empty\n");
                else
                {
                    printf("Enter name to delete: ");

                    if( 1 != (scanf("%[^\n]s", nameDelete) ) )
                    { // then, scanf failed
                        perror( "scanf for name to delete failed");
                        exit( EXIT_FAILURE );
                    }

                    // implied else, scanf successful

                    printf("Checking for name %s...\n", nameDelete);

                    deleteName(nameDelete);
                } // end if
                break;

            case 5:
                done = 1; // this will cause while() loop to exit
                break;

            default:
                printf("Invalid option\n");
                break;
        } // end switch
    } // end while
    return 0;
} // end of function: main 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM