首页 > 其他分享 >C语言链表

C语言链表

时间:2024-10-30 10:23:26浏览次数:1  
标签:C语言 temp param element 链表 link next

//
// Created by Administrator on 2024/10/29.
//

#ifndef LINK_H
#define LINK_H
/**
 * 链表的结构体
 */
typedef struct Link {
    int element;
    struct Link *next;
} link;
#endif //LINK_H
//
// 链表
// Created by Administrator on 2024/10/28.
//
#pragma once
#include "Link.h"
#ifndef LINKTABLE_H
#define LINKTABLE_H


/**
 * 初始化链表
 * @return
 */
link *initLink();

/**
 * 链表插入数据
 * @param p 原链表
 * @param element 要插入的元素
 * @param add 插入的位置 起始为0
 * @return
 */
link *insertLink(link *p, int element, int add);

/**
 * 链表删除元素
 * @param p 原链表
 * @param add 删除的位置 起始为0
 * @return
 */
link *deleteLink(link *p, int add);

/**
 * 更新链表元素
 * @param p
 * @param element
 * @param add
 * @return
 */
link *updateLink(link *p, int element, int add);

/**
 * 查找链表元素
 * @param p 链表
 * @param element 元素
 * @return 元素所处的位置 -1表示没查到
 */
int selectLink(const link *p, int element);

/**
 * 显示链表
 * @param p
 */
void displayLink(link *p);
#endif //LINKTABLE_H
//
// 链表
// Created by Administrator on 2024/10/28.
//
#include "LinkTable.h"

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

/**
 * 初始化链表
 * @return
 */
link *initLink() {
    link *p = NULL; /*创建头指针*/
    link *temp = (link *) malloc(sizeof(link));
    temp->element = 1; /*首节点初始化*/
    temp->next = NULL; /*首节点指针为NULL*/
    p = temp;
    /*添加其他节点*/
    for (int i = 2; i < 5; i++) {
        link *a = (link *) malloc(sizeof(link)); /*临时节点a*/
        a->element = i;
        a->next = NULL;
        temp->next = a;
        temp = temp->next;
    }
    return p;
}

/**
 * 链表插入数据
 * @param p 原链表
 * @param element 要插入的元素
 * @param add 插入的位置 起始为0
 * @return
 */
link *insertLink(link *p, const int element, const int add) {
    link *temp = p;
    /*要插入的节点c*/
    link *c = (link *) malloc(sizeof(link));
    c->element = element;
    if (add <= 0) {
        /*插入的位置为0*/
        c->next = temp;
        return c;
    }
    /*找到要插入元素的前驱节点*/
    for (int i = 1; i < add; i++) {
        if (temp->next == NULL) { break; } /*插入的位置大于链表的长度,则追加到链表的最后*/
        temp = temp->next;
    }
    c->next = temp->next; /*新元素的后置节点*/
    temp->next = c; /*旧元素的后置节点 指向c*/
    return p;
}

/**
 * 链表删除元素
 * @param p 原链表
 * @param add 删除的位置 起始为0
 * @return
 */
link *deleteLink(link *p, const int add) {
    link *temp = p;
    if (add <= 0) {
        /*删除的位置小于0,则删除第一个节点*/
        link *del = temp; /*被删除的节点*/
        p = temp->next;
        free(del); /*释放该结节,防止内存泄漏*/
        return p;
    }
    /*查找到要删除节点的上一个节点*/
    for (int i = 1; i < add; i++) {
        if (temp->next->next == NULL) { break; } /*删除的位置大于链表的长度,则删除最后一个节点*/
        temp = temp->next;
    }
    link *del = temp->next; /*被删除的节点*/
    temp->next = temp->next->next;
    free(del); /*释放该结节,防止内存泄漏*/
    return p;
}

/**
 * 更新链表元素
 * @param p
 * @param element
 * @param add
 * @return
 */
link *updateLink(link *p, const int element, const int add) {
    link *temp = p;
    /*位置小于0时无法更新节点*/
    if (add < 0) { return p; }
    if (add == 0) {
        temp->element = element;
        return p;
    }
    temp = temp->next;
    for (int i = 1; i < add; i++) {
        if (temp->next == NULL) return p;/*更新的位置大于链表的长度,无法更新节点,直接返回*/
        temp = temp->next;
    }
    temp->element = element;
    return p;
}

/**
 * 查找链表元素
 * @param p 链表
 * @param element 元素
 * @return 元素所处的位置 -1表示没查到
 */
int selectLink(const link *p, const int element) {
    const link *temp = p;
    int index = 0;
    while (temp) {
        if (temp->element == element) {
            return index;
        }
        temp = temp->next;
        index++;
    }
    return -1;
}

/**
 * 显示链表
 * @param p
 */
void displayLink(link *p) {
    const link *temp = p;
    while (temp) {
        printf("%d ", temp->element);
        temp = temp->next;
    }
    printf("\n");
}

 

标签:C语言,temp,param,element,链表,link,next
From: https://www.cnblogs.com/longfeiPHP/p/18515241

相关文章

  • C语言链表反转的四种方法
    ////CreatedbyAdministratoron2024/10/29.//#ifndefLINK_H#defineLINK_H/***链表的结构体*/typedefstructLink{intelement;structLink*next;}link;#endif//LINK_H////四种链表反转算法//CreatedbyAdministratoron2024/10/29.......
  • L1-015 c语言跟奥巴马一起画方块
    美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!输入格式:输入在一行中给出正方形边长N(3≤N≤2......
  • 2个月搞定计算机二级C语言——真题(6)解析
    1.前言本篇我们讲解2个月搞定计算机二级C语言——真题62.程序填空题2.1题目要求2.2提供的代码#include<stdio.h>unsignedlongfun(unsignedlongn){unsignedlongx=0;intt;while(n){t=n%10;/**********fou......
  • 【C语言】预处理(预编译)详解(下)(C语言最终篇)
    文章目录一、#和##1.#运算符2.##运算符二、预处理指令#undef三、条件编译1.单分支条件编译2.多分支条件编译3.判断符号是否被定义4.判断符号是否没有被定义四、头文件的包含1.库头文件的包含2.本地头文件的包含3.嵌套包含头文件的解决方法使用条件编译指令使用预处理......
  • C语言之长整型有符号数与短整型有符号数转换
            最近考证的新星,问了一个问题:inta=1234565789;为什么在输出%hd时的值为-1379?其实这个很简单,只不过对于可能初入“编程坑”以及经验不是很丰富的朋友来说,感觉知道这么个道理,但就是解释不上来,无法做出实际的推论。作者想说的是,这个知识点亦涉及多方面,比较广泛,......
  • 初学c语言(第一天)
     其实我也不太算是初学,但是也算是初学,这样说有点矛盾哈,让我来解释一下: 首先我是一个今年刚刚毕业的大学生,大学学的专业是电子信息工程,这个专业涉及过c语言,但是我大学期间只顾的潇洒了,没怎么认真学习,只有当大四下学期的时候我们离校需要出去找工作实习时,我才发现我什么都不......
  • 实验3 C语言函数应用编程
    #include<stdio.h>charscore_to_grade(intscore);intmain(){intscore;chargrade;while(scanf("%d",&score)!=EOF){grade=score_to_grade(score);printf("分数:%d,等级:%c\n\n",score,gr......
  • 实验3_C语言函数应用编程
    任务一:#include<stdio.h>charscore_to_grade(intscore);intmain(){intscore;chargrade;while(scanf("%d",&score)!=EOF){grade=score_to_grade(score);printf("分数:%d,等级:%c\n\n",......
  • 复杂度分析,数据结构的数组与链表
    复杂度分析,数据结构的数组与链表参考书籍:Hello算法目录复杂度分析,数据结构的数组与链表复杂度分析时间复杂度空间复杂度数据结构数组与链表数组链表列表复杂度分析复杂度分析是用来判断一个算法效率的手段,执行时所需的时间和空间资源则是正好对应时间和空间复杂度。考虑到执......
  • C语言中实现一个包含开卡、查询内容、存钱、取钱、转账和修改密码的银行服务系统
       大家好,我是带我去滑雪,每天教你一个小技巧!   本次在C语言中实现一个包含开卡、查询内容、存钱、取钱、转账和修改密码的银行服务系统,下面开始代码实战。目录一、功能模块设计(1)开卡功能(2)查询内容(3)存钱功能(4)取钱功能(5)转账功能(6)修改密码功能二、数据结构......