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

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

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 c libcurl的简单使用(转)

    curl是Linux下一个非常著名的下载库,通过这个库,可以很简单的实现文件的下载等操作.看一个简单的例子: #include <curl/curl.h> #include <std ...

  2. Convert HTML Entities

    function convert(str) { // :) //return str; var HTML_Entities = { '&':'&', '<':'<', '& ...

  3. hihocode 1077 : RMQ问题再临-线段树

    #1077 : RMQ问题再临-线段树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到:小Hi给小Ho出了这样一道问题:假设整个货架上从左到右摆放了N种商品,并 ...

  4. emacs windows 下配置

    一般windows的emacs是一个压缩包,解压一下,即可.主程序在bin文件夹下.需要设置一下emacs的home路径, 打开注册表,创建HKEY_LOCAL_MACHINE/SOFTWARE/GN ...

  5. SQL Server 建表语句

    IF EXISTS(SELECT * FROM sys.Tables WHERE name='stu_info')  DROP TABLE stu_infoGoCreate table stu_inf ...

  6. KMP算法(快速模式匹配)

    详细理解看这里:http://kb.cnblogs.com/page/176818/ 或者这里:http://blog.csdn.net/yutianzuijin/article/details/11 ...

  7. JS初级-作用域

    作用域:域:空间.范围.区域--作用:读.写    script        全局变量.全局函数        自上而下        函数        由里到外        {}    浏览器 ...

  8. Linux更改服务器Hostname

    在我们需要维护较多的服务器时,有意义的Hostname将时刻提醒我们这台服务器的功能. ****** 1.Debian echo '127.0.1.1 git-server' >> /et ...

  9. Java垃圾回收小结

    一.如何确定某个对象是“垃圾”? 首先要搞清一个最基本的问题:如果确定某个对象是“垃圾”?既然垃圾收集器的任务是回收垃圾对象所占的空间供新的对象使用,那么垃圾收集器如何确定某个对象是“垃圾”?—即通过 ...

  10. Attribute "lazy" with value "true" must have a value from the list "false proxy no-proxy "

    Hibernate 3.2 版本 当设置lazy="true"属性时,会产生该个异常: Attribute "lazy" with value "tr ...