C语言,设备信息管理录入里将链表排序?

如何在程序里将链表根据编号排序后再录入文档?求解答

void addEquipment(Equipment *head){
    Equipment *tail = head;
    int k,len;
    printf("键入需要录入设备的个数:");
    scanf("%d",&len);
    printf("\n");
    for ( k = 0; k< len; k++)
    {
    while(tail->next!=NULL) tail = tail->next;
    Equipment *newnode = (Equipment*)malloc(sizeof(Equipment));
    printf("请输入设备编号:");
    scanf("%d",&newnode->num);
    if(checkNum(head,newnode->num)){
        printf("输入编号已有,输入失败!");
        return;
    }
    printf("请输入设备名称:");
    scanf("%s",&newnode->name);
    printf("请输入设备型号:");
    scanf("%s",&newnode->model);
    printf("请输入生产厂家:");
    scanf("%s",&newnode->factory);
    printf("请输入设备购买日期:");
    scanf("%s",&newnode->buy_date);
    printf("请输入保质期:");
    scanf("%s",&newnode->baozhqi);
    printf("请输入责任人:");
    scanf("%s",&newnode->zrr);
    printf("请输入价格:");
    scanf("%s",&newnode->price); 
    tail->next = newnode;
    newnode->next = NULL;
}
    fprintE(head);
    printf("录入成功!");
    printf("\n");
}


要将链表根据编号排序后再录入文档,可以按照以下步骤进行:

  1. 首先,在链表节点中添加一个指向下一个节点的指针next。
  2. 在录入设备信息之前,先判断链表是否为空。如果链表为空,则直接将新节点作为头节点。
  3. 如果链表不为空,则需要找到合适的位置插入新节点。可以通过遍历链表找到合适的位置,保证链表是按照编号递增的顺序排列。
  4. 在插入新节点之前,需要判断新节点的编号是否已经存在于链表中。可以编写一个辅助函数checkNum来检查编号是否重复。
  5. 如果新节点的编号已经存在于链表中,则录入失败,返回上一层。
  6. 如果新节点的编号不存在于链表中,则可以继续录入设备信息。
  7. 将新节点插入到链表中的合适位置。
  8. 最后,将排序后的链表内容写入文档中。可以编写一个辅助函数fprintE来实现将链表内容写入文档的功能。

下面是修改后的addEquipment函数的代码示例:

void addEquipment(Equipment *head) {
    Equipment *tail = head;
    int k, len;
    printf("键入需要录入设备的个数:");
    scanf("%d", &len);
    printf("\n");
    
    for (k = 0; k < len; k++) {
        while (tail->next != NULL) tail = tail->next;
        Equipment *newnode = (Equipment*)malloc(sizeof(Equipment));
        printf("请输入设备编号:");
        scanf("%d", &newnode->num);
        
        if (checkNum(head, newnode->num)) {
            printf("输入编号已有,输入失败!");
            return;
        }
        
        printf("请输入设备名称:");
        scanf("%s", &newnode->name);
        printf("请输入设备型号:");
        scanf("%s", &newnode->model);
        printf("请输入生产厂家:");
        scanf("%s", &newnode->factory);
        printf("请输入设备购买日期:");
        scanf("%s", &newnode->buy_date);
        printf("请输入保质期:");
        scanf("%s", &newnode->baozhqi);
        printf("请输入责任人:");
        scanf("%s", &newnode->zrr);
        printf("请输入价格:");
        scanf("%s", &newnode->price); 
        
        // 将新节点插入到链表中的合适位置
        insertNode(head, newnode);
    }
    
    fprintE(head);
    printf("录入成功!\n");
}

其中,insertNode函数用于将新节点插入到链表中的合适位置。具体实现可以参考以下示例代码:

void insertNode(Equipment *head, Equipment *newnode) {
    Equipment *cur = head;
    while (cur->next != NULL && cur->next->num < newnode->num) {
        cur = cur->next;
    }
    newnode->next = cur->next;
    cur->next = newnode;
}


在这个示例中,假设链表中的节点按照编号递增的顺序排列。如果新节点的编号小于当前节点的编号,就将新节点插入到当前节点的前面;否则,继续遍历链表,直到找到合适的位置插入新节点。

另外,你还需要编写一个fprintE函数来将链表内容写入文档中。具体的实现方式取决于你使用的文件操作函数和文件格式。这里给出一个简单的示例代码:

void fprintE(Equipment *head) {
    FILE *file = fopen("equipment.txt", "w");
    Equipment *cur = head->next;
    
    while (cur != NULL) {
        fprintf(file, "%d %s %s %s %s %s %s %s\n", cur->num, cur->name, cur->model, cur->factory, cur->buy_date, cur->baozhqi, cur->zrr, cur->price);
        cur = cur->next;
    }
    
    fclose(file);
}

在这个示例中,假设你要将链表内容写入名为"equipment.txt"的文档中。通过打开文件并使用fprintf函数将每个节点的信息写入文件中,最后关闭文件。

希望以上解答能够帮助到你!如果有任何问题,请随时提问。

void addEquipment(Equipment *head){
    Equipment *tail = head;
    int k,len;
    printf("键入需要录入设备的个数:");
    scanf("%d",&len);
    printf("\n");
    for ( k = 0; k< len; k++)
    {
        Equipment *newnode = (Equipment*)malloc(sizeof(Equipment));
        printf("请输入设备编号:");
        scanf("%d",&newnode->num);
        if(checkNum(head,newnode->num)){
            printf("输入编号已有,输入失败!");
            return;
        }
        printf("请输入设备名称:");
        scanf("%s",&newnode->name);
        printf("请输入设备型号:");
        scanf("%s",&newnode->model);
        printf("请输入生产厂家:");
        scanf("%s",&newnode->factory);
        printf("请输入设备购买日期:");
        scanf("%s",&newnode->buy_date);
        printf("请输入保质期:");
        scanf("%s",&newnode->baozhqi);
        printf("请输入责任人:");
        scanf("%s",&newnode->zrr);
        printf("请输入价格:");
        scanf("%s",&newnode->price); 
        
        // 将新设备插入到已有设备中合适的位置
        Equipment *p = head;
        while(p->next != NULL && p->next->num < newnode->num){
            p = p->next;
        }
        newnode->next = p->next;
        p->next = newnode;
    }
    fprintE(head);
    printf("录入成功!");
    printf("\n");
} 

冒泡排序
可参考

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

// 定义设备信息结构体
typedef struct DeviceInfo {
    int id;
    char name[50];
    struct DeviceInfo* next;
} DeviceInfo;

// 创建新的设备信息节点
DeviceInfo* createDeviceInfo(int id, const char* name) {
    DeviceInfo* device = (DeviceInfo*)malloc(sizeof(DeviceInfo));
    device->id = id;
    strcpy(device->name, name);
    device->next = NULL;
    return device;
}

// 插入设备信息节点到链表
void insertDeviceInfo(DeviceInfo** head, DeviceInfo* device) {
    if (*head == NULL) {
        *head = device;
    } else {
        DeviceInfo* current = *head;
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = device;
    }
}

// 打印链表中的设备信息
void printDeviceInfo(DeviceInfo* head) {
    DeviceInfo* current = head;
    while (current != NULL) {
        printf("ID: %d, Name: %s\n", current->id, current->name);
        current = current->next;
    }
}

// 交换两个设备信息节点的位置
void swap(DeviceInfo* a, DeviceInfo* b) {
    int tempId = a->id;
    char tempName[50];
    strcpy(tempName, a->name);

    a->id = b->id;
    strcpy(a->name, b->name);

    b->id = tempId;
    strcpy(b->name, tempName);
}

// 使用冒泡排序对链表进行排序
void sortDeviceInfo(DeviceInfo* head) {
    int swapped;
    DeviceInfo* current;
    DeviceInfo* last = NULL;

    // 如果链表为空或只有一个节点,则无需排序
    if (head == NULL || head->next == NULL) {
        return;
    }

    do {
        swapped = 0;
        current = head;
        while (current->next != last) {
            if (current->id > current->next->id) {
                swap(current, current->next);
                swapped = 1;
            }
            current = current->next;
        }
        last = current;
    } while (swapped);
}

int main() {
    DeviceInfo* head = NULL;

    // 创建设备信息节点并插入链表
    insertDeviceInfo(&head, createDeviceInfo(3, "Device C"));
    insertDeviceInfo(&head, createDeviceInfo(1, "Device A"));
    insertDeviceInfo(&head, createDeviceInfo(2, "Device B"));

    printf("排序前:\n");
    printDeviceInfo(head);

    // 对链表进行排序
    sortDeviceInfo(head);

    printf("\n排序后:\n");
    printDeviceInfo(head);

    return 0;
}

基于new bing部分指引作答:
要对链表进行排序,可以使用常见的排序算法,如冒泡排序、插入排序或选择排序。以下是一个使用冒泡排序的示例代码,可以在录入设备之前对链表按编号进行排序:

void sortLinkedList(Equipment *head) {
    int swapped;
    Equipment *ptr1;
    Equipment *lptr = NULL;

    // 如果链表为空或只有一个节点,则无需排序
    if (head == NULL)
        return;

    do {
        swapped = 0;
        ptr1 = head;

        while (ptr1->next != lptr) {
            if (ptr1->num > ptr1->next->num) {
                swapNodes(ptr1, ptr1->next);
                swapped = 1;
            }
            ptr1 = ptr1->next;
        }
        lptr = ptr1;
    } while (swapped);
}

void swapNodes(Equipment *node1, Equipment *node2) {
    int tempNum = node1->num;
    char tempName[MAX_NAME_LENGTH]; // MAX_NAME_LENGTH为设备名称的最大长度
    // 依次交换节点中的各个字段
    strcpy(tempName, node1->name);
    strcpy(node1->name, node2->name);
    strcpy(node2->name, tempName);

    // 继续交换其他字段...
    // 例如:交换设备型号、生产厂家等等
    // 注意:如果字段为字符串类型,请使用strcpy进行交换

    node1->num = node2->num;
    node2->num = tempNum;
}

void addEquipment(Equipment *head) {
    // 首先对链表进行排序
    sortLinkedList(head);

    Equipment *tail = head;
    int k, len;
    printf("键入需要录入设备的个数:");
    scanf("%d", &len);
    printf("\n");

    for (k = 0; k < len; k++) {
        while (tail->next != NULL)
            tail = tail->next;

        Equipment *newnode = (Equipment *)malloc(sizeof(Equipment));
        printf("请输入设备编号:");
        scanf("%d", &newnode->num);

        if (checkNum(head, newnode->num)) {
            printf("输入编号已有,输入失败!");
            return;
        }

        // 依次录入其他字段...

        tail->next = newnode;
        newnode->next = NULL;
    }

    fprintE(head);
    printf("录入成功!\n");
}

这里使用了冒泡排序算法来根据设备编号进行排序。sortLinkedList函数对链表进行排序,swapNodes函数用于交换节点的各个字段。在addEquipment函数中,首先调用sortLinkedList函数对链表进行排序,然后继续录入设备信息。

提供参考代码示例,代码构思使用冒泡排序、快速排序、归并排序等算法来实现对链表进行排序,在排序后,使用fprintE函数将链表中的数据录入到文档中。

void addEquipment(Equipment *head){  
    Equipment *tail = head;  
    int k,len;  
    printf("键入需要录入设备的个数:");  
    scanf("%d",&len);  
    printf("\n");  
    for ( k = 0; k< len; k++)  
    {  
        while(tail->next!=NULL) tail = tail->next;  
        Equipment *newnode = (Equipment*)malloc(sizeof(Equipment));  
        printf("请输入设备编号:");  
        scanf("%d",&newnode->num);  
        if(checkNum(head,newnode->num)){  
            printf("输入编号已有,输入失败!");  
            return;  
        }  
        printf("请输入设备名称:");  
        scanf("%s",&newnode->name);  
        printf("请输入设备型号:");  
        scanf("%s",&newnode->model);  
        printf("请输入生产厂家:");  
        scanf("%s",&newnode->factory);  
        printf("请输入设备购买日期:");  
        scanf("%s",&newnode->buy_date);  
        printf("请输入保质期:");  
        scanf("%s",&newnode->baozhqi);  
        printf("请输入责任人:");  
        scanf("%s",&newnode->zrr);  
        printf("请输入价格:");  
        scanf("%s",&newnode->price);   
        tail->next = newnode;  
        newnode->next = NULL;  
    }  
  
    // 对链表进行快速排序  
    sortList(head);  
  
    fprintE(head);  
    printf("录入成功!");  
    printf("\n");  
}  
  
// 快速排序算法实现  
void sortList(Equipment *head) {  
    if (head == NULL || head->next == NULL) {  
        return;  
    }  
    Equipment *p = head;  
    Equipment *q = NULL;  
    while (p->next != q) {  
        while (p->next != q) {  
            q = p->next;  
            if (p->num > q->num) {  
                int temp = p->num;  
                p->num = q->num;  
                q->num = temp;  
            }  
        }  
        q = p;  
        p = p->next;  
    }  
}

#如有帮助,恭请采纳

要将链表根据编号排序,可以先将链表中的所有节点按照编号升序排列,然后再将排好序的链表写入文件。
在录入设备信息之前,先定义一个sortEquipment函数,它可以将链表中的所有节点按照编号升序排序。具体而言,该函数使用插入排序的思想,从链表头开始,每次将下一个节点插入到已排序好的链表中,使得链表仍然保持升序排列。当链表中只剩下一个或两个节点时,排序结束。排序完成后,再调用fprintE函数将排好序的链表写入文件。
在addEquipment函数中,在录入完所有设备信息之后,调用sortEquipment函数将链表排好序,再调用fprintE函数将排好序的链表写入文件。这样,就可以实现将链表根据编号排序后再录入文档的功能。


// 将链表根据编号升序排序
void sortEquipment(Equipment *head) {
    Equipment *p, *q, *tail = NULL;
    int count = 1, i;
    while (1) {
        p = head->next;
        head->next = NULL;
        tail = head;
        count = 1;
        while (p != NULL) {
            q = p->next;
            for (i = 1; i < count && q != NULL; i++) {
                q = q->next;
            }
            if (q != NULL && p->num > q->num) {
                p->next = q->next;
                q->next = p;
            } else {
                p->next = tail->next;
                tail->next = p;
                tail = p;
            }
            p = q;
            count++;
        }
        if (count <= 2) {
            break;
        }
    }
}

// 将链表写入文件
void fprintE(Equipment *head) {
    FILE *fp;
    fp = fopen("equipment.txt","w");
    Equipment *p = head->next;
    while (p != NULL) {
        fprintf(fp, "%d %s %s %s %s %s %s %s\n", p->num, p->name, p->model, p->factory, p->buy_date, p->baozhqi, p->zrr, p->price);
        p = p->next;
    }
    fclose(fp);
}

void addEquipment(Equipment *head){
    Equipment *tail = head;
    int k,len;
    printf("键入需要录入设备的个数:");
    scanf("%d",&len);
    printf("\n");
    for (k = 0; k < len; k++) {
        while (tail->next != NULL) {
            tail = tail->next;
        }
        Equipment *newnode = (Equipment*)malloc(sizeof(Equipment));
        printf("请输入设备编号:");
        scanf("%d",&newnode->num);
        if (checkNum(head,newnode->num)) {
            printf("输入编号已有,输入失败!");
            return;
        }
        printf("请输入设备名称:");
        scanf("%s",&newnode->name);
        printf("请输入设备型号:");
        scanf("%s",&newnode->model);
        printf("请输入生产厂家:");
        scanf("%s",&newnode->factory);
        printf("请输入设备购买日期:");
        scanf("%s",&newnode->buy_date);
        printf("请输入保质期:");
        scanf("%s",&newnode->baozhqi);
        printf("请输入责任人:");
        scanf("%s",&newnode->zrr);
        printf("请输入价格:");
        scanf("%s",&newnode->price);
        tail->next = newnode;
        newnode->next = NULL;
    }
    sortEquipment(head); // 排序
    fprintE(head); // 写入文件
    printf("录入成功!");
    printf("\n");
}