后向动态链表增删查改

#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;

}

相关推荐
bjzhang751 小时前
CentOS下安装MySQL详解
linux·mysql·centos
Jason_chen3 小时前
Linux 6.2 音频机制深度解析:AI驱动的低延迟音频与零信任音频安全架构
linux
下午写HelloWorld3 小时前
Linux系统及Ubuntu常用指令
linux·ubuntu·操作系统
caimouse4 小时前
Reactos 第 5 章 进程与线程 — 5.8 Windows 的 APC 机制
c语言·windows
PHP隔壁老王邻居4 小时前
windows菜单搜索栏无法显示历史记录或者无法使用修复方法
windows
weixin_523185325 小时前
Collections.unmodifiableMap详解:真的不可修改吗?
java·linux·前端
道一235 小时前
Windows系统查看端口占用进程的3种实用方法
windows·笔记
半条-咸鱼5 小时前
【INACCESSIBLE_BOOT_DEVICE】安装 Config Tool 后 Windows 蓝屏,最终通过 VMware 虚拟机解决
windows·stm32·vmware·芯片
凡人叶枫6 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
云栖梦泽6 小时前
玩转RK3506SDK
linux·嵌入式硬件