0
点赞
收藏
分享

微信扫一扫

c语言单链表的增删改查

路西法阁下 2022-04-22 阅读 89
c语言c++

有问题欢迎讨论,单链表的入门练习,插入可以自动排序。

//
// Created by sq on 2022/4/21.
//
//DEV_MIAN_CPP
//list/mian.cpp
#include<iostream>
#include <string.h>
typedef struct Node{
    char name[20];
    int data;
    Node *next;
}Node;
void InsertNod(Node **p, int data, char *name){
    Node *node = (Node *) malloc(sizeof(Node));
    Node *q = *p;
    node->data = data;
    strcpy(node->name, name);
    //添加在链表头
    if((*p)->next == NULL || node->data <= (*p)->next->data){
        node->next = (*p)->next;
        (*p)->next = node;
        return;
    }
    while (q->next != NULL){
        //添加在链表尾
        if(node->data >= q->next->data && q->next->next == NULL){
            q->next->next = node;
            node->next = NULL;
            break;
        }
        //添加在链表体中
        if(node->data >= q->next->data && node->data < q->next->next->data){
            node->next = q->next->next;
            q->next->next = node;
            break;
        }
        q = q->next;
    }
}
void printfNode(Node **p){
    Node *q = *p;
    while(q->next != NULL){
        printf("用户:%s 数据:%d\n", q->next->name, q->next->data);
        q = q->next;
    }
}
void freeNode(Node **p){
    Node *tmp = NULL, *q;
    if(p == NULL){
        return;
    }
    q = (*p)->next;
    while(q != NULL){
        tmp = q;
        q = q->next;
        free(tmp);
    }
}
void deleteNode(Node **p, int n){
    Node *node = NULL;
    if(p == NULL){
        return;
    }
    Node *q = *p;
    while(q->next != NULL){
        if(q->next->data == n){
            node = q->next;
            q->next = q->next->next;
            printf("删除了结点用户:%s 数据:%d\n", node->name, node->data);
            free(node);
            return;
        }
        q = q->next;
    }
    printf("链表中没有结点数据:%d, 删除失败", n);
}
void selectNode(Node **p, int n){
    if(p == NULL){
        return;
    }
    Node *q = *p;
    while(q->next != NULL){
        if(q->next->data == n){
            printf("查询到用户:%s 数据:%d\n", q->next->name, q->next->data);
            break;
        }
        q = q->next;
    }
}
void updateNode(Node **p, int n, int newNum){
    if(p == NULL){
        printf("未修改任何结点。");
        return;
    }
    Node *q = *p;
    while(q->next != NULL){
        if(q->next->data == n){
            q->next->data = newNum;
            printf("修改用户:%s 数据:%d 新数据为:%d\n", q->next->name, n, q->next->data);
            break;
        }
        q = q->next;
    }
}
int main() {
    Node *head = (Node *) malloc(sizeof(Node));
    head->next = NULL;
    //添加结点
    char sq1[20] = "sq1";
    char sq2[20] = "sq2";
    char sq3[20] = "sq3";
    char sq4[20] = "sq4";
    InsertNod(&head, 1, sq1);
    InsertNod(&head, 3, sq3);
    InsertNod(&head, 2, sq2);
    InsertNod(&head, 4, sq4);
    //删除结点
    deleteNode(&head,2);
    //查询结点
    selectNode(&head, 3);
    //修改结点
    updateNode(&head, 4, 44);
    //打印结点
    printfNode(&head);
    //释放内存
    freeNode(&head);
    return 0;
}

怕什么真理无穷,进一寸有进一寸的欢喜 --胡适

举报

相关推荐

0 条评论