后向动态链表增删查改

#include <stdio.h>

#include <stdlib.h>

#include <stdint.h>

#include <string.h>

typedef uint32_t ElemTyp;

typedef struct st_single_chain_list {

ElemTyp dat;

struct st_single_chain_list *next;

} tagLink_t;

ElemTyp total;

tagLink_t *init_single_chain_list(ElemTyp value)

{

tagLink_t *tmp = (tagLink_t *)malloc(sizeof(tagLink_t));

if (tmp == NULL) {

printf("original node create fail!\n");

return NULL;

}

tmp->dat = value;

tmp->next = NULL;

total = 1; // 头节点

return tmp;

}

void insert_an_element(tagLink_t *p, ElemTyp value, ElemTyp posi)

{

tagLink_t *head = NULL;

tagLink_t *tmp = NULL;

tagLink_t *q = p;

tagLink_t *prev = NULL;

ElemTyp append_flag = 0;

ElemTyp i = 0;

if (posi == 0) {

printf("insert %d before head node!\n", value);

return;

}

if (posi > total) {

printf("insert position: %d invalid! total :%d\n", posi, total);

return;

} else if (posi == total) {

append_flag = 1;

} else {

append_flag = 2;

}

tmp = (tagLink_t *)malloc(sizeof(tagLink_t));

if (tmp == NULL) {

printf("%d node create fail!\n", posi);

return;

}

q = p;

if (append_flag == 1) {

while (q != NULL) {

prev = q;

q = q->next;

}

q = prev;

tmp->dat = value;

tmp->next = NULL;

q->next = tmp;

total++;

} else {

for (i = 0; i < posi - 1; i++) {

q = q->next;

}

tmp->dat = value;

tmp->next = q->next;

q->next = tmp;

total++;

}

}

void delete_an_element_by_position(tagLink_t *p, ElemTyp posi)

{

ElemTyp i = 0;

tagLink_t *q = p;

tagLink_t *tmp = p;

if ( (posi >= total) || (posi == 0) ) {

printf("delete position improper!\n");

return;

}

if (posi < total - 1) {

for (; i < posi; i++) {

tmp = q;

q = q->next;

}

tmp->next = q->next;

total--;

} else {

for (; q->next != NULL; q = q->next) {

tmp = q;

}

tmp->next = NULL;

total--;

}

}

void delete_an_element_by_value(tagLink_t *p, ElemTyp value)

{

ElemTyp i = 0;

tagLink_t *q = p;

tagLink_t *tmp = p;

ElemTyp value_found = 0;

ElemTyp index = 0;

for (q = p; q != NULL; q = q->next) {

if (value != q->dat) {

index++;

continue;

}

value_found = 1;

break;

}

if (value_found == 0) {

printf("value not found!\n");

return;

}

if (index == 0) {

printf("prohibit to delete head node!\n");

return;

}

if (index == total) {

for (q = p; q->next != NULL; q = q->next) {

tmp = q;

}

tmp->next = NULL;

total--;

} else {

for (i = 0, q = p; i < index; i++) {

tmp = q;

q = q->next;

}

tmp->next = q->next;

total--;

}

}

ElemTyp search_an_element(tagLink_t *p, ElemTyp value)

{

tagLink_t *q = p;

ElemTyp value_found = 0;

ElemTyp index = 0;

for (q = p; q != NULL; q = q->next) {

if (value != q->dat) {

index++;

continue;

}

value_found = 1;

break;

}

if (value_found == 0) {

return 0xFF;

}

return index;

}

void modify_an_elment(tagLink_t *p, ElemTyp posi, ElemTyp value)

{

tagLink_t *q = p;

ElemTyp value_found = 0;

ElemTyp i = 0;

if (posi >= total) {

printf("modify position improper!\n");

}

if (posi == 0) {

q->dat = value;

} else {

for (i = 0; i < posi; i++) {

q = q->next;

}

q->dat = value;

}

}

int main()

{

tagLink_t *Link = NULL;

tagLink_t *p = NULL;

ElemTyp index = 0;

ElemTyp value_id = 0xFF;

ElemTyp seek_value = 0;

Link = init_single_chain_list(36);

insert_an_element(Link, 3, 0);

insert_an_element(Link, 4, 1);

insert_an_element(Link, 37, 2);

insert_an_element(Link, 6, 3);

insert_an_element(Link, 29, 4);

insert_an_element(Link, 8, 5);

insert_an_element(Link, 75, 6);

insert_an_element(Link, 10, 7);

insert_an_element(Link, 11, 8);

insert_an_element(Link, 12, 9);

insert_an_element(Link, 100, 6);

insert_an_element(Link, 55, 5);

printf("search process:\n");

seek_value = 10;

value_id = search_an_element(Link, seek_value);

if (value_id != 0xFF) {

printf("%d found, index: %d\n", seek_value, value_id);

}

for (p = Link; p != NULL; p = p->next) {

printf("%d----%d\n", index++, p->dat);

}

printf("modify process:\n");

modify_an_elment(Link, 5, 152);

index = 0;

for (p = Link; p != NULL; p = p->next) {

printf("%d----%d\n", index++, p->dat);

}

printf("delete process by position:\n");

delete_an_element_by_position(Link, 4);

index = 0;

for (p = Link; p != NULL; p = p->next) {

printf("%d----%d\n", index++, p->dat);

}

printf("delete process by position:\n");

delete_an_element_by_position(Link, 10);

index = 0;

for (p = Link; p != NULL; p = p->next) {

printf("%d----%d\n", index++, p->dat);

}

printf("delete process by value:\n");

delete_an_element_by_value(Link, 100);

index = 0;

for (p = Link; p != NULL; p = p->next) {

printf("%d----%d\n", index++, p->dat);

}

printf("delete process by value:\n");

delete_an_element_by_value(Link, 11);

index = 0;

for (p = Link; p != NULL; p = p->next) {

printf("%d----%d\n", index++, p->dat);

}

free(Link);

return 0;

}

相关推荐
John_ToDebug3 小时前
浏览器扩展延迟加载优化实战:如何让浏览器启动速度提升50%
c++·chrome·windows
蟑螂恶霸3 小时前
Windows安装OpenCV 4.8
人工智能·windows·opencv
路溪非溪4 小时前
Linux下蓝牙框架的数据流
linux·arm开发·驱动开发
能不能别报错4 小时前
openclaw-linux部署教程+mimo-v2-pro
linux·运维·服务器
特立独行的猫a6 小时前
在 Windows 10 上安装和使用 WSL 2 安装 Ubuntu24详细指南
windows·ubuntu·wsl2
济6176 小时前
ARM Linux 驱动开发篇---基于 pinctrl+GPIO 子系统的蜂鸣器驱动开发(设备树版)--- Ubuntu20.04
linux·嵌入式·嵌入式linux驱动开发
AiGuoHou16 小时前
Debian/Ubuntu 各个版本一键更换国内镜像源
linux·ubuntu·国内源·debian·镜像源·换源
蓝羽天空6 小时前
Ubuntu 24.04 安装 Docker
linux·ubuntu·docker
T0uken6 小时前
WSL:离线配置 Ubuntu 开发环境
linux·运维·ubuntu
�羡阳丶6 小时前
ubuntu22.04+5060显卡双系统安装,各种黑屏踩坑记录
linux·经验分享·ubuntu