<数据结构与算法>单向循环链表基本框架(C语言描述)

来源:互联网 发布:php完全自学手册出版地 编辑:程序博客网 时间:2024/05/16 09:37
/**单向循环链表基本框架*作者:wsg*2017年8月28日*/#include <stdio.h>#include <stdlib.h>#include <stdbool.h>//颜色控制#define BGC_RED "\033[41m"#define BGC_GREEN "\033[42m"#define EPT_COL "\033[0m"typedef int datatype;//单向循环链表的结构体typedef struct node{datatype data;  //数据struct node *next; //后趋指针}singly_linked_circle_list, *slc_list;//1.初始化,创建只含指针的头结点slc_list init_list(void){ slc_list mylist = malloc(sizeof(struct node)); if(mylist != NULL) { //指针指向自己 mylist->next = mylist; } return mylist;}//2.判断链表是否为空bool is_empty(slc_list mylist){return mylist->next == mylist;}//3.新建节点slc_list creat_node(datatype data){slc_list new_node = malloc(sizeof(struct node));if(new_node != NULL){new_node->data = data;new_node->next = NULL;}return new_node;}//4.插入节点void insert_node(slc_list head, slc_list new){slc_list p = head;if(new == NULL){return;}while(p->next != head){p = p->next;}new->next = head;p->next = new;printf(""BGC_GREEN"%d插入成功!"EPT_COL"\n", new->data);}//5.遍历链表void display_node(slc_list head){if(is_empty(head)){printf(""BGC_RED"链表为空!"EPT_COL"\n");return;}slc_list p = head;while(p->next != head){p = p->next;printf("%d\t", p->data);}printf("\n");}//5.查找节点void find_node(slc_list head, datatype data){if(is_empty(head)){printf(""BGC_RED"链表为空!"EPT_COL"\n");return;}slc_list p = head; //从头结点开始查找while(p->next != head) //for(p = head; p->next != NULL; p = p->next){if(p->next->data == data){printf(""BGC_GREEN"找到了!该节点数据为:%d"EPT_COL"\n", p->next->data);return;}/* else{p = p->next;} */p = p->next;  }printf(""BGC_RED"找不到数据为%d这个节点!"EPT_COL"\n", data);}//6.删除节点void delete_node(slc_list head, datatype data){//先判断链表是否为空,是空链表就退出此函数if(is_empty(head)){printf(""BGC_RED"链表为空!"EPT_COL"\n");return;}slc_list p = head; //从头节点开始查找while(p->next != head){if(p->next->data == data){slc_list q = p->next;p->next = q->next;q->next = NULL;free(q); //将q所占空间释放掉printf(""BGC_GREEN"节点为%d的节点删除成功!"EPT_COL"\n", data);return;}p = p->next;}printf(""BGC_RED"链表中无数据为%d的节点!"EPT_COL"\n", data);}//7.修改节点中的数据void modify(slc_list head, datatype data){//先判断链表是否为空,是空链表就退出此函数if(is_empty(head)){printf(""BGC_RED"链表为空!"EPT_COL"\n");return;}slc_list p = head; //从头节点开始查找while(p->next != head){if(p->next->data == data){printf("将数据%d修改为(请输入):", data);datatype tmp;scanf("%d", &tmp);p->next->data = tmp;printf(""BGC_GREEN"修改成功!"EPT_COL"\n");return;}p = p->next;}printf(""BGC_RED"找不到数据为%d的节点!"EPT_COL"\n", data);}//8.清空链表(就是一个一个节点的删除)void clear_list(slc_list head){if(is_empty(head)){printf(""BGC_RED"链表为空!"EPT_COL"\n");return;}slc_list p = head; //从头节点开始删除while(p->next != head){slc_list q = p->next;p->next = q->next;q->next = NULL;free(q); //将q所占空间释放掉}printf("已清空!\n");}int main(int argc, char *argv[]){//1.初始化链表slc_list mylist = init_list();//2.新建节点slc_list new = creat_node(1);//3.插入节点insert_node(mylist, new);new = creat_node(2);insert_node(mylist, new);new = creat_node(3);insert_node(mylist, new);new = creat_node(4);insert_node(mylist, new);new = creat_node(5);insert_node(mylist, new);//4.遍历显示display_node(mylist);//5.查找结点find_node(mylist, 1);find_node(mylist, 0);//6.删除节点delete_node(mylist, 5);delete_node(mylist, 0);//删除之后遍历display_node(mylist);//7.修改节点数据modify(mylist, 4);modify(mylist, 0);//修改之后遍历查看display_node(mylist);//8.清空链表clear_list(mylist);//清空之后查看display_node(mylist);return 0;}

阅读全文
0 0
原创粉丝点击