带头结点的循环单向链表
2016-11-09 15:58
489 查看
#include<stdio.h> #include<stdlib.h> struct node { int num; struct node * next; }; typedef struct node Node; typedef struct node * Link; void is_malloc_ok(Link new_node) { if(new_node == NULL) { printf("malloc error!\n"); exit(-1); } } void create_newnode(Link * new_node) { *new_node = (Link) malloc(sizeof(Node)); is_malloc_ok(*new_node); } void create_link(Link * head) { create_newnode(head); (*head)->next = *head; } void insert_node_head(Link *head,Link new_node) { new_node->next = (*head)->next; (*head)->next = new_node; } void display_node(Link head) { Link tmp; tmp = head->next; if(tmp == head) { printf("Link is empty!\n"); return; } while(tmp != head) { printf("num = %d\n",tmp->num); tmp = tmp->next; } } void insert_node_tail(Link *head,Link new_node) { Link tmp; tmp = *head; while(tmp->next != *head) { tmp = tmp->next; } tmp->next = new_node; new_node->next = *head; } /*void insert_node_mid(Link *head,Link new_node,int num) { Link tmp; tmp = *head; if(NULL == *head) { printf("link is empty!\n"); return; } else { while(tmp->num != num && tmp->next != NULL) { tmp = tmp->next; } if(tmp->num == num) { new_node->next = tmp->next; tmp->next = new_node; } else { printf("no such node!\n"); } } }*/ void delete_node(Link *head,int num) { Link tmp; Link p; tmp = (*head)->next; p = *head; if(tmp == *head) { printf("link is empty!\n"); return; } while(tmp->num != num && tmp->next != *head) { p = tmp; tmp = tmp->next; } if(tmp->num == num) { p->next = tmp->next; free(tmp); } else { printf("no such node!\n"); } } void release(Link *head) { Link tmp; tmp = (*head)->next; /*while (tmp != NULL) { *head = tmp->next; free(tmp); tmp = tmp->next; }*/ while(tmp != *head) { (*head)->next = tmp->next; free(tmp); tmp = (*head)->next; } } void insert_node_mid(Link *head,Link new_node,int num) { Link tmp; Link p; tmp = (*head)->next; p = *head; if(tmp == *head) { new_node->next = (*head)->next; (*head)->next = new_node; return; } else { while((num > tmp->num) &&(tmp->next != *head)) { p = tmp; tmp = tmp->next; } if( tmp->next == *head) { if(num > tmp->num) { tmp->next = new_node; new_node->next = *head; } else { p->next = new_node; new_node->next = tmp; } } else { p->next = new_node; new_node->next = tmp; } } } void reverse_link(Link *head) { Link p1 = NULL; Link p2 = NULL; Link p3 = NULL; if((*head)->next == *head ||(*head)->next->next == *head) { printf("No need reverse!\n"); return; } else { p3 = (*head)->next; p2 = p3->next; if(p2->next == *head) { p2->next = p3; p3->next = *head; (*head)->next = p2; return; } p1 = p2->next; p3->next = *head; while(p1->next != *head) { p2->next = p3; p3 = p2; p2 = p1; p1= p1->next; } p2->next = p3; p1->next = p2; (*head)->next = p1; } } int main() { Link head = NULL; Link new_node = NULL; int i; int num; create_link(&head); for(i = 0; i < 10;i++) { create_newnode(&new_node); new_node->num = i; //insert_node_mid(&head,new_node,new_node->num); insert_node_head(&head,new_node); //insert_node_tail(&head,new_node); } printf("please input a num!\n"); scanf("%d",&num); //create_newnode(&new_node); //new_node->num = num; //insert_node_mid(&head,new_node,num); delete_node(&head,num); display_node(head); release(&head); //reverse_link(&head); display_node(head); return 0; }
相关文章推荐
- 不带头结点的循环单向链表
- 单链表 、带头结点的单链表、循环链表 及其实现
- 假设以带头结点的循环链表表示队列, 并且只设一个指针指向队尾元素结点(注意不设头指针) 试编写相应的队列初始化,入队列和出队列的算法
- 线性表学习归纳总结五:不带头结点的循环链表
- 带头结点的双向循环链表
- C实现头插法和尾插法来构建非循环双链表(不带头结点)
- 数据结构实验-用C++实现带头结点的循环链表
- 约瑟夫环问题(不带头结点单循环链表实现和数组实现)
- 双向循环链表的建立,插入,删除(不带头结点)
- 判断带头结点的双循环链表是否对称
- 判断带头结点的双向循环链表L是否对称相等的算法
- 删除带头结点的双循环链表p中第i个结点
- 数据结构(四)——单链表 、带头结点的单链表、循环链表 及其实现
- 设以带头结点的双向循环链表表示的线性表L=(a1,a2,……,an)。
- 【C++数据结构学习笔记---线性表】带头结点的双向循环链表
- 假设以不带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针。试设计相应的入队和出队的算法
- O(1)时间删除单向循环链表给定结点
- 带头结点的双向循环链表
- 带头结点的循环链表表示队列的初始化、入队列和出队列的算法
- 单循环链表之带头结点