前面的版本似乎没能让项目经理满意,他还希望这个链表有更多的功能;

我们接下来要解决几个比较简单的功能;

Problem

1,更加友好的显示数据;

2,能够通过名字删除节点;

Solution

首先我们编写一个简单的提示信息的函数;

void when(char * tips){
time_t rawtime;
struct tm* timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
char * timestr = asctime(timeinfo);
int len = strlen(timestr);
timestr[len-]='\t';
printf("%s[%s]: ",timestr,tips);
return ;
}

为啦使when成功的调用时间函数,你需要引入如下头文件;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

接下来,我们接编写这个版本的主角函数;

void delete_by_name(Link_List * lst, char *name)
{
Node * target = lst->head;
Node * tmp = target; if(!strcmp(lst->head->data->name,name)){
lst->head = lst->head->next;
//free(target);
when("INFO");
puts("Delete successful");
lst->size--;
return ;
} while (target != NULL ){
if(!strcmp(target->data->name,name)) {
tmp->next = target->next;
free(target);
when("INFO");
puts("Delete successful");
lst->size--;
return ;
}
tmp = target;
target = target->next;
}
when("ERROR");
puts("Cannot delete it ");
return ;
}

通过查询相应的名字,然后删除该节点;

实现的方式可能有更加简单的,这里我们只是自己的一种即兴写法;

没有论证过什么时间,空间复杂度;

细心的话可能会发现我的内存有严重泄漏问题;

如果继续版本更新的话我会解决的;

好啦!,说说这个函数其实很简单,首先判断节点是否为链表头部节点;

如果是,那么让链表直接指向下一个节点,忽略它;(issue code)

我说issue code通常表明这里存在问题,日后再解决;

第二部分,进行遍历,发现就进行跳过处理;

接下来我们直接给出所有代码啦:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h> void when(char * tips){
time_t rawtime;
struct tm* timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
char * timestr = asctime(timeinfo);
int len = strlen(timestr);
timestr[len-]='\t';
printf("%s[%s]: ",timestr,tips);
return ;
} typedef struct person_ {
int hight;
int weight;
char name[];
}Person; typedef struct node_ {
Person *data;
struct node_ * next;
}Node; typedef struct link_list_ {
Node * head;
Node * tail;
int size;
}Link_List; Node * create_node(void *data)
{
Node * tmp = (Node*)malloc(sizeof(Node));
if(tmp) {
tmp->data = data;
tmp->next = NULL;
}
return tmp;
} Link_List * init_list(void)
{
Link_List * lst = (Link_List*)malloc(sizeof(Link_List));
lst->head = lst->tail = NULL;
lst->size = ;
return lst;
}
void insert(Link_List * lst,void *data)
{
Node * new_node = create_node(data);
if(lst->size == ) {
lst->tail = new_node;
}
new_node->next = lst->head;
lst->head = new_node;
lst->size++;
} void travel(Link_List * root)
{
puts("----------------------------------------------------------");
printf("---------------------------------------------------------->>itmes[%d]\n",root->size);
if(root) {
Node * we = root->head;
while(we != NULL) {
printf("Name:%s\t\tHight:%d\t\tWeight:%d\n",we->data->name,we->data->hight,we->data->weight);
we = we->next;
}
}
puts("----------------------------------------------------------");
return ;
} Node * search_by_name(Link_List * lst, char * name)
{
Node * target = lst->head;
while (target != NULL ){
if(!strcmp(target->data->name,name)) {
when("INFO");
puts("Fount it");
return target;
}
target = target->next;
}
when("WARNING");
printf("Cannot Found (%s)\n",name);
return NULL;
} void node_detail(Node * node)
{
if(node) {
puts("----------------------------------------------------------");
printf("Name:%s\t\tHight:%d\t\tWeight:%d\n",node->data->name,node->data->hight,node->data->weight);
puts("----------------------------------------------------------");
}
return ;
}
void append_after(Link_List * lst, Node * new,Node * old)
{
Node * target = lst->head;
while(target != NULL){
if(target == old){
new->next = old->next;
old->next = new;
when("INFO");
puts("Append successful");
lst->size++;
return ;
}
target = target->next;
}
return ;
} void insert_before(Link_List *lst, Node * new, Node * old)
{
Node * target = lst->head;
while(target->next != NULL){
if(target->next == old){
new->next = target->next;
target->next = new;
when("INFO");
puts("Insert successful");
lst->size++;
return ;
}
target->next = target->next->next;
}
return ;
} void delete_by_name(Link_List * lst, char *name)
{
Node * target = lst->head;
Node * tmp = target; if(!strcmp(lst->head->data->name,name)){
lst->head = lst->head->next;
//free(target);
when("INFO");
puts("Delete successful");
lst->size--;
return ;
}
while (target != NULL ){
if(!strcmp(target->data->name,name)) {
tmp->next = target->next;
free(target);
when("INFO");
puts("Delete successful");
lst->size--;
return ;
}
tmp = target;
target = target->next;
}
when("ERROR");
puts("Cannot delete it ");
return ;
} int main(void)
{
Link_List * root = init_list(); Person a = { , , "Frank" };
Person b = { , , "Jack" };
Person c = { , , "Landpack" }; insert(root,&a);
insert(root,&b);
insert(root,&c); //test travel function
travel(root);
// test search node
Node * result = search_by_name(root,"Jack");
node_detail(result); search_by_name(root,"NoName");
// test append function
Person d = { ,,"Peter" };
Node * new_d = create_node(&d);
append_after(root,new_d,result);
travel(root); // test insert function
Person e = { ,,"Sap" };
Node * new_e = create_node(&e);
insert_before(root,new_e,result);
travel(root); delete_by_name(root,"Landpack");
travel(root);
delete_by_name(root,"Frank");
travel(root);
delete_by_name(root,"Sap");
travel(root); return ;
}

代码就这样啦哈!看看运行结果;

Discussion

故事总该结束啦!我知道项目经理的脾气;

他又不给涨工资,整天让我们加班;

我可受够啦!这个链表项目其实还有很多有趣的内容;

我其实是喜欢这份工作的,但是有时候心情不好;

就像是今天,本来想好好的写第4版的,结果只能大致略过啦很多细节;

不给内容不多,挺好理解,也希望大家原谅哈;

如果我还有机会的话会继续更新版本的;

我们还有,双向链表,循环链表,队列,栈要实现呢;

到时候,我们会充分利用起链表的各种特性;

See you !

C语言实现单链表-04版的更多相关文章

  1. C语言实现单链表-03版

    在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4, ...

  2. C语言实现单链表-02版

    我们在C语言实现单链表-01版中实现的链表非常简单: 但是它对于理解单链表是非常有帮助的,至少我就是这样认为的: 简单的不能再简单的东西没那么实用,所以我们接下来要大规模的修改啦: Problem 1 ...

  3. C语言实现单链表-01版

    单链表的应用非常广,它可以实现栈,队列等: Problem 我对学习任何东西都希望能找到尽可能简单的例子,而不是看起来好高大上的: 对链表这样简答的数据结构,有些书也是写得太过“完美”啦: 初学者很难 ...

  4. C语言实现单链表,并完成链表常用API函数

    C语言实现单链表,并完成链表常用API函数: 1.链表增.删.改.查. 2.打印链表.反转打印.打印环形链表. 3.链表排序.链表冒泡排序.链表快速排序. 4.求链表节点个数(普通方法.递归方法). ...

  5. C语言实现单链表节点的删除(带头结点)

    我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https: ...

  6. C/C++语言实现单链表(带头结点)

    彻底理解链表中为何使用二级指针或者一级指针的引用 数据结构之链表-链表实现及常用操作(C++篇) C语言实现单链表,主要功能为空链表创建,链表初始化(头插法),链表元素读取,按位置插入,(有序链表)按 ...

  7. 「C语言」单链表/双向链表的建立/遍历/插入/删除

    最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合, ...

  8. 一起talk C栗子吧(第十二回:C语言实例--单链表一)

    各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子.也就是C语言实例.闲话休提, 言归正转. 让我们一起talk C栗子吧! 看官们,上一回中咱们没有说详细的样例,并且是说了样例中的文 ...

  9. C语言实现单链表(不带头结点)节点的插入

    对单链表进行增删改查是最主要的操作.我在上一篇博客<C语言实现链表节点的删除>实现了删除单链表中的某个节点. 这里我们要来实如今某个位置插入节点.演示样例代码上传至https://gith ...

随机推荐

  1. Linux系统常见的压缩与打包

    1.gzip, zcat [root@linux ~]# gzip [-cdt#] 檔名参数: -c  :将压缩的数据输出到屏幕上,可透过数据流重导向来处理: -d  :解压缩的参数: -t  :可以 ...

  2. IE调试网页之四:F12 开发人员工具控制台错误消息 (Windows)(转载)

    F12 工具控制台可以报告在运行时期间发生的错误和信息消息.本文将介绍错误消息,并提供有关如何修正这些错误的建议. 简介 F12 工具控制台错误消息提供了一些代码(例如,SEC7111 或 HTML1 ...

  3. docker--wekan安装

    最近因为搭建开源看板网站的需要,玩了下docker 一开始在redhat上安装docker wget http://mirrors.163.com/.help/CentOS7-Base-163.rep ...

  4. linux学习之——学习路线(摘抄)

    摘抄某笔者的Linux练习的道路图(rolistingmap): 对比一下为什么要学习linux 了解Linux的基础常识,这些包括了用户管理.群组的概念.权限的观念等 掌握至多50个以上的常用命令 ...

  5. MVC5+EF6 简易版CMS(非接口) 第三章:数据存储和业务处理

    目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...

  6. Training Deep Neural Networks

    http://handong1587.github.io/deep_learning/2015/10/09/training-dnn.html  //转载于 Training Deep Neural ...

  7. 使用事件等待句柄EventWaitHandler 实现生产者、消费者队列

    using System; using System.Threading; using System.Collections.Generic; class ProducerConsumerQueue ...

  8. struts的DevMode模式

    在实际应用开发或者是产品部署的时候,对应着两种模式:开发模式(devMode):此时 DevMode=ture: 产品模式(proMode):此时  DevMode=false: 在一些服务器或者框架 ...

  9. 《UML大战需求分析》阅读笔记3

    流程分析利器--活动图 活动图属于行为建模的一种.用来分析的不是系统中的某个属性,而是系统或是其中某个部分的活动.结构建模表达的是静态内容,行为建模表达的是动态内容. 在介绍活动图之前,先介绍一下行为 ...

  10. IOS学习笔记之关键词@dynamic

    IOS学习笔记之关键词@dynamic @dynamic这个关键词,通常是用不到的. 它与@synthesize的区别在于: 使用@synthesize编译器会确实的产生getter和setter方法 ...