一、功能描述:

可以创建节点并添加到链表中、查看链表中的所有节点、并可以删除特定的节点

二、代码实现

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语言)的更多相关文章

  1. 关于单链表的增删改查方法的递归实现(JAVA语言实现)

    因为在学习数据结构,准备把java的集合框架底层源码,好好的过一遍,所以先按照自己的想法把单链表的类给写出来了; 写该类的目的: 1.练习递归 2.为深入理解java集合框架底层源码打好基础 学习的视 ...

  2. Java描述数据结构之链表的增删改查

    链表是一种常见的基础数据结构,它是一种线性表,但在内存中它并不是顺序存储的,它是以链式进行存储的,每一个节点里存放的是下一个节点的"指针".在Java中的数据分为引用数据类型和基础 ...

  3. PHP数据库的 增 删 查

    一.匹配数据库登录 步骤: 1.做一个普通的登录界面,注意提交方式为post. <!--登录界面--> <form action="chuli.php" meth ...

  4. 史上最全单链表的增删改查反转等操作汇总以及5种排序算法(C语言)

    目录 1.准备工作 2.创建链表 3.打印链表 4.在元素后面插入元素 5.在元素前面增加元素 6.删除链表元素,要注意删除链表尾还是链表头 7.根据传入的数值查询链表 8.修改链表元素 9.求链表长 ...

  5. Java实现单向链表的增删改查

    class List<T> { private class Node { private T data; private Node next; private Node(T data) { ...

  6. WindowsForm 增 删 查 改

    首先是连接数据库  在数据库里写代码 建立一个数据库下面是代码 create database JinXiaoCun go use JinXiaoCun go create table users ( ...

  7. HBase java API 的使用范例(增,删,查,扫描)

    编辑pom.xml <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase ...

  8. 好用的SQL TVP~~独家赠送[增-删-改-查]的例子

    以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化.  本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...

  9. iOS FMDB的使用(增,删,改,查,sqlite存取图片)

    iOS FMDB的使用(增,删,改,查,sqlite存取图片) 在上一篇博客我对sqlite的基本使用进行了详细介绍... 但是在实际开发中原生使用的频率是很少的... 这篇博客我将会较全面的介绍FM ...

  10. iOS sqlite3 的基本使用(增 删 改 查)

    iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...

随机推荐

  1. 简单gitblit与Jenkins结合,持续集成

    gitblit是当作git服务器,也就是作为私有的代码仓库,用法类似于Github Jenkins 是自动构建工具,帮忙将仓库中的代码更新到服务器上.可以设置为定时自动构建. 详细摸索了我现在公司的用 ...

  2. python之django基础

    看了不是同一期的视频,发现9期老师线性引入的方式,讲得django更加易于理解掌握. 抱歉的是,笔记没有整理就发上来了.希望看到的人不要被我带偏. 1. 新建Django项目 命令行创建: djang ...

  3. db.properties是干什么用的

    连接池配置文件db.properties是java中采用数据库连接池技术完成应用对数据库的操作的配置文件信息的文件.具体配置项目如下:drivers=com.microsoft.sqlserver.j ...

  4. Java学习NO.2

    这是我学习Java的第二天 学习内容: 一.运算符 赋值运算符  语法:变量名=表达式 算数运算符  +  -  *  /  %  ++  --   +=  -=  *=  /=  %= 其中尤为要注 ...

  5. Graphics Class

    System.Drawing 封装一个 GDI+ 绘图图面. 此类不能被继承. https://docs.microsoft.com/zh-cn/dotnet/api/system.drawing.g ...

  6. 【4】数独(Sudoku Killer)(深度优先遍历)

    问题描述:给你多个数独题目,让你输出答案 思路:递归确定每一个‘?’的位置的值,直到所有‘?’都被确定.先将原字符数组转换为整型数组,‘?’由数字0代替,然后每一次层递归找到第一个0的位置,如果找到了 ...

  7. Ricker wavelet 简介

    本文依照参考文献简介 Ricker wavelet . 参考: [1] Frequency of the Ricker wavelet DOI: 10.1190/GEO2014-0441.1 [2] ...

  8. 中文dumps显示

    json.dumps(tuwen_attention_dict_set, ensure_ascii=False)

  9. 常用且难记的一些css

    1.多行文字超出隐藏,自动追加 ... 移动端兼容更好,pc下只能兼容 Safari.Opera 以及 Chrome 等部分浏览器,挺常用. (注:为什么要同时加这几个css不在这里详细叙述,详见) ...

  10. 使用ueditor配置后台接口

    因为后台是java,所以针对的是jsp版本的ueditor. 工程中需要导入jsp目录lib下的jar包.如果是maven管理的工程,可以导入jar包. 上传图片的功能的话,需要后台配置正确.如果需要 ...