C语言链表

//
// 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");
}

 

posted @ 2024-10-30 10:23  龍飛鳯舞  阅读(2)  评论(0编辑  收藏  举报