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 ...
随机推荐
- 高版本Chrome不支持showModalDialog
高版本Chrome不支持window.showModalDialog,可用window.open代替 var url = "https://www.baidu.com"; var ...
- IntelliJ IDEA 16 本地LicenseServer激活(破解)
IntelliJ IDEA 16 本地LicenseServer激活(破解) IntelliJ IDEA 是Java开发利器,用社区版不爽,干催就用旗舰版,这个是收费的,需要licence. 网上找到 ...
- SAP 如何查看用户登录信息
1.首先进入事务代码 SM19 配置审计参数文件 2.选择客户端,用户名,并且勾选过滤激活之后点击细节配置,进入如下界面: 配置完成之后,点击保存. 3.并且可以进入SM20界面,选择要查看的客户端 ...
- 单片机TM4C123学习(七):I2C模块(温度传感器)
I2C(Inter Intergrated Circuit)总线是Philips公司推出的一种用于IC器件之间连接的二线制串行扩展总线,它通过两根信号线(SDA-串行数据线:SCL-串行时钟线)在连接 ...
- js之正则1
在看jquery的源码时,看到对$对象的init入口对参数解析时,正则的迷惑. 疑惑点:z = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/ a = ...
- IOS开发涉及有点概念&相关知识点
前言,IOS是基于UNIX的,用C/C+/OC直通系统底层,不想android有个jvm. 首先还是系统架构的分层架构 1.核心操作系统层 Core OS,就是内存管理.文件系统.电源管理等 2.核心 ...
- eclipse 相同变量高亮显示 颜色修改 变量着色
问题描述: 在eclipse中使用快捷键或其他原因,不小心按错了,使得变量的高亮显示没了. 1.简单的办法: 网上搜了一下,原来是Toggle Mark Occurrences (Al ...
- ytxgnopyvw
Rt.不是我的博客被盗了 而是我要测试一下某网站是自动抓取我的博客还是手动抓取. 如果是手动抓取,那么该网站的管理员一定会看见这篇博文, 希望管理员能够自己反省. ytxgn只是为了百度搜索方便罢了.
- hadoop2.0单机安装
hadoop发行的版本:apache hadoop;HDP;CDH -----这里只使用apache hadoop---可以在网站hadoop.apache.org网站上找到 hadoop安装方式:自 ...
- firame标签: IHTMLElement -> IHTMLFrameBase2 -> IHTMLWindow2 -> IHTMLDocument2 跨域访问
获得iframe标签的元素指针 CComPtr<IHTMLElement> spAdIframe = ... CComQIPtr<IHTMLFrameBase2> spFram ...