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 ...
随机推荐
- nginx 设置反响代理实现nginx集群
ginx.conf: worker_processes 1; events { worker_connections 1024; } http { include mime.types ...
- URLConnection 和 HttpClients 发送请求范例
. java.net.URLConnection package test; import java.io.BufferedReader; import java.io.IOException; im ...
- oracle全文检索
全文检索 oracle对使用几十万以上的数据进行like模糊查询速度极差,包括 like 'AAA%' ,like '%AAA',like '%AAA%',like '%A%A%'的那些模糊查询.网上 ...
- POJ 1661 Help Jimmy LIS DP
http://poj.org/problem?id=1661 对板按高度排序后. dp[i][0]表示现在站在第i块板上,向左跑了,的状态,记录下时间和其他信息. O(n^2)LIS: 唯一的麻烦就是 ...
- 第二章 DateTime工具类
项目中经常需要将DateTime转化成各种格式的String类型,或将各种类型的String转为DateTime类型. 本文提供一个DateTime与String的转换工具类: import org. ...
- linux系统中scp命令的用法(Permission denied排错二例)
原文链接: 这里需要注意,当往远程主机拷文件时,必须当前用户对远程主机的对应目录具有写权限 http://www.360doc.com/content/13/0929/13/6496277_31784 ...
- 使用PreTranslateMessage替代钩子函数处理键盘消息
2002年左右,我所在公司在开发基于H.323的VoIP电话系统(用了以色列一家公司的库,具体名字忘记了). 去电信科技研究院测试系统,同事发现处理键盘消息总有一些莫名其妙的问题,比如延迟或异常. 我 ...
- VB6.0和VB.Net的函数等对照表
VB6.0和VB.Net的对照表 VB6.0 VB.NET AddItem Object名.AddItem Object名.Items.Add ListBox1.Items.Add ComboBox1 ...
- StringGrid 实例1:初始化StirngGrid的首行和首列
实例1:初始化StirngGrid的首行和首列
- 【使用git】初识git
0. 版本控制 版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修改情况的系统(vcs). svn等是集中式版本控制,即服务器在单一机器上,每次checkout变化的文件,若机器故障,则有可能 ...