簡體   English   中英

排序鏈表在 C 中無法正常工作

[英]Sorted Linked list not working properly in C

對 C 完全陌生,我試圖在 C 中創建一個鏈表,按字母順序對預先存在的字符數組進行排序。 每個字符都分配了一個索引。 所以listInsert函數應該將每個字符串插入到鏈表中,並按字母順序排序,這樣在調用listPrintForward時,鏈表中的項就會按字母順序打印。

這是我運行程序時的當前輸出。

http://imgur.com/cZxx0rr

INSERT:
bravo oscar romeo delta whisky alpha
foxtro sierra yankee lima echo
golf november victor charlie mike
zulu tango kilo quebec hotel
juliet xray papa uniform india

FORWARD: 0 entries
india uniform papa xray juliet hotel
quebec kilo tango zulu mike
charlie victor november golf echo
lima yankee sierra foxtrot alpha
whisky delta romeo oscar bravo

正如你所看到的,我的 listInsert 函數當前所做的就是將它們插入到一個鏈表中(我認為),當調用 printForward 函數時,它會反轉鏈表的內容,當它應該按字母順序打印鏈表的內容時命令。

我想要發生的輸出應該是:

INSERT:
bravo oscar romeo delta whisky alpha
foxtro sierra yankee lima echo
golf november victor charlie mike
zulu tango kilo quebec hotel
juliet xray papa uniform india

FORWARD: 0 entries
alpha bravo charlie delta echo foxtrot
golf hotel india juliet kilo
lima mike november oscar papa
quebec romeo sierra tango uniform
victor whisky xray yankee zulu 

有誰知道如何解決這個問題或我做錯了什么? 這是完整的代碼:

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

#define SUCCESS 0
#define FAIL    1

char *phonetic[] = { "alpha", "bravo", "charlie", "delta", "echo", "foxtrot",
                     "golf", "hotel", "india", "juliet", "kilo", "lima", "mike",
                     "november", "oscar", "papa", "quebec", "romeo", "sierra",
                     "tango", "uniform", "victor", "whisky", "xray", "yankee", 
                     "zulu" };

unsigned char indexes[] = { 1, 14, 17, 3, 22, 0, 5, 18, 24, 11, 4, 6, 13, 21,
                            2, 12, 25, 19, 10, 16, 7, 9, 23, 15, 20, 8 };                       

// represents an entry in the linked-list
struct listEntry
{
  char *data_p;               // pointer to the entry's string
  struct listEntry *prev_p;   // pointer to previous entry in the linked-list  
  struct listEntry *next_p;   // pointer to next entry in the linked-list
};

// represents the linked-list
struct list
{
  int entryCount;             // number of entries present in the linked-list
  struct listEntry *head_p;   // pointer to the first entry in the list  
  struct listEntry *tail_p;   // pointer to the last entry in the list
};

// Dynamically allocate & initialise an empty linked list
int listCreate(struct list** list_p2)
{
  // allocate struct list from heap 
  *list_p2 = (struct list*) malloc(sizeof(**list_p2));

  if (*list_p2 != NULL)
  {
    // zero-initialize the list structure 
    memset(*list_p2, 0, sizeof(**list_p2));
    return SUCCESS;    
  }

  return FAIL;
}

// Free all entries in the linked-list and the list structure
int listDestroy(struct list *list_p)
{
  if (list_p != NULL)
  {
    struct listEntry *entry_p = list_p->head_p;

    while (entry_p != NULL)
    {
      struct listEntry *next_p = entry_p->next_p;
      // free the current entry
      free(entry_p);
      // move to the next entry
      entry_p = next_p;
    }

    // free list structure
    free(list_p);
  }

  return FAIL;
}

// Traverse the linked-list from head to tail printing out
// the string data from each list entry
int listPrintForward(struct list *list_p)
{ 
  if (list_p)
  {    
    struct listEntry *entry_p = list_p->head_p;
    int count = 0;

    printf("FORWARD: %d entries\n", list_p->entryCount);
    while (entry_p != NULL)
    {
      if ((count > 0) && (count % 5 == 0))
      {
        printf("%s\n", entry_p->data_p);
      }
      else
      {      
        printf("%s ", entry_p->data_p);
      }

      if (entry_p == list_p->tail_p)
        printf("\n");

      entry_p = entry_p->next_p;
      fflush(stdout);
      count++;         
    }

    return SUCCESS;
  }

  return FAIL;
}

// Traverse the linked-list from tail to head printing out
// the string data from each list entry
int listPrintReverse(struct list *list_p)
{ 
  if (list_p)
  {    
    struct listEntry *entry_p = list_p->tail_p;
    int count = 0;

    printf("REVERSE: %d entries\n", list_p->entryCount);   
    while (entry_p != NULL)
    {
      if ((count > 0) && (count % 5 == 0))
      {
        printf("%s\n", entry_p->data_p);
      }
      else
      {      
        printf("%s ", entry_p->data_p);
      }

      if (entry_p == list_p->head_p)
        printf("\n");

      entry_p = entry_p->prev_p;
      fflush(stdout);
      count++;         
    }

    return SUCCESS;
  }

  return FAIL;
}

// Insert the given string into the linked-list such that the
// entries in the linked-list are in alphabetical order
int listInsert(struct list *list_p, char *string_p)
{ 
    struct listEntry *temp;
    temp=(struct listEntry *)malloc(sizeof(struct listEntry)); 
    temp->data_p = string_p;

    if (list_p->head_p == NULL)
    {
        //List is Empty
        list_p->head_p = temp;
        temp->next_p = NULL;
    }
    else
    {
        temp->next_p =list_p->head_p;
        list_p->head_p = temp;
    }


  return FAIL;  
}

int main(int argc, char **argv)
{
  struct list *list_p = NULL;
  (void) argc;
  (void) argv;

  if (listCreate(&list_p) == SUCCESS)
  {
    unsigned int count;

    // insert every word in the phonetic alphabet into the
    // linked-list.
    printf("INSERT:\n");
    for (count = 0; count < sizeof(indexes); count++)
    {
      if ((count > 0) && (count % 5 == 0))
      {
        printf("%s\n", phonetic[indexes[count]]);
      }
      else
      {
        printf("%s ", phonetic[indexes[count]]);
      }
      listInsert(list_p, phonetic[indexes[count]]);
    }
    printf("\n");

    // print out the list in alphabetical order
    listPrintForward(list_p);
    // print out the list in reverse alphabetical order
    listPrintReverse(list_p); 

    // Destroy the linked list and free all associated memory
    listDestroy(list_p);               
  }

  return SUCCESS;
} 

您正在按索引順序插入條目。 您應該在 temp->p_data 上執行 strcmp 並從頭到尾遍歷列表並插入節點。

http://analgorithmaday.blogspot.nl/2011/01/insertion-sort-using-linked-list.html

提示

問候

約翰

暫無
暫無

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

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