簡體   English   中英

C-按字母順序排序數組錯誤

[英]C - Alphabetically sorting arrays error

我正在為CECS課分配電話簿,但按字母順序對聯系人進行排序時遇到了問題。 該程序最多允許我對3個聯系人進行排序,但是當我嘗試對3個以上的聯系人進行排序時,該程序會開始吐出垃圾變量,並可能崩潰。

void Sort(phone *phonebook, int *num_entries)
{
 int tracker = *num_entries;
 if (tracker >= 0)
 {
 phone *temp = (phone*) calloc(tracker, sizeof(phone));
 if (temp== NULL)
    printf("\n\nOut of memory\n\n");
 else
 {
 int i, j;
 for (i = 0; i < tracker; i++)
 {
     for (j = i+1; j < tracker; j++)
     {
         //Combines first and last names into 1 name for easy comparison
         strcpy(phonebook[i].totalname, phonebook[i].fName);
         strcpy(phonebook[j].totalname, phonebook[j].fName);
         strcat(phonebook[i].totalname, phonebook[i].lName);
         strcat(phonebook[j].totalname, phonebook[j].lName);
         printf("\nTotal name = %s\nTotal name = %s", phonebook[i].totalname, phonebook[j].totalname); //Done so I can verify it worked correctly
         if (strcmp(phonebook[i].totalname, phonebook[j].totalname) > 0)
         {
            strcpy(temp[i].fName, phonebook[i].fName);
            strcpy(temp[i].lName, phonebook[i].lName);
            temp[i].number = phonebook[i].number;
            temp[i].area = phonebook[i].area;

            strcpy(phonebook[i].fName, phonebook[j].fName);
            strcpy(phonebook[i].lName, phonebook[j].lName);
            phonebook[i].number = phonebook[j].number;
            phonebook[i].area = phonebook[j].area;

            strcpy(phonebook[j].fName, temp[i].fName);
            strcpy(phonebook[j].lName, temp[i].lName);
            phonebook[j].number = temp[i].number;
            phonebook[j].area = temp[i].area;
         }
     }
 }
 printf("\n\nSuccessfully sorted!\n\n");
 }
 }
 else
 printf("\n\nYou need people in the phone book before you can sort it.\n\n");
 }

 -------------------------
 typedef struct PhoneBook
 {
   char fName[20];
   char lName[20];
   char totalname[40];
   float number;
   int area;    
  } phone;

編輯添加結構。 而且我不使用qsort,因為我們在課堂上還沒有學習過,而TA嚴格禁止不使用尚未學習的內容。

void Add(phone *phonebook, int *num_entries)
{    
 int tracker = *num_entries;
 if (tracker == 0)
 {
    printf("\n\nSomething's wrong here\n\n");
 }
 else
 {
      const int newSize = tracker + 1;
      phone *temp = (phone*) realloc(phonebook, (newSize * sizeof(phone)));
      if (temp!=NULL)
      {
         phonebook = temp;
      }
      else
          phonebook = NULL;
 }
 if (phonebook == NULL)
    printf("\n\nOut of memory, can't add more to your phonebook\n\n");
 else
 {
     printf("\n\nEnter the first name: ");
     scanf("%s", phonebook[tracker].fName);
     printf("\nPlease enter the last name: ");
     scanf("%s", phonebook[tracker].lName);
     printf("\nPlease enter the area code: ");
     scanf("%d", &phonebook[tracker].area);
     printf("\nPlease enter the phone number (no dashes allowed): ");
     scanf("%f", &phonebook[tracker].number);
     *num_entries += 1;
     printf("\nContact Added.\n\n");
 }
}

再次進行編輯以顯示將人員添加到電話簿的代碼(也已損壞)。 在3-4個條目之后,它將開始為條目放置垃圾值。

int main()
{
int userInput = 8; //means exit
int num_entries = 1;
phone *phonebook = (phone*) calloc(1 , sizeof(phone));
if (phonebook == NULL)
    printf("\n\nOut of memory\n\n");
else
{
do
{
     system("cls"); 
     printf("Menu: \n");
     printf("1) Add a Contact\n");
     printf("2) Delete a Contact\n");
     printf("3) Display Phone Book\n");
     printf("4) Alphabetically Sort\n");
     printf("5) Find a Contact\n");
     printf("6) Random Contact\n");
     printf("7) Delete All\n");
     printf("8) Exit\n\n");
     scanf(" %d", &userInput);

     switch (userInput)
     {
            case 1: //Add a Friend
                 Add(phonebook, &num_entries);
                 break;
            case 2: //Delete a Friend
                 Delete(phonebook, &num_entries);
                 break;
            case 3: //List all contacts
                 Display(phonebook, &num_entries);
                 break;
            case 4:
                 Sort(phonebook, &num_entries);
                 break;
            case 5:
                 Find(phonebook, &num_entries);
                 break;
            case 6:
                 Random(phonebook, &num_entries);
                 break;
            case 7:
                 DeleteAll(phonebook, &num_entries);
                 break;
            case 8:
                 free(phonebook);
                 break;
     }
     system("PAUSE");  
  }while(userInput != 8);
 }
 return 0;
}

編輯以顯示每個功能的調用

好吧,我不能在沒有更高聲譽的情況下發布照片,所以這里是鏈接:照片1-添加3個聯系人可以正常工作: http : //s980.photobucket.com/user/valondon/media/C%20Realloc%20Errors/Erroronerealloc_zpsc8228131.png。 html?sort = 3&o = 0照片2-添加了第四次聯系后的電話簿: http : //s980.photobucket.com/user/valondon/media/C%20Realloc%20Errors/Errorthreerealloc_zps246b76e3.png.html?sort= 3&o = 2

問題出在您的for循環上。

在您的示例中,在第二個循環中j等於i + 1。 我具有跟蹤器的最大值-1,因此j可以等於跟蹤器。 這將導致您超調陣列,從而浪費內存。

嘗試將它們更改為:

for (i = 0; i < tracker - 1; i++)
{
    for (j = 0; j < tracker - i - 1; j++)

另一個問題是在您的內部循環中,您正在使用[i]和[j]來索引交換。 如果將循環中的每個[i]更改為[j + 1],則將有一個有效的冒泡排序。

您的內循環最終顯示為:

      phone temp; /* I created a stack variable called temp - saves the need for allocation */

      for (i = 0; i < tracker - 1; i++)
{
    for (j = 0; j < tracker - i - 1; j++)
    {
        //Combines first and last names into 1 name for easy comparison
        strcpy(phonebook[j+1].totalname, phonebook[j+1].fName);
        strcpy(phonebook[j].totalname, phonebook[j].fName);
        strcat(phonebook[j+1].totalname, phonebook[j+1].lName);
        strcat(phonebook[j].totalname, phonebook[j].lName);
        printf("\nTotal name = %s\nTotal name = %s", phonebook[j+1].totalname, phonebook[j].totalname); //Done so I can verify it worked correctly
        if (strcmp(phonebook[j+1].totalname, phonebook[j].totalname) > 0)
        {
            strcpy(temp.fName, phonebook[j+1].fName);
            strcpy(temp.lName, phonebook[j+1].lName);
            temp.number = phonebook[j+1].number;
            temp.area = phonebook[j+1].area;

            strcpy(phonebook[j+1].fName, phonebook[j].fName);
            strcpy(phonebook[j+1].lName, phonebook[j].lName);
            phonebook[j+1].number = phonebook[j].number;
            phonebook[j+1].area = phonebook[j].area;

            strcpy(phonebook[j].fName, temp.fName);
            strcpy(phonebook[j].lName, temp.lName);
            phonebook[j].number = temp.number;
            phonebook[j].area = temp.area;
        }
    }
}

問題出在外循環上。

如果您要說要對數組中的'n'個條目進行排序,則必須將數組的第一個條目與其余的'n-1'個條目進行比較。 將第一個條目與所有“ n-1”個條目進行比較之后,這意味着第一個條目正確地位於排序數組中的位置。 現在,您剩下“ n-1”項要排序。 現在,如果要比較數組的第二個條目,則必須將該第二個條目與剩余的“ n-1-1”進行比較(僅剩下“ n-1”個條目進行排序,並且已將第二個條目與其余的條目進行比較)條目)。 這一直持續到最后。

在您的代碼中,您可以像下面那樣更改代碼(循環部分):注意:我已經創建了結構電話temp的temp變量。

    phone temp;
    for (i = 0; i < tracker - 1; i++)
    {
        for (j = i+1; j <= tracker - 1; j++)
        {
             //Combines first and last names into 1 name for easy comparison
             strcpy(phonebook[i].totalname, phonebook[i].fName);
             strcpy(phonebook[j].totalname, phonebook[j].fName);
             strcat(phonebook[i].totalname, phonebook[i].lName);
             strcat(phonebook[j].totalname, phonebook[j].lName);
             printf("\nTotal name = %s\nTotal name = %s", phonebook[i].totalname, phonebook[j].totalname); //Done so I can verify it worked correctly
             if (strcmp(phonebook[i].totalname, phonebook[j].totalname) > 0)
             {
                 strcpy(temp.fName, phonebook[i].fName);
                 strcpy(temp.lName, phonebook[i].lName);
                 temp.number = phonebook[i].number;
                 temp.area = phonebook[i].area;

                 strcpy(phonebook[i].fName, phonebook[j].fName);
                 strcpy(phonebook[i].lName, phonebook[j].lName);
                 phonebook[i].number = phonebook[j].number;
                 phonebook[i].area = phonebook[j].area;

                 strcpy(phonebook[j].fName, temp.fName);
                 strcpy(phonebook[j].lName, temp.lName);
                 phonebook[j].number = temp.number;
                 phonebook[j].area = temp.area;
             }
         }
     }
     printf("\n\nSuccessfully sorted!\n\n");
 }

暫無
暫無

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

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