前面的版本似乎没能让项目经理满意,他还希望这个链表有更多的功能;
我们接下来要解决几个比较简单的功能;
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-1]=' '; 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-1]=' '; printf("%s[%s]: ",timestr,tips); return ; } typedef struct person_ { int hight; int weight; char name[32]; }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 = 0; return lst; } void insert(Link_List * lst,void *data) { Node * new_node = create_node(data); if(lst->size == 0) { lst->tail = new_node; } new_node->next = lst->head; lst->head = new_node; lst->size++; } void travel(Link_List * root) { puts("----------------------------------------------------------"); printf("---------------------------------------------------------->>itmes[%d] ",root->size); if(root) { Node * we = root->head; while(we != NULL) { printf("Name:%s Hight:%d Weight:%d ",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) ",name); return NULL; } void node_detail(Node * node) { if(node) { puts("----------------------------------------------------------"); printf("Name:%s Hight:%d Weight:%d ",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 = { 60, 170, "Frank" }; Person b = { 70, 180, "Jack" }; Person c = { 80, 190, "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 = { 88,180,"Peter" }; Node * new_d = create_node(&d); append_after(root,new_d,result); travel(root); // test insert function Person e = { 77,170,"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 0; }
代码就这样啦哈!看看运行结果;
Discussion
故事总该结束啦!我知道项目经理的脾气;
他又不给涨工资,整天让我们加班;
我可受够啦!这个链表项目其实还有很多有趣的内容;
我其实是喜欢这份工作的,但是有时候心情不好;
就像是今天,本来想好好的写第4版的,结果只能大致略过啦很多细节;
不给内容不多,挺好理解,也希望大家原谅哈;
如果我还有机会的话会继续更新版本的;
我们还有,双向链表,循环链表,队列,栈要实现呢;
到时候,我们会充分利用起链表的各种特性;
See you !