双向链表 – 信息管理
2017-07-29 10:23
120 查看
学习双向循环链表的使用
功能: 录入ID号和名字(id不重复),实现后续查看,查找,删除,插入,销毁操作实现: 1个结构体类型,8个链表操作函数,5个功能函数,主函数。主函数调用功能函数 ,功能函数调用链表基本操作函数
节点设计
typedef struct dclink { int id; // id号 char name[20]; // 名字 struct dclink *prev; // 前驱 struct dclink *next; // 后驱 }DClink; // 节点类型名
功能能函数实现方法
主函数:int main(int argc, char **argv) { * 初始化获得头结点:init_dclik(); * 根据输入case 相应功能函数: }
输入:
void input_inform(DClink *head) { * 输入录入个数; * 当小于个数循环 * 输入 ID,nme; * 查找id是否重复:search_dclink(head, id) * 新建节点:create_dclik(id, name) * 插入节点:insert_dclink(head, new); }
显示:
void show_inform(DClink *head) { * 要求链表节点个数非0:count_dclink(head) * 遍历显示链表:show_dclink(head); }
查找:
void find_inform(DClink *head) { * 要求链表节点个数非0:count_dclink(head) * 查找输入id:search_dclink(head, id); * 存在则printf }
删除:
void delet_inform(DClink *head) { * 要求链表节点个数非0:count_dclink(head) * 查找输入id:search_dclink(head, id); * 存在则移除相应节点:delete_dclink(p); * 释放节点free }
插入:
void insert_inform(DClink *head) { * 要求链表节点个数非0:count_dclink(head) * 输入id(在该id前插) * 查id存在:search_dclink(head, tmp); * 输入 ID,nme; * 查找id是否重复:search_dclink(head, id) * 新建节点:create_dclik(id, name) * 插入节点:insert_dclink(head, new); }
链表基本操作函数解析
初始化空链表:DClink *init_dclik() { * 成功malloc节点head * 不包含数据,且前驱、后驱都指向自己: head->prev = head->next = head; * 返回该节点 }
新建节点:
DClink *create_dclik(int id, char *name) { * 成功malloc节点head * 赋值,前驱、后驱都指向自己:head->prev = head->next = head; * 返回该节点 }
插入节点:
// head 前插入new bool insert_dclink(DClink *head, DClink *new) { * 1>结点new自己靠上去 new->prev = head->prev; // 新节点前驱 接到head的前驱 new->next = head; // 新节点的后驱,指向head * 2>断开旧关系迎接新成员 head->prev->next = new; // 让旧前驱节点的下一个指向新成员 head->prev = new; // head 前驱指向新成员 }
遍历节点:
void show_dclink(DClink *head) { DClink *p = head->next; // 获得第一个节点 while(p != head) // 循环一轮时头不是NULL { printf("%d\t%s\n", p->id, p->name); p = p->next; // p等于p的下一个,循环遍历 } }
查找节点:
DClink *search_dclink(DClink *head, int id) { * 获得第一个节点:p = head->next; * 当p 不等于头节点时, { 有相等数据,返回节点 否则继续遍历p = p->next } }
删除节点:
DClink *delete_dclink(DClink *p) { * 1>开除节点 p->next->prev = p->prev; p->prev->next = p->next; * 2>断掉还插进来的脚 p->prev = p->next = p; return p; // 并不就释放掉,而是返回开除节点,该节点某些情况下还可以在利用 }
销毁链表:
DClink *destroy_dclink(DClink *head) { DClink *p = head->prev, *q; // 获得第一个节点 while(p != head) // 遍历没到一个周期 { q = p->prev; // 记录待销毁前一个 delete_dclink(p); // 移除 free(p); // 释放 p = q; // 前移 } return head; // 返回空链表 }
节点计数:
int count_dclink(DClink *head) { * 头节点开始,下一个不等于头,个数加一 }
主要知识点
链表结点设计链表节点的插入
链表结点的移除
代码贴
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> typedef struct dclink { int id; char name[20]; struct dclink *prev; struct dclink *next; }DClink; DClink *init_dclik() { DClink * head = (DClink *)malloc(sizeof(DClink)); if(head != NULL) { head->prev = head->next = head; return head; } } DClink *create_dclik(int id, char *name) { DClink * head = (DClink *)malloc(sizeof(DClink)); if(head != NULL) { head->id = id; strcpy(head->name, name); head->prev = head->next = head; return head; } } bool insert_dclink(DClink *head, DClink *new) { new->prev = head->prev; new->next = head; head->prev->next = new; head->prev = new; return true; } void show_dclink(DClink *head) { DClink *p = head->next; while(p != head) // 循环一轮时头不是NULL { printf("%d\t%s\n", p->id, p->name); p = p->next; } } DClink *search_dclink(DClink *head, int id) { DClink *p = head->next; while(p != head) { if(p->id == id) return p; p = p->next; } return NULL; } DClink *delete_dclink(DClink *p) { p->next->prev = p->prev; p->prev->next = p->next; p->prev = p->next = p; return p; } DClink *destroy_dclink(DClink *head) { DClink *p = head->prev, *q; while(p != head) { q = p->prev; delete_dclink(p); free(p); p = q; } return head; } int count_dclink(DClink *head) { int count = 0; DClink *p = head; if(p->next != head) count++; return count; } void input_inform(DClink *head) { int n = 0, number, id; char name[20]; DClink *ret; printf("** Enter the number of: "); scanf("%d", &number); while(n<number) { printf("** please enter <id>,<name> : "); scanf("%d,%s", &id, name); if((ret = search_dclink(head, id)) != NULL) { printf("!! repeat. Please enter again.\n"); continue; } insert_dclink(head, create_dclik(id, name)); n++; } printf("\n"); } void show_inform(DClink *head) { if(!count_dclink(head)) { printf("No member of the !\n"); return ; } printf("-----------------------------\n"); show_dclink(head); printf("-----------------------------\n"); printf("\n"); } void find_inform(DClink *head) { if(!count_dclink(head)) { printf("No member of the !\n"); return ; } int id; printf("** Please enter the find_id: "); scanf("%d", &id); DClink *p = search_dclink(head, id); if(p != NULL) printf("- [%d] [%s]\n", p->id, p->name); printf("\n"); } void delet_inform(DClink *head) { if(!count_dclink(head)) { printf("No member of the !\n"); return ; } int id; printf("** Please enter the delet_id: "); scanf("%d", &id); DClink *p = search_dclink(head, id); if(p != NULL) { DClink *q = delete_dclink(p); free(q); printf("delete[%d] success.\n", id); } printf("\n"); } void insert_inform(DClink *head) { if(!count_dclink(head)) { printf("No member of the !\n"); return ; } int id, tmp; char name[20]; DClink *ret, *tmpp; printf("** please enter In id before : "); scanf("%d", &tmp); if(tmpp = search_dclink(head, tmp) != NULL) while(1) { printf("** please enter <id>,<name> : "); scanf("%d,%s", &id, name); if((ret = search_dclink(head, id)) != NULL) { printf("!! repeat. Please enter again.\n"); while(getchar()!='\n'); continue; } insert_dclink(tmpp, create_dclik(id, name)); break; } printf("\n"); } int main(int argc, char **argv) { DClink *head = init_dclik(); char n; printf("[1. input]\n"); printf("[2. show ]\n"); printf("[3. find ]\n"); printf("[4. delet]\n"); printf("[5. inser]\n"); printf("[6. destr]\n"); while(1) { printf("** Please select a: "); scanf("%c", &n); switch(n) { case '1': input_inform(head); break; case '2': show_inform(head); break; case '3': find_inform(head); break; case '4': delet_inform(head); break; case '5': insert_inform(head); break; case '6': destroy_dclink(head); break; default: destroy_dclink(head); free(head); printf("GO OUT\n"); return 0; } while(getchar()!='\n'); } return 0; }
相关文章推荐
- 一个简单的学生信息管理系统(循环双向链表)
- C语言的指针、链表的原理和各类操作以及学生信息管理系统改进报告
- 基于链表的学生信息管理系统和基于MySQL的学生信息管理系统 -C语言
- 用文件和链表实现学生信息管理
- c++封装链表实现-->学生信息管理分析系统
- 信息管理系统链表实现CRUD
- 单链表+学生信息管理系统
- c语言学生信息管理系统(链表、文件)
- 链表文件结构体操作例子(员工信息管理系统)
- 就C语言的指针、链表的原理和各类操作撰写一篇技术博客,说说自己学习C语言指针和链表的体会,并将学生信息管理系统进行修改,使能完成其他的功能,并撰写体会,附加源代码。
- 单向无头链表-学生信息管理系统
- 数据结构之链表管理学生信息
- c语言学生信息管理系统(基于文件、链表)
- C语言学生信息管理系统(动态链表版559)【不会】
- C语言使用链表实现学生信息管理系统
- C语言学生信息管理系统 (单链表版)【无图,未调试】
- 基于双向循环链表的学生管理系统
- 链表做的学生信息管理系统
- 学生信息管理系统-顺序表&&链表(数据结构第一次作业)
- 学生信息管理系统 输入和输出 链表