zoukankan      html  css  js  c++  java
  • C语言实现单链表

    大二学习数据结构和算法啦,因为之前用Java语言实现过,所以理解起来还是比较轻松,就是理解指针与结构体的运用。废话不多说,上代码!

    初始化

    typedef struct Node {
        int data;
        struct Node *next;
    } ListNode; 
    
    ListNode* InitLink() { //初始化,创建头结点
        ListNode *Head = (ListNode*)malloc(sizeof(ListNode));
        Head->next = NULL;
        return Head;
    }

    添加

    void AddLink(ListNode *Head, int msg) { //添加
        ListNode *Tmp = Head, *New;
        while(Tmp->next != NULL) {
            Tmp = Tmp->next;
        }
        New = (ListNode*)malloc(sizeof(ListNode));
        New->data = msg;
        New->next = NULL;
        Tmp->next = New;
    }

    删除(可以按值,也可以按位置)

    void Delete(ListNode *Head,int data) {//按值删除 
        if(Head->next == NULL) {
            printf("链表无元素可以删除!");
            return;
        }
        
        ListNode *pre = Head; //保存上一个结点 
        ListNode *cur = Head->next;//保存当前结点 
        while(cur != NULL) {
            if(cur->data == data) {
                pre->next = cur->next;//上一个结点的下一个等于当前结点的下一个结点 
                free(cur);//释放结点 
                return;//结束 
            }
            pre = cur;//前一个结点等于当前结点 
            cur = cur->next;//当前结点等于下一个结点 
        }
    }
    
    void DeleteMethod(ListNode *head, int element){//按值删除结点
        ListNode *pre = head;
        ListNode *cur = head->next;
        while (cur != NULL){
            if (cur->data == element){
                pre->next = cur->next;
                free(cur);
                return;//结束程序 
            }
            pre = cur;
            cur = cur->next;
        }
    }
    
    //index代表删除第几个结点 
    void DeleteLink(ListNode *Head,int index){//按下标删除 
        ListNode *Tmp = Head;
        ListNode *Old;
        int mark = 0;
        if(index < 0){
            return;
        }
        while(mark < index-1 && Tmp->next != NULL){
            Old = Tmp;
            Tmp = Tmp->next;
            mark++;
        }
        while(Tmp->next == NULL){
            return; 
        }
        Old = Tmp->next;
        Tmp->next = Old->next; 
        free(Old);
    }

    修改(可以按值,也可以按位置)

    void UpdataLink(ListNode *head, int oldata, int newdata){//按值修改数据
        ListNode *pre = head;
        ListNode *cur = head->next;
        while (cur != NULL){
            if (cur->data == oldata){
                cur->data = newdata;
                return;//结束程序 
            }
            pre = cur;
            cur = cur->next;
        }
    }
    
    void UpLink(ListNode *Head,int index,int element){//按下标修改 
        ListNode *Tmp = Head;
        int mark = 0;
        if(index < 0){
            return;
        }
        while(mark < index - 1 && Tmp->next != NULL){
            Tmp = Tmp->next;
            mark++;
        }    
        while(Tmp->next == NULL){
            return; 
        }
        Tmp->next->data = element; 
    }

    插入(可以按值,也可以按位置)

    void InsetrLink(ListNode *head, int oldata, int newdata){//按值输入之前插入 
        ListNode *New = (ListNode*)malloc(sizeof(ListNode));
        New->data = newdata;
        New->next = NULL;
        ListNode *pre = head;
        ListNode *cur = head->next;
        while (cur != NULL){
            if (cur->data == oldata){
                pre->next = New;
                New->next = cur;
                return;//结束程序 
            }
            pre = cur;
            cur = cur->next;
        }
    }
    void InsertLink(ListNode *Head,int index,int element){//按下标插入 
        ListNode *Tmp = Head;
        ListNode *New;
        int mark = 0;
        if(index < 0){
            return;
        }
        while(mark < index - 1 && Tmp->next != NULL){
            Tmp = Tmp->next;
            mark++;
        }    
        while(Tmp->next == NULL){
            return; 
        }
        New = (ListNode*)malloc(sizeof(ListNode));
        New->data = element;
        New->next = Tmp->next;
        Tmp->next = New;
    }

    查询(返回一个结点地址)

    //提出查找结点方法,其它方法可以调用 
    //在单链表中查找第index个结点 
    ListNode* GetNode(ListNode *Head,int index){//查找结点方法 
        int mark = 0;
        ListNode *Tmp = Head;
        while(Tmp->next && mark < index){//Tmp->next为NULL 或者 mark==index结束 
            Tmp = Tmp->next;
            mark++;
        }
        if(index == mark){
            return Tmp;
        }else{
            return NULL;
        }
    }

    销毁

    void DestoryLink(ListNode *Head) { //销毁链表
        ListNode *Tmp;
        while(Head->next){
            Tmp = Head->next;
            Head->next = Tmp->next;
            free(Tmp);
        }
        free(Head);//头都删掉 
    }

    显示

    void Display(ListNode *Head) {//显示
        ListNode *Tmp = Head->next;
        while(Tmp != NULL) {
            printf("%d ",Tmp->data);
            Tmp = Tmp->next;
        }
    }

    甩上完整代码

    #include<stdio.h>
    #include<stdlib.h>
    
    //Upon开发————2019.9.26 
    typedef struct Node {
        int data;
        struct Node *next;
    } ListNode; 
    
    ListNode* InitLink() { //初始化,创建头结点
        ListNode *Head = (ListNode*)malloc(sizeof(ListNode));
        Head->next = NULL;
        return Head;
    }
    
    void AddLink(ListNode *Head, int msg) { //添加
        ListNode *Tmp = Head, *New;
        while(Tmp->next != NULL) {
            Tmp = Tmp->next;
        }
        New = (ListNode*)malloc(sizeof(ListNode));
        New->data = msg;
        New->next = NULL;
        Tmp->next = New;
    }
    
    void Delete(ListNode *Head,int data) {//按值删除 
        if(Head->next == NULL) {
            printf("链表无元素可以删除!");
            return;
        }
        
        ListNode *pre = Head; //保存上一个结点 
        ListNode *cur = Head->next;//保存当前结点 
        while(cur != NULL) {
            if(cur->data == data) {
                pre->next = cur->next;//上一个结点的下一个等于当前结点的下一个结点 
                free(cur);//释放结点 
                return;//结束 
            }
            pre = cur;//前一个结点等于当前结点 
            cur = cur->next;//当前结点等于下一个结点 
        }
    }
    
    void DeleteMethod(ListNode *head, int element){//按值删除结点
        ListNode *pre = head;
        ListNode *cur = head->next;
        while (cur != NULL){
            if (cur->data == element){
                pre->next = cur->next;
                free(cur);
                return;//结束程序 
            }
            pre = cur;
            cur = cur->next;
        }
    }
    void InsetrLink(ListNode *head, int oldata, int newdata){//按值输入之前插入 
        ListNode *New = (ListNode*)malloc(sizeof(ListNode));
        New->data = newdata;
        New->next = NULL;
        ListNode *pre = head;
        ListNode *cur = head->next;
        while (cur != NULL){
            if (cur->data == oldata){
                pre->next = New;
                New->next = cur;
                return;//结束程序 
            }
            pre = cur;
            cur = cur->next;
        }
    }
    
    void UpdataLink(ListNode *head, int oldata, int newdata){//修改数据
        ListNode *pre = head;
        ListNode *cur = head->next;
        while (cur != NULL){
            if (cur->data == oldata){
                cur->data = newdata;
                return;//结束程序 
            }
            pre = cur;
            cur = cur->next;
        }
    }
    void InsertLink(ListNode *Head,int index,int element){//按下标插入 
        ListNode *Tmp = Head;
        ListNode *New;
        int mark = 0;
        if(index < 0){
            return;
        }
        while(mark < index - 1 && Tmp->next != NULL){
            Tmp = Tmp->next;
            mark++;
        }    
        while(Tmp->next == NULL){
            return; 
        }
        New = (ListNode*)malloc(sizeof(ListNode));
        New->data = element;
        New->next = Tmp->next;
        Tmp->next = New;
    }
    void UpLink(ListNode *Head,int index,int element){//按下标修改 
        ListNode *Tmp = Head;
        int mark = 0;
        if(index < 0){
            return;
        }
        while(mark < index - 1 && Tmp->next != NULL){
            Tmp = Tmp->next;
            mark++;
        }    
        while(Tmp->next == NULL){
            return; 
        }
        Tmp->next->data = element; 
    }
    //index代表删除第几个结点 
    void DeleteLink(ListNode *Head,int index){//按下标删除 
        ListNode *Tmp = Head;
        ListNode *Old;
        int mark = 0;
        if(index < 0){
            return;
        }
        while(mark < index-1 && Tmp->next != NULL){
            Old = Tmp;
            Tmp = Tmp->next;
            mark++;
        }
        while(Tmp->next == NULL){
            return; 
        }
        Old = Tmp->next;
        Tmp->next = Old->next; 
        free(Old);
    }
    //提出查找结点方法,其它方法可以调用 
    //在单链表中查找第index个结点 
    ListNode* GetNode(ListNode *Head,int index){//查找结点方法 
        int mark = 0;
        ListNode *Tmp = Head;
        while(Tmp->next && mark < index){//Tmp->next为NULL 或者 mark==index结束 
            Tmp = Tmp->next;
            mark++;
        }
        if(index == mark){
            return Tmp;
        }else{
            return NULL;
        }
    }
    void InsertList(ListNode *Head,int data,int index){//按下标插入 
        ListNode *Tmp = GetNode(Head,index - 1),*New;
        if(Tmp == NULL){
            return;
        }
        New = (ListNode*)malloc(sizeof(ListNode));
        New->data = data;
        New->next = Tmp->next;
        Tmp->next = New;
    }
    void DeleteList(ListNode *Head,int index){//按下标删除 
        ListNode *Tmp = GetNode(Head,index - 1),*New;
        if(Tmp == NULL || Tmp->next == NULL){
            return;
        }
        New = Tmp->next;
        Tmp->next = New->next;
        free(New);
    }
    void Display(ListNode *Head) {//显示
        ListNode *Tmp = Head->next;
        while(Tmp != NULL) {
            printf("%d ",Tmp->data);
            Tmp = Tmp->next;
        }
    }
    
    void DestoryLink(ListNode *Head) { //销毁链表
        ListNode *Tmp;
        while(Head->next){
            Tmp = Head->next;
            Head->next = Tmp->next;
            free(Tmp);
        }
        free(Head);//头都删掉 
    }
    
    int main() {
        ListNode *Head = InitLink();
        AddLink(Head,1);
        AddLink(Head,2);
        AddLink(Head,3);
        AddLink(Head,4);
        AddLink(Head,5);
    
        UpdataLink(Head,5,4);
        Display(Head);
        return 0;
    }
    View Code
  • 相关阅读:
    详细版Jmeter随机参数的接口并发测试总结
    Windows下MQTT代理服务器的搭建
    关于使用elascticsearch的两个小技巧
    解决easyswoole的swServer_start_check: onTask event callback must be set at报错
    解决使用宝塔安装的swoole扩展,运行项目出现的3个常见问题
    浅谈一下ThinkPHP5.1实现事务嵌套的特性
    资源出现多个 "Access-Control-Allow-Origin"
    Mac 制作系统启动盘
    深入剖析分布式一致性共识算法
    分布式系统限流算法分析与实现
  • 原文地址:https://www.cnblogs.com/hardhp74520/p/11594475.html
Copyright © 2011-2022 走看看