アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

struct list {
int key;/* キー */
char name[20];/* 名前 */
struct list *next;/* 次のデータへのポインタ */
};

struct list *add_list(int key, char *name, struct list *head);
void show_list(struct list *p);
void free_list(struct list *p);

int main(void)
{
struct list *head;/* 先頭ポインタ */
char name[20];
int key = 0;

head = NULL;/* 先頭ポインタにNULLを設定 */

printf("キーと名前(MAX:19文字)を入力(終了:CTRL+Z)\n");
while (scanf("%d %s", &key, name) != EOF) {
/* リストにデータを登録 */
head = add_list(key, name, head);
}

/* リストの表示 */
show_list(head);

/* リストの開放 */
free_list(head);

return 0;
}

/*** リストにデータを登録 ***/
struct list *add_list(int key, char *name, struct list *head)
{
struct list *p;

/* 記憶領域の確保 */
if ((p = (struct list *) malloc(sizeof(struct list))) == NULL) {
printf("malloc error\n");
exit(EXIT_FAILURE);
}

/* リストにデータを登録 */
p->key = key;
strcpy(p->name, name);

/* ポインタのつなぎ換え */
p->next = head;/* 今までの先頭ポインタを次ポインタに */
head = p;/* 新たな領域を先頭ポインタに */

return head;
}

/*** リストの表示 ***/
void show_list(struct list *p)
{
while (p != NULL) {/* 次ポインタがNULLまで処理 */
printf("%3d %s\n", p->key, p->name);
p = p->next;
}
}

/*** リストの開放 ***/
void free_list(struct list *p)
{
struct list *p2;

while (p != NULL) { /* 次ポインタがNULLまで処理 */
p2 = p->next;
free(p);
p = p2;
}
}


これを実行すると、
新しく入力された順にリストが表示されます。
そうではなく、キーの昇順に表示したいです。
どなたかそのように実行できるようにプログラムを書き換えてくれませんか?
図々しいですがよろしくお願いいたします。m(_ _)m

A 回答 (2件)

修正します


memcmpの不等号は逆です
あと最初の判定ででるとp3が不定になりますのでnullをいれて判定してheadにつないでください
    • good
    • 0

add_listのポインタのつなぎかえで



for(p2=head; (memcmp(p, p2, p->key)<0)&&(p2!=NULL); p2=p2->next){
p3=p2;
}
p3->next=p;
p->next=p2;

でよいかと思います。p2とp3は宣言してください
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!