c语言 之 双向链表 简单操作
2015-02-12 14:55
337 查看
==============================版权 所有 vevenlcf 梦想专栏 ==================================
/* * 双向链表的简单操作 * author: vevenlcf * created: 2015-02-12 14:54 pm */ #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX_NAME_LEN 255 int my_index = 1; typedef struct LIST { int id; char name[MAX_NAME_LEN]; struct LIST* next; struct LIST* pre; }LIST; typedef struct Node { LIST *head; LIST *tail; int list_size; }Node; typedef struct Name { int id; char name[MAX_NAME_LEN]; }Name; const Name name[] = { {1, "小飞"}, {2, "小名"}, {3, "小红"}, {4, "小方"}, {5, "大飞"} }; const char * Search_name(int id) { int i = 0; for(i; i<6; i++) { if(name[i].id == id) return name[i].name; } return NULL; } void LIST_INIT(Node** node) { if(NULL != *node) return ; Node *tmp_node = (Node*)malloc(sizeof(Node)); tmp_node->head = (LIST*)malloc(sizeof(LIST)); memcpy(tmp_node->head->name, "head", strlen("head")); tmp_node->head->id = 0; tmp_node->head->next = NULL; tmp_node->head->pre = NULL; tmp_node->tail = tmp_node->head; tmp_node->list_size= 1 ; *node = tmp_node; return ; } void create_node(LIST** pnode) { LIST* tmp_pnode = (LIST*)malloc(sizeof(LIST)); const char *sp_name = Search_name(my_index); if( NULL == sp_name) { memcpy(tmp_pnode->name, "NU::", strlen("NU::")); } else { memcpy(tmp_pnode->name, sp_name, strlen(sp_name)); } tmp_pnode->id = my_index; *pnode = tmp_pnode; my_index ++; return ; } // ==============================版权 所有 vevenlcf 梦想专栏 ================================== void ADD_NODE(Node* plist, LIST* pnode, void create_node(LIST** pnode)) { if(NULL == plist) return ; if(NULL == pnode) create_node(&pnode); if(NULL != pnode) { if(plist->head == plist->tail) { plist->tail = pnode; pnode->pre = plist->head; plist->head->next = pnode; pnode->next = NULL; } else { LIST* tmp = plist->tail; pnode->next = tmp->next; pnode->pre = tmp; tmp->next = pnode; plist->tail = pnode; } plist->list_size ++; } } //在指定的id处 插入 对应的值 int insert_data(Node* plist, LIST* pnod) { if(NULL == plist || NULL == pnod) return 0; int id = pnod->id; LIST *tmp, *swap; tmp = plist->tail; if(tmp->id < id) { pnod->next = tmp->next; pnod->pre = tmp; tmp->next = pnod; plist->tail = pnod; plist->list_size++; return 1; } else { if((NULL == tmp->pre) && (plist->list_size == 1)) { pnod->next = tmp; pnod->pre = tmp->pre; tmp->pre = pnod; plist->head = pnod; plist->list_size++; return 1; } while(tmp->pre != NULL) { if((tmp->pre->id < id) && (tmp->id > id)) { pnod->pre = tmp->pre; pnod->next = tmp; tmp->pre->next = pnod; tmp->pre = pnod; plist->list_size++; return 1; } tmp = tmp->pre ; } } return 0; } // 搜索指定 位置的名字 char* SEARCH_ID(Node* node, int id) { if(NULL == node) return; LIST* tmp = node->head; while(tmp) { if(tmp->id == id) return tmp->name; else tmp = tmp->next; } return NULL; } //修改 指定位置的值 void UPDATE_ID(Node* node, int id, char* up_name) { if(NULL == node) return; LIST* tmp = node->head; while(tmp) { if(tmp->id == id) { memset(tmp->name, 0, sizeof(tmp->name)); memcpy(tmp->name, up_name, strlen(up_name)); tmp->name[strlen(up_name)] ='\0'; } tmp = tmp->next; } return ; } //删除指定id 处 的 节点 char* DELETE_ID(Node* node, int id) { if(NULL == node) return ; LIST* tmp = node->head; while(tmp) { if(tmp->id == id) { //这边仅仅 做一个中间位置的处理两边的话比较简单 tmp->pre->next = tmp->next; tmp->next->pre = tmp->pre; node->list_size--; } tmp = tmp->next; } } void FREE_LIST(Node* node) { if(NULL == node) return ; LIST* tmp = node->head; while(NULL != tmp) { tmp = tmp->next; free(tmp); node->list_size --; printf("%2d ", node->list_size); } printf("\n"); return ; } void TR***EL_LIST(Node* node) { if(NULL == node || NULL == node->head || NULL == node->tail || 0 == node->list_size) return ; LIST* tmp_node = node->tail; while(tmp_node) { printf("id=%d, name=%s\n", tmp_node->id, tmp_node->name); tmp_node = tmp_node->pre; } } int main() { Node* node = NULL; LIST_INIT(&node); TR***EL_LIST(node); //从尾部添加 int i =0; for(i; i< 6; i++) { LIST* tmp = NULL; ADD_NODE(node, tmp, create_node); } TR***EL_LIST(node); printf("====================\n"); //将id 插入特定位置 // INSERT_NODE(node, id); LIST* pnode = (LIST*)malloc(sizeof(LIST)); pnode->id = 9; memcpy(pnode->name, "2222", strlen("2222")); insert_data(node, pnode); LIST* pnode2 = (LIST*)malloc(sizeof(LIST)); pnode2->id = 8; memcpy(pnode2->name, "2222", strlen("2222")); insert_data(node, pnode2); LIST* pnode3 = (LIST*)malloc(sizeof(LIST)); pnode3->id = 7; memcpy(pnode3->name, "2222", strlen("2222")); insert_data(node, pnode3); LIST* pnode4 = (LIST*)malloc(sizeof(LIST)); pnode4->id = -1; memcpy(pnode4->name, "99999", strlen("22222")); insert_data(node, pnode4); TR***EL_LIST(node); printf("==================\n"); //搜索 char *sp = SEARCH_ID(node, 2); printf("Search name = %s\n", sp); //删除 DELETE_ID(node, 2); TR***EL_LIST(node); printf(":----------------------\n"); //修改值 UPDATE_ID(node, 7, "小狗"); UPDATE_ID(node, 8, "小猪"); UPDATE_ID(node, 9, "小猫"); TR***EL_LIST(node); printf("--------==================\n"); //释放 FREE_LIST(node); TR***EL_LIST(node); return 0; } // ==============================版权 所有 vevenlcf 梦想专栏 =========================
相关文章推荐
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
- (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作
- (C++版)链表(三)——实现双向链表的创建、插入、删除等简单操作
- 【数据结构与算法】(二) c 语言链表的简单操作
- (C++版)链表(四)——实现双向循环链表创建、插入、删除等简单操作
- C++ 双向链表的简单操作
- 双向链表的简单操作
- 详谈双向链表的实现与简单操作
- 双向链表的简单操作
- 双向链表简单操作
- 【数据结构与算法】(二) c 语言链表的简单操作
- c语言描述的双向链表的基本操作
- 双向链表的简单操作
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
- 双向链表的简单操作
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
- (C++版)链表(四)——实现双向循环链表创建、插入、删除等简单操作
- (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作
- C语言实现双向链表的基本操作
- BNUOJ 26182 -----------Army Buddies 用结构体 仿双向链表的简单操作