您的位置:首页 > 其它

双向链表 – 信息管理

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表