一、功能描述:

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

二、代码实现

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. 音频播放器在chrome浏览器,play报错

    这个问题是谷歌浏览器的问题:https://www.oschina.net/news/96168/chrome-remove-the-autoplay-policy,可以查看这篇文章 如果你的版本没有 ...

  2. Js修改input值后怎么同步修改绑定的v-model值

    v-model只是一种语法糖,底层的方法还是去监听input事件.所以可以使用dispatchEvent事件给元素分配一个input事件,这样可以手动触发 inputElement 的 input 事 ...

  3. Java学习笔记(5)

    齿状二维数组的声明及使用 或者 int[][] triangleArray = new int[5][]; triangleArray[0] = new int[5]; triangleArray[1 ...

  4. grafana 安装配置

    Grafana安装配置 1.下载安装包 wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.1.3.l ...

  5. 在终端中使用vim命令修改某些文件,会提示文件只读模式,可以执行以下命令强制写入

    在末行模式中输入以下命令 :w !sudo tee % 回车后可能需要输入密码

  6. React native中使用XMLHttpRequest请求数据

    一.代码 import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, View } from ' ...

  7. SQL数据库中查询中加N'' 前缀是什么意思

    It's declaring the string as nvarchar data type, rather than varchar You may have seen Transact-SQL ...

  8. Linux命令基础2-ls命令

    本文介绍的是linux中的ls命令,ls的单词是list files的缩写,意思的列出目录文件. 首先我们在admin用户的当前路径,新建一个test的文件夹,为了方便本文操作和介绍,创建了不同文件类 ...

  9. webpack使用中遇到的问题

    http://ife.baidu.com/note/detail/id/534 https://blog.csdn.net/hreticent/article/details/80489851

  10. jQuery 追加元素、拼接元素的方法总结(append、html、insertBefore、before等)

    1. append & appendTo 的功能均为:在被选元素结尾(仍在元素内部)插入指定内容,但是内容和选择器的位置不同 (1) append()方法: $("#test&quo ...