【问题标题】:Trying to swap nodes data尝试交换节点数据
【发布时间】:2019-08-28 10:15:04
【问题描述】:

我正在尝试按名称排列链表数据,因此我将每个节点名称与下一个节点名称进行比较。是的,希望交换节点数据,以按名称排列链表。

我尝试将节点的每个数据与另一个交换,以防函数“trier”中的测试为真,测试为(strcmp(prec, ptr) < 0)。在最后一个之前,它似乎运作良好。

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

struct patient {
    int cin;
    char nom[8];
    char prenom[8];
    int annee;
    struct patient *suivant;
};

struct patient *tete = NULL;

void creationdePatient() {
    struct patient* ptr;
    char rep;

    ptr = malloc(sizeof(struct patient));
    tete = ptr;
    printf("Saisir Numero de Cin de Nouveau Patient: ");
    scanf("%d", &tete->cin);
    printf("Saisir Nom de Patient: ");
    scanf("%8s", &tete->nom);
    printf("Saisir prenom de Patient: ");
    scanf("%8s", &tete->prenom);
    printf("Saisir annee de naissance de Patient: ");
    scanf("%d", &tete->annee);
    tete->suivant = NULL;
    printf("\nVoulez vous Saisir un autre Patient ?: (O,N): \n");
    scanf(" %c", &rep);

    while (toupper(rep) == 'O') {
        ptr = malloc(sizeof(struct patient));
        printf("Saisir Numero de Cin de Nouveau Patient: ");
        scanf("%d", &ptr->cin);
        printf("Saisir Nom de Patient: ");
        scanf("%8s", &ptr->nom);
        printf("Saisir prenom de Patient: ");
        scanf("%8s", &ptr->prenom);
        printf("Saisir annee de naissance de Patient: ");
        scanf("%d", &ptr->annee);
        ptr->suivant = tete;
        tete = ptr;
        printf("\nVoulez vous Saisir un autre Patient ?: (O,N): \n");
        scanf(" %c", &rep);
    }
}

void echangedeNom(struct patient *x, struct patient *y) {
    char temp[8];
    strcpy(temp, y->nom);
    strcpy(y->nom, x->nom);
    strcpy(x->nom, temp);
}

void echangedePrenom(struct patient *x, struct patient *y) {
    char temp[8];
    strcpy(temp, y->prenom);
    strcpy(y->prenom, x->prenom);
    strcpy(x->prenom, temp);
}

void echangedesentiers(struct patient *x, struct patient *y) {
    int temp = 0;
    temp = y->cin;
    y->cin = x->cin;
    x->cin = temp;
}

void echangedesannes(struct patient *x, struct patient *y) {
    int temp = 0;
    temp = y->annee;
    y->annee = x->annee;
    x->annee = temp;
}

void printtList() {
    struct patient *temp = tete;

    while (temp != NULL) {
        printf("Cin: %d | Nom:%s | Prenom: %s |Anne de naissance: %d\n",
               temp->cin, temp->nom, temp->prenom, temp->annee);
        temp = temp->suivant;
    }
}

void trier() {
    struct patient *ptr = tete;
    struct patient *prec = NULL;
    int echange;
    do {
        echange = 0;

        while (ptr != NULL && ptr->suivant != NULL) {
            prec = ptr;
            ptr = ptr->suivant;
            if (strcmp(prec->nom, ptr->nom) < 0) {
                echangedeNom(prec, ptr);
                echangedePrenom(prec, ptr);
                echangedesentiers(prec, ptr);
                echangedesannes(prec, ptr);
                echange = 1;
            }
        }
    } while (echange == 1);
}

int main() {
    creationdePatient();
    printtList();
    trier();
    printf("=======================\n");
    printtList();
}

交换时某些数据得到错误信息,例如交换后的cin 数字不再相同。

【问题讨论】:

  • 关于:scanf("%8s", &amp;tete-&gt;prenom); 1) 字段:prenom 只有 8 个字节长。输入格式说明符:%s 总是将 NUL 字节附加到输入,因此“%8s”可以允许输入溢出输入缓冲区。建议"%7s" 2) 始终检查返回值(不是参数值)以确保操作成功。注意:返回值是成功输入转换(或 EOF)的计数建议:if ( scanf("%7s", &amp;tete-&gt;prenom) != 1) { // handle error }scanf() 的其他调用也存在类似的考虑
  • 关于:scanf("%8s", &amp;ptr-&gt;nom) 在 C 中,引用数组会降级为数组第一个字节的地址。 char * ptr-&gt;nom[8] 导致编译器输出:: :27:14: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[8]’ [-Wformat=] 建议:删除前导 '&'

标签: c


【解决方案1】:

你在这里交换了两次整数:

while(ptr!=NULL && ptr->suivant!=NULL){
    // [...]
    echangedesentiers(prec,ptr);
    echangedesentiers(prec,ptr);
    // [...]
}

顺便说一句,这是学习调试代码的第一步:How to debug small programs

【讨论】:

  • 我已经编辑了你可以检查下一个问题,谢谢顺便说一句。
  • @AyoubSouid,更好的方法是学习调试您正在编写的程序。另外请查看此页面以了解 StackOverflow 的用途:stackoverflow.com/help/on-topic
猜你喜欢
  • 1970-01-01
  • 2019-12-24
  • 2018-12-21
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多