2014-02-08 65 views
0

我想做一個人名和它的名字的簡單排名列表。該列表按照Id排序,按升序排列。如何在C中輸出正確名稱的排序列表?

我輸入的輸入是:

Enter: Id Name (5 time) 
9 Ace 
5 Bob 
6 Cindy 
7 Dean 
2 Erik 

我希望得到的輸出是

Sorted id is... 
2  Erik 
5  Bob 
6  Cindy 
7  Dean 
9  Ace 

目前的結果我得到的是

Sorted id is... 
2  ABCDErik 
5  BCDErik 
6  CDErik 
7  DErik 
9  Erik 

下面是我的代碼目前正在使用。這是一個冒泡排序功能:

int sorting(int n, int *array) 
{ 
    int temp; 
    for (int i = 0; i < n; i++) 
    { 
     for (int j = 0; j < (n - i - 1); j++) 
     { 
      if (array[j] > array[j + 1]) 
      { 
       temp = array[j]; 
       array[j] = array[j + 1]; 
       array[j + 1] = temp; 
      } 
     } 
    } 
} 

而我的主要程序:

int main() 
{ 
    int i, j, temp; 
    int num = 5; 
    int *id = (int *) malloc(sizeof(int) * 5); 
    char *name = malloc(sizeof(char) * 10); 

    printf("Enter: Id Name (5 time) \n"); 
    for (i = 0; i < num; i++) 
    { 
     scanf("%d %s", &id[i], &name[i]); 
    } 

    sorting(num, id); 

    printf("Sorted id is...\n"); 

    for (i = 0; i < num; i++) 
    { 
     printf("%d \t %s \n", id[i], &name[i]); 
    } 

    free(id); 
    free(name); 
    return 0; 
} 

有沒有一種方法,使「鏈接」,其ID正確的名稱?

回答

0

您從不爲多個名稱分配內存。

char *name = malloc(sizeof(char) * 10); 

這分配了十個字符,有足夠的空間給一個短名稱,就是這樣。

1

您的數據存儲方式錯誤。當您分配內存時,意圖在內部存儲字符串,您必須根據字符串長度正確計算內存大小。

還有一個char *是指向一個字符串的指針,字符串數組應該成爲char * []

#define STRINGCOUNT 20 
#define STRINGLEN 100 

int maxlen= ... calculated somehow 
int stringcnt= ... calculated somehow 

char *stringarray[STRINGCOUNT]; 
for (i=0; i<STRINGCOUNT; i++) 
    stringarray[i] = malloc(maxlen); 

另一種方法是靜態分配的數據:

char stringarray[STRINGCOUNT][STRINGLEN] 

第三種方法是動態地分配的一切。請注意,使用字符串指針和動態分配的數組,每個字符串可以分配不同的長度。

char **stringarray=calloc(stringcnt,sizeof(char *)); 
for (i=0; i<stringcnt; i++) 
    stringarray[i] = malloc(maxlen); 
// or 
    stringarray[i] = strdup(somestring); 

而且你必須記住,是C字符串teminated 0字符,因此用於存儲鮑勃,你將需要至少4個字節。

你現在做的是分配10個字節的緩衝區,並把它們放在那裏從不同位置開始的所有字符串。

關於鏈接數據,C語言中的概念被稱爲struct。在你的情況下的定義將是

struct { 
    int rank; 
    char *name; 
} items; 

的Structs也可以靜態或動態分配的,但你要知道,這個名字元素是指向字符串的指針,如果沒有明確的初始化它不會指向分配的內存和不能使用。

+0

是stringcount和MAXLEN是固定的數字還是他們varried? –

+0

malloc你可以使用可變緩衝區大小 其他兩個應該是固定大小,雖然gcc允許在堆棧上動態分配數組,就像你在代碼中做的那樣。 – bbonev

+0

奇怪的是,名字現在正確顯示,但他們沒有排序。 –

1

連接兩個數組是索引。 所以要通過索引和比較序列來進行排序。

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

void sorting(int n, int *array, int *indexs){ 
    int temp; 
    for (int i = 0; i < n -1 ; ++i){ 
     for (int j = i + 1; j < n; ++j){ 
      if (array[indexs[i]] > array[indexs[j]]){ 
       temp = indexs[i]; 
       indexs[i] = indexs[j]; 
       indexs[j] = temp; 
      } 
     } 
    } 
} 

int main(){ 
    int i, j, temp; 
    int num = 5; 
    int *id = (int *) malloc(num * sizeof(int)); 
    int *indexs = malloc(num * sizeof(int)); 
    char **name = malloc(num * sizeof(char*)); 
    for(i = 0 ; i < num ; ++i){ 
     name[i] = malloc(sizeof(char) * 10); 
     indexs[i] = i; 
    } 

    printf("Enter: Id Name (5 time) \n"); 
    for (i = 0; i < num; i++) 
     scanf("%d %9s", &id[i], name[i]); 

    sorting(num, id, indexs); 

    printf("Sorted id is...\n"); 

    for (i = 0; i < num; i++){ 
     printf("%d \t %s \n", id[indexs[i]], name[indexs[i]]); 
     free(name[indexs[i]]); 
    } 
    free(id); 
    free(name); 
    return 0; 
} 
1

的簡單的方法來鏈的名稱與它們的id是使用一種結構和分配該結構的陣列。你可以這樣修改你的程序:

typedef struct name_id_pair { 
    int id; 
    char name[10]; 
} name_id_pair_t; 



int sorting(int n, name_id_pair_t *array) 
{ 
int i, j; 
name_id_pair_t temp; 
for (i = 0; i < n; i++) 
{ 
    for (j = 0; j < (n - i - 1); j++) 
    { 
     if (array[j].id > array[j + 1].id) 
     { 
      temp = array[j]; 
      array[j] = array[j + 1]; 
      array[j + 1] = temp; 
     } 
    } 
} 
} 

int main() 
{ 
int i, j; 
int num = 5; 
name_id_pair_t *arr = (name_id_pair_t *) malloc(sizeof(name_id_pair_t) * 5); 

printf("Enter: Id Name (5 time) \n"); 
for (i = 0; i < num; i++) 
{ 
    scanf("%d %s", &arr[i].id, &arr[i].name); 
} 

sorting(num, arr); 

printf("Sorted id is...\n"); 

for (i = 0; i < num; i++) 
{ 
    printf("%d \t %s \n", arr[i].id, arr[i].name); 
} 

free(arr); 

return 0; 
}