2014-02-08 52 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; 
}