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语言可以利用强大的互联网. ...
随机推荐
- cocso引擎整体流程
任何程序都有入口,mian.cpp; Cocos2d也不免俗,在win32平台下,有一个mian.cpp 入口,从这里进入cocos的世界. #ifndef __MAIN_H__ #define __ ...
- jQuery常用 遍历函数
jQuery 遍历函数包括了用于筛选.查找和串联元素的方法.本文主要介绍日常工作中常用的JQ遍历,帮助一下初学者快速的接触遍历函数,提高自己的代码编写速度,写出更简洁更实用的代码,祝前端的同学们,在前 ...
- 搭建webpack基础配置
搭建webpack基础步骤: 1.去官方网站下载node.js(根据自己电脑的系统类型选择) 2.安装node.js完成后打开cmd命令提示符: 出现版本号证明安装成功 3.cd到工程目录下 npm ...
- Linux 环境下umount, 报 device is busy 的问题分析与解决方法
在Linux环境中,有时候需要挂载外部目录或硬盘等,但当想umount时,却提示类似“umount:/home/oracle-server/backup:device is busy”这种提示. 出现 ...
- javascript 飞机大战完整代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- TCP学习总结(三)
TCP的流量控制 1.利用滑动窗口实现流量控制 所谓流量控制,就是让发送方的发送速率不要太快,要让接收方来得及接收.利用下图来说明如何利用滑动窗口机制进行流量控制: 一开始(connect后),B告诉 ...
- C++编程入门
学习一门新的程序设计语言的最好方法就是练习编写程序. 每个C++程序都包含一个或多个函数,其中一个必须命名为main.操作系统通过调用main来运行C++程序. 一个函数定义包含四个部分:返回类型:函 ...
- shell、redis使用
一.跳板机 来源:什么是跳板机 SSH[Secure Shell](远程连接工具)连接原理:ssh服务是一个守护进程(demon),系统后台监听客户端的连接,ssh服务端的进程名为sshd,负责实时监 ...
- 判断库中为字符串格式的时间是否为最近三个月(Java)
今天分享一个问题,就是标题中提到的问题,今天在调用一个接口的时候,发现调用到的数据的时间格式为字符串类型,我有点蒙圈,于是,我就百度解决了这个问题,同时在这里记录一下,为了之后不再蒙圈::: 首先需要 ...
- linux 配置ftp服务器
在Linux中搭建一个FTP服务器 [实现步骤] 1.检查安装vsftpd服务器 以root进入终端后(其他账户进入终端的可以用su root 输入密码后进入root 模式)之后,在终端命令窗口输入以 ...