C语言实现单链表-04版
前面的版本似乎没能让项目经理满意,他还希望这个链表有更多的功能;
我们接下来要解决几个比较简单的功能;
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版的更多相关文章
- C语言实现单链表-03版
在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4, ...
- C语言实现单链表-02版
我们在C语言实现单链表-01版中实现的链表非常简单: 但是它对于理解单链表是非常有帮助的,至少我就是这样认为的: 简单的不能再简单的东西没那么实用,所以我们接下来要大规模的修改啦: Problem 1 ...
- C语言实现单链表-01版
单链表的应用非常广,它可以实现栈,队列等: Problem 我对学习任何东西都希望能找到尽可能简单的例子,而不是看起来好高大上的: 对链表这样简答的数据结构,有些书也是写得太过“完美”啦: 初学者很难 ...
- C语言实现单链表,并完成链表常用API函数
C语言实现单链表,并完成链表常用API函数: 1.链表增.删.改.查. 2.打印链表.反转打印.打印环形链表. 3.链表排序.链表冒泡排序.链表快速排序. 4.求链表节点个数(普通方法.递归方法). ...
- C语言实现单链表节点的删除(带头结点)
我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https: ...
- C/C++语言实现单链表(带头结点)
彻底理解链表中为何使用二级指针或者一级指针的引用 数据结构之链表-链表实现及常用操作(C++篇) C语言实现单链表,主要功能为空链表创建,链表初始化(头插法),链表元素读取,按位置插入,(有序链表)按 ...
- 「C语言」单链表/双向链表的建立/遍历/插入/删除
最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合, ...
- 一起talk C栗子吧(第十二回:C语言实例--单链表一)
各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子.也就是C语言实例.闲话休提, 言归正转. 让我们一起talk C栗子吧! 看官们,上一回中咱们没有说详细的样例,并且是说了样例中的文 ...
- C语言实现单链表(不带头结点)节点的插入
对单链表进行增删改查是最主要的操作.我在上一篇博客<C语言实现链表节点的删除>实现了删除单链表中的某个节点. 这里我们要来实如今某个位置插入节点.演示样例代码上传至https://gith ...
随机推荐
- 慕课网JavaScript入门篇课程笔记
1.js注释很重要 单行注释,在注释内容前加符号 “//”. <script type="text/javascript"> document.write(" ...
- vim--golang代码补全
我想说,我折腾了很久编辑器,试了九种办法 最后我只成功了一种 但我依然想就我混乱的逻辑做下整理 一.一开始,我试图入手ipad编码软件,大概9美金吧,叫Textastic.我试图用它的近亲来试验Tex ...
- 附12 grafana配置文件
一.配置文件位置 /usr/local/opt/grafana/share/grafana/default.ini /usr/local/etc/grafana/grafana.ini 二.init格 ...
- Kindeditor为什么提交后获取不到值
LinkButton不是表单提交方式所以获取不到.如果用button submit提交方式就是form提交方式后台就能获取到值 取得编辑器的HTML内容.KindEditor的可视化操作在新创建的if ...
- 使用apache和htaccess对目录访问设置密码保护配置教程
对目录设置密码保护配置说明我们有时候访问某些网站的时候,要求输入用户名和密码才能访问.这是为了保护隐私,只让经过许可的人访问.在本教程中主要介绍两种方法,一种是通过apache httpd.conf配 ...
- 重写,重载,super,this,继承
重写:overwrite/override 子类根据需要对从基类继承来的方法进行重写. 重写方法必须与被重写方法有相同的方法名,参数列表和返回类型. 重写方法不能使用比被重写方法更严格的访问权限. 重 ...
- QEMU中smp,socket,cores,threads几个参数的理解
在用QEMU创建KVM guest的时候,为了指定guest cpu资源,用到了-smp, -sockets, -cores, -threads几个参数, #/usr/bin/qemu-system- ...
- FreeBSD_11-系统管理——{Part_6 - SYSCTL}
sysctl 常见参数 Name Type Changeable 示例 & 示意 kern.ostype string no FreeBSD kern.osrelease string no ...
- RVM 实用指南
rvm是一个命令行工具,可以提供一个便捷的多版本ruby环境的管理和切换. https://rvm.io/ 如果你打算学习ruby/rails, rvm是必不可少的工具之一. 这里所有的命令都是再用户 ...
- oracle添加和查看注释
1.给表加注释 COMMENT ON TABLE TABLENAME IS '用户表'; 2.查看表的COMMENT SELECT * FROM USER_TAB_COMMENTS WHERE TAB ...