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"); }
If the copyright belongs to the longfei, please indicate the source!!!