一、功能描述:

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

二、代码实现

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. css设置垂直居中方式总结

    方式1:flex布局,display:flex;align-items:center <!DOCTYPE html> <html lang="en"> &l ...

  2. 判断一个js对象是否是Array

    今天在做题时遇到这个问题,找答案的时候,发现评论里大神好多 . 在开发中,我们经常需要判断某个对象是否为数组类型,总结判断某个对象是否是数组的方法. 1.typeof 操作符 对于Function, ...

  3. 给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)

    """ #给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 #返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况) 解题思路: 1.设定一个 ...

  4. c++ string 转double

    #include <iostream>#include <sstream> //使用stringstream需要引入这个头文件using namespace std; Type ...

  5. LOJ 10002 喷水装置 未完

    #include<bits/stdc++.h> using namespace std; int T,n,l,w; ; struct S{ double s,t; }a[maxn]; bo ...

  6. 小学生噩梦——四则运算题库(python 全功能实现)

    Github: https://github.com/holidaysss 小组:龙天尧(代码实现),林毓植(浮点转分数函数,代码审查) PSP2.1 Personal Software Proces ...

  7. git教程:撤销修改

    转载:撤销修改 自然,你是不会犯错的.不过现在是凌晨两点,你正在赶一份工作报告,你在readme.txt中添加了一行: $ cat readme.txt Git is a distributed ve ...

  8. UGUI学习——Canvas基础组件

    UGUI的分辨率自适应的机制 UGUI中,Canvas(画布)可以看成电脑屏幕,其功能和属性都是一样的.游戏中的分辨率自适应主要包括两部分: 1. 缩放适应:是在不同尺寸的屏幕下,整体缩放比例的计算方 ...

  9. Django连接oracle数据库的那些问题

    环境: windows 7 64位 python 3.6.5 32位 oracle客户端11.2 32位 django1.11.20 (django2.x版本不支持oracle客户端11g了) cx_ ...

  10. collections&time&random模块

    一.collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdic ...