某小卡拉米第一次尝试:C语言链表

第一次写博客哎

感觉非常的激动

然后

就没有然后了

哎,貌似解决了链表基础的操作

终究

又要踏上数据结构的征程了~

过来人给我端几碗上等的鸡汤给我灌灌吧

心累

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

typedef struct Note {
    int number;
    struct Note* next;
}note;

void scanfList(note** head) {//二级指针接受表头的地址
    int value;
    do {
        scanf("%d", &value);
        if (value) {
            note* p = (note*)malloc(sizeof(note));//为新节点创建空间
            p->number = value;//向新节点的空间赋值
            p->next = NULL;//尾指针置空
            note* last = *head;//创建一个新的指针的指向表头
            if (last) {//如果表头不是空的时候执行下面都的操作
                while (last->next) {//下一个节点直到遇到尾指针
                    last = last->next;
                }last->next = p;//把创建的新的节点的指针置空变为尾指针
            }
            else 
                *head = p;//如果表头为空的话将地址赋值给头指针以此给表头分配空间
        }
    } while (value);

}


void Delete(note** head, int notedate) {
    note* p = *head, * pr = *head;
    if (head) {//如果表头不为空

        while (p->number != notedate && p->next) {//未找到目标节点的值事且目标节点不是尾节点
            pr = p;//保留当前节点的地址
            p = p->next;//指向下个节点
        }
        if (notedate == p->number) {//找到目标节点
            if (p == *head) //如果目标节点是头节点的话就直接将头节点指向下一个节点
                *head = p->next;
            else //如果不是头节点则将奇拿一个节点的地址指向当前节点的下一个节点即下一个节点
                pr->next = p->next;//如果是尾节点的话就将上一个节点的next 指向NULL成为尾节点
            free(p);//如论怎样都要释放目标节点的空间
        }
        else 
            printf("未找到目标结点!\n");
    }
    else
    {
        printf("链表为空,退出程序!\n");
        exit(0);
    }
}

    void insert(note **head, int notedate) {
        note* p = *head, * tmp = NULL;
        note* pr = (note*)malloc(sizeof(note));
        if (pr == NULL) { 
            printf("你的内存不足!\n");
            exit(0);
        }

        pr->number = notedate;
        pr->next = NULL;
        if (*head == NULL) //如果链表为空链表就开辟将此节点设置为表头
            *head = pr;
        else {
            while (p->number < notedate && p->next) {
                tmp = p;
                p = p->next;
            }
            if (p->number > notedate) {
                if (p == *head) {
                    pr->next = *head;
                    *head = pr;
                }
                else{
                    pr->next = p;//将新分配节点的地址尾指针next指向目标位置的下一个节点
                    tmp->next = pr;//将目标位置的前一个节点的尾指针指向新节点        
                }
            }
            else 
                p->next = pr;//如果没有找到目标位置的节点就在链尾添加新节点    
        }
    }

    int main(void) {

        note* head = NULL;//创建一个结构体的指针作为链表头指针
        printf("请顺序输入的链表的每个节点对应的值以0结束:\n");
        scanfList(&head);//传要建立的链表的地址即表头的地址
        
        //note *p定义新指针指向表头
        int count = 0;//统计节点的数量
        for (note *p=head; p; p = p->next) {//常规的遍历链表的循环方式
            count++;
            printf("第%d个节点的值是: %d\n ", count, p->number);
        }

        //删除节点
        printf("请输入需要删除的节点对应的值:\n");
        int notedate, count1 = 0;
        scanf("%d", &notedate);
        Delete(&head, notedate);//直接修改链表节点的值就传表头的地址
        for (note* p = head; p; p = p->next) {
            count1++;
            printf("第%d个节点的值是: %d\n", count1, p->number);
        }

        //新节点的插入
        printf("请输入你想插入节点数值的大小关系:\n");
        int notedate1,count2=0;
        scanf("%d", &notedate1);
        insert(&head, notedate1);
        for (note* p = head; p; p = p->next) {
            count2++;
            printf("第%d个节点的值是: %d\n", count2, p->number);
        }

        //链表的释放
        for (; head; head = head->next)
            free(head);

        return 0;
    }

代码写的非常的弱鸡难看,如有错误和不足的地方,请指出喔~

上一篇:note:KD547


下一篇:【Note】git上手-解决连接github时connection reset的问题