1、链表之增、删、查实现(C语言)
一、功能描述:
可以创建节点并添加到链表中、查看链表中的所有节点、并可以删除特定的节点
二、代码实现
1、主函数main主要实现的是从后台键入不同的字符,执行对应的函数来实现特定的操作代码如下:
int main(char argc, char *argv[])
{
char c;
while ()
{
c = getchar(); //键入一个字符
// printf("c = %c\n",c); printf("Usage:\n");
printf("<l> List all the notes\n");
printf("<a> Add a node to chains\n");
printf("<d> Delete a node from chains\n");
printf("<q> quit\n");
printf("Enter the choise: \n");
switch (c)
{
case 'l' :
{
list_all_notes(); //显示链表中所有的节点
break;
}
case 'a' :
{
add_a_node(); //链表中添加一个节点
break;
}
case 'd' :
{
delete_a_node(); //删除链表中的一个节点
break;
}
case 'q' : //退出死循环
{
return ;
break;
}
defaut :
{
break;
}
}
}
return ;
}
2、add_a_node的主要作用创建一个节点,并初始化(节点分配内存、初始化节点name),最后调用add_note_to_chains函数把该节点添加到链表中,代码如下:
void add_a_node()
{
char *str; //用来存放节点名字
char name[]; //临时变量,键盘设置新节点的名字
PT_Node ptNew; //指针变量,指向新的节点 printf("Please enter name of node to be added : ");
scanf("%s", name); //给新添加的节点取一个名字 str = malloc(strlen(name) + ); //为节点的名字分配空间
strcpy(str, name); ptNew = malloc(sizeof(T_Node)); //为新节点分配内存 //初始化节点中的元素
ptNew ->name = str; //节点中的name指向str
ptNew ->pre = NULL;
ptNew ->next = NULL; add_note_to_chains(ptNew); //把该节点添加到链表中
}
3、add_note_to_chains主要实现的是把节点挂载到链表中,代码如下:
static void add_note_to_chains(PT_Node ptNew)
{
PT_Node ptCur;
if (g_ptNodeHead == NULL)
{
g_ptNodeHead = ptNew;//如果链表中没有一个节点,则头结点指向该节点
}
else
{
ptCur = g_ptNodeHead;
while(ptCur ->next) //遍历找到当前节点的next元素为空
{
ptCur = ptCur ->next;
} ptCur->next = ptNew; //把新的节点挂载到g_ptNodeHead链表中
ptNew ->pre = ptCur; }
}
4、delete_a_node函数的主要功能是通过键入的name,索引到链表中对应的节点地址,最后调用delete_node函数删除(卸载)链表中对应的节点,代码如下:
static void delete_a_node()
{
PT_Node ptFindName;
char name[]; printf("Please enter the name of node to be deleted :");
scanf("%s", name); ptFindName = get_name(name); //通过名字获得对应节点地址
if (ptFindName == NULL)
{
printf("Don't have this node\n");
return;
} delete_node(ptFindName); //删除链表中对应的节点
}
5、get_name函数的作用是通过节点name在链表中索引到其对应的节点地址,代码如下:
PT_Node get_name(char *name)
{
PT_Node ptCar;
if (g_ptNodeHead == NULL)
{
return NULL;
}
else
{
ptCar = g_ptNodeHead;
do{
if (strcmp (ptCar->name, name) == )
{
printf("find \'%s\' from chain\n",name);
return ptCar;
}
else
{
ptCar = ptCar->next;
}
}while (ptCar); printf("don't find \'%s\' from chain\n",name);
return NULL;
}
}
6、delete_node函数的主要作用是卸载链表中对应的节点,卸载细节如下图,其中ptCar为当前要被卸载的节点、ptPre为前一个节点、ptNext为后一个节点

对应代码如下:
static void delete_node(PT_Node ptDel)
{
PT_Node ptCar;
PT_Node ptPre;
PT_Node ptNext;
if (g_ptNodeHead == ptDel)
{
g_ptNodeHead = ptDel->next;
// return;
}
else{
ptCar = g_ptNodeHead ->next;
// printf("1111111111111\n");
while(ptCar)
{
if (ptCar == ptDel)
{
//从链表中删除
ptPre = ptCar ->pre;
ptNext = ptCar ->next;
ptPre->next = ptNext;
// printf("22222222\n");
if(ptNext)
{
ptNext ->pre = ptPre;
}
break;
}
else
{
ptCar = ptCar->next;
// printf("333333\n");
}
}
}
free(ptDel->name); //释放节点名字占用的内存
free(ptDel); //释放节点占用的内存
}
7、list_all_notes显示链表中的所用节点,代码如下:
static void list_all_notes()
{
PT_Node ptCar;
ptCar = g_ptNodeHead;
int i = ;
if (g_ptNodeHead == NULL)
{
printf("\n");
printf("There is no node in chain list!\n");
printf("\n");
}
while(ptCar)
{
printf("%02d : %s\n", i++, ptCar ->name);
ptCar = ptCar ->next;
}
}
8、完整代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h> //定义一个节点
typedef struct T_NODE{
char *name;
struct T_NODE *pre;
struct T_NODE *next;
}T_Node, *PT_Node; static PT_Node g_ptNodeHead; //链表头 static void add_note_to_chains(PT_Node ptNew)
{
PT_Node ptCur;
if (g_ptNodeHead == NULL)
{
g_ptNodeHead = ptNew;//如果链表中没有一个节点,则头结点指向该节点
}
else
{
ptCur = g_ptNodeHead;
while(ptCur ->next) //遍历找到当前节点的next元素为空
{
ptCur = ptCur ->next;
} ptCur->next = ptNew; //把新的节点挂载到g_ptNodeHead链表中
ptNew ->pre = ptCur; }
} void add_a_node()
{
char *str; //用来存放节点名字
char name[]; //临时变量,键盘设置新节点的名字
PT_Node ptNew; //指针变量,指向新的节点 printf("Please enter name of node to be added : ");
scanf("%s", name); //给新添加的节点取一个名字 str = malloc(strlen(name) + ); //为节点的名字分配空间
strcpy(str, name); ptNew = malloc(sizeof(T_Node)); //为新节点分配内存 //初始化节点中的元素
ptNew ->name = str; //节点中的name指向str
ptNew ->pre = NULL;
ptNew ->next = NULL; add_note_to_chains(ptNew); //把该节点添加到链表中
} PT_Node get_name(char *name)
{
PT_Node ptCar;
if (g_ptNodeHead == NULL)
{
return NULL;
}
else
{
ptCar = g_ptNodeHead;
do{
if (strcmp (ptCar->name, name) == )
{
printf("find \'%s\' from chain\n",name);
return ptCar;
}
else
{
ptCar = ptCar->next;
}
}while (ptCar); printf("don't find \'%s\' from chain\n",name);
return NULL; } } static void delete_node(PT_Node ptDel)
{
PT_Node ptCar;
PT_Node ptPre;
PT_Node ptNext;
if (g_ptNodeHead == ptDel)
{
g_ptNodeHead = ptDel->next;
// return;
}
else{
ptCar = g_ptNodeHead ->next;
// printf("1111111111111\n");
while(ptCar)
{
if (ptCar == ptDel)
{
//从链表中删除
ptPre = ptCar ->pre;
ptNext = ptCar ->next;
ptPre->next = ptNext;
// printf("22222222\n");
if(ptNext)
{
ptNext ->pre = ptPre;
}
break;
}
else
{
ptCar = ptCar->next;
// printf("333333\n");
}
}
}
free(ptDel->name); //释放节点名字占用的内存
free(ptDel); //释放节点占用的内存
} static void delete_a_node()
{
PT_Node ptFindName;
char name[]; printf("Please enter the name of node to be deleted :");
scanf("%s", name); ptFindName = get_name(name); //通过名字获得对应节点地址
if (ptFindName == NULL)
{
printf("Don't have this node\n");
return;
} delete_node(ptFindName); //删除链表中对应的节点
} static void list_all_notes()
{
PT_Node ptCar;
ptCar = g_ptNodeHead;
int i = ;
if (g_ptNodeHead == NULL)
{
printf("\n");
printf("There is no node in chain list!\n");
printf("\n");
}
while(ptCar)
{
printf("%02d : %s\n", i++, ptCar ->name);
ptCar = ptCar ->next;
}
} int main(char argc, char *argv[])
{
char c;
while ()
{
c = getchar(); //键入一个字符
// printf("c = %c\n",c); printf("Usage:\n");
printf("<l> List all the notes\n");
printf("<a> Add a node to chains\n");
printf("<d> Delete a node from chains\n");
printf("<q> quit\n");
printf("Enter the choise: \n");
switch (c)
{
case 'l' :
{
list_all_notes(); //显示链表中所有的节点
break;
}
case 'a' :
{
add_a_node(); //链表中添加一个节点
break;
}
case 'd' :
{
delete_a_node(); //删除链表中的一个节点
break;
}
case 'q' : //退出死循环
{
return ;
break;
}
defaut :
{ break;
}
}
}
return ;
}
1、链表之增、删、查实现(C语言)的更多相关文章
- 关于单链表的增删改查方法的递归实现(JAVA语言实现)
因为在学习数据结构,准备把java的集合框架底层源码,好好的过一遍,所以先按照自己的想法把单链表的类给写出来了; 写该类的目的: 1.练习递归 2.为深入理解java集合框架底层源码打好基础 学习的视 ...
- Java描述数据结构之链表的增删改查
链表是一种常见的基础数据结构,它是一种线性表,但在内存中它并不是顺序存储的,它是以链式进行存储的,每一个节点里存放的是下一个节点的"指针".在Java中的数据分为引用数据类型和基础 ...
- PHP数据库的 增 删 查
一.匹配数据库登录 步骤: 1.做一个普通的登录界面,注意提交方式为post. <!--登录界面--> <form action="chuli.php" meth ...
- 史上最全单链表的增删改查反转等操作汇总以及5种排序算法(C语言)
目录 1.准备工作 2.创建链表 3.打印链表 4.在元素后面插入元素 5.在元素前面增加元素 6.删除链表元素,要注意删除链表尾还是链表头 7.根据传入的数值查询链表 8.修改链表元素 9.求链表长 ...
- Java实现单向链表的增删改查
class List<T> { private class Node { private T data; private Node next; private Node(T data) { ...
- WindowsForm 增 删 查 改
首先是连接数据库 在数据库里写代码 建立一个数据库下面是代码 create database JinXiaoCun go use JinXiaoCun go create table users ( ...
- HBase java API 的使用范例(增,删,查,扫描)
编辑pom.xml <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase ...
- 好用的SQL TVP~~独家赠送[增-删-改-查]的例子
以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化. 本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...
- iOS FMDB的使用(增,删,改,查,sqlite存取图片)
iOS FMDB的使用(增,删,改,查,sqlite存取图片) 在上一篇博客我对sqlite的基本使用进行了详细介绍... 但是在实际开发中原生使用的频率是很少的... 这篇博客我将会较全面的介绍FM ...
- iOS sqlite3 的基本使用(增 删 改 查)
iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...
随机推荐
- 阻止事件冒泡传播stopPropagation() 阻止自身默认行为preventdefault()
stopPropagation 简单理解:子元素的点击事件 不会去触发父元素的点击事件 preventdefault 简单理解:当点击提交按钮时(submit) 阻止对表 ...
- hadoop.docker.up.problems: Too many levels of symbolic links
#root@c7hp:~ excp c78 "zkServer.sh start"[1] 11:49:44 [FAILURE] c78 Exited with error code ...
- golang对不同系统的编译
Golang 支持在一个平台下生成另一个平台可执行程序的交叉编译功能. Mac下编译 # mac编译linux执行文件 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go ...
- 【Spring】文件上传
一:引入所需jar包 // https://mvnrepository.com/artifact/commons-fileupload/commons-fileuploadcompile group: ...
- 《xxx系统》质量属性战术
<xxx系统>质量属性战术 可用性:重新引入 用户每填写一份表单,表单查看中即时更新所有信息. 易用性:系统主动 对于下拉框的选项较多时,用户可先进行部分输入,系统进行实时检索显示与用户输 ...
- 调试利器GDB(下)
本节我们研究gdb更深层的用法: 数据断点: 可以根据变量的值来监视变量. 数据断点本质是硬件断点,数量有限. watch var_name告诉gdb我们关注var_name这个变量,如果它的值被改变 ...
- vue插件
Vue.js提供了插件机制,可以在全局添加一些功能.它们可以简单到几个方法.属性,也可以很复杂,比如一整套组件库. 注册插件需要一个公开的方法install,它的第一个参数是Vue构造器,第二个参数是 ...
- java native 笔记
java中native的用法 前言: 在查看 Object.java 文件时,发现有一个 方法比较特殊(不认得,看不懂...) private static native void regist ...
- 第二次实验:CC2530平台上GPIO组件的TinyOS编程
实验二 CC2530平台上GPIO组件的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生理解和掌握CC2530的GPIO及外部中断,及其TinyOS编程方法 学 ...
- frag
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android=&qu ...