后向动态链表增删查改

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

}

相关推荐
꧁༺朝花夕逝༻꧂21 分钟前
随机面试--<二>
linux·运维·数据库·nginx·面试
刚入坑的新人编程29 分钟前
数据结构——栈和队列
c语言·数据结构·c++·链表·数组
开***能30 分钟前
EthernetiP转modbusTCP网关在加氢催化中的应用
linux·服务器·网络
UFIT36 分钟前
系统安全及应用
linux·运维
又过一个秋1 小时前
【sylar-webserver】重构日志系统
linux·c++·算法·重构
朝新_1 小时前
【数据结构】第四弹——LinkedList与链表
数据结构·链表
JhonKI1 小时前
【Linux网络】构建UDP服务器与字典翻译系统
linux·服务器·网络·tcp/ip·udp
伤不起bb2 小时前
系统安全及应用
linux·运维·网络·安全·系统安全
啊吧怪不啊吧2 小时前
Linux常见指令介绍中(入门级)
linux·运维·服务器
鹏大师运维2 小时前
用银河麒麟 LiveCD 快速查看原系统 IP 和打印机配置
linux·ip地址·国产化·国产操作系统·打印机·统信uos·livecd