带头结点的单向链表
来源:互联网 发布:起名网络中国 编辑:程序博客网 时间:2024/04/30 23:35
- #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 = NULL;
- }
- 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;
- if(head->next ==NULL)
- {
- printf("Link is empty!\n");
- return;
- }
- while(tmp->next != NULL)
- {
- printf("num = %d\n",(tmp->next)->num);
- tmp = tmp->next;
- }
- }
- void insert_node_tail(Link *head,Link new_node)
- {
- Link tmp;
- tmp = *head;
- while(tmp->next != NULL)
- {
- tmp = tmp->next;
- }
- tmp->next = new_node;
- new_node->next = NULL;
- }
- /*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 = p = (*head)->next;
- if(NULL == (*head)->next)
- {
- printf("link is empty!\n");
- return;
- }
- while(tmp->num != num && tmp->next != NULL)
- {
- p = tmp;
- tmp = tmp->next;
- }
- if(tmp->num == num)
- {
- if(tmp == (*head)->next)
- {
- (*head)->next = tmp->next;
- free(tmp);
- }
- else
- {
- 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 != NULL)
- {
- (*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;
- p = *head;
- if(NULL == (*head)->next)
- {
- new_node->next = NULL;
- (*head)->next = new_node;
- }
- else
- {
- while((num > tmp->num) &&(tmp->next != NULL))
- {
- p = tmp;
- tmp = tmp->next;
- }
- if(num <= tmp->num)
- {
- if(tmp == (*head)->next)
- {
- new_node->next = tmp;
- (*head)->next = new_node;
- }
- else
- {
- p->next = new_node;
- new_node->next = tmp;
- }
- }
- if((num > tmp->num)&&(tmp->next == NULL))
- {
- tmp->next = new_node;
- new_node->next = NULL;
- }
- }
- }
- void reverse_link(Link *head)
- {
- Link p1 = NULL;
- Link p2 = NULL;
- Link p3 = NULL;
- if(NULL == (*head)->next || (*head)->next->next == NULL)
- {
- printf("No need reverse!\n");
- return;
- }
- else
- {
- p3 = (*head)->next;
- p2 = p3->next;
- if(p2->next == NULL)
- {
- p2->next = p3;
- p3->next = NULL;
- (*head)->next = p2;
- return;
- }
- p1 = p2->next;
- p3->next = NULL;
- while(p1->next != NULL)
- {
- 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);
- //printf("Enter 10 number!\n");
- for(i = 0; i < 10;i++)
- {
- create_newnode(&new_node);
- new_node->num = i;
- //scanf("%d",&(new_node->num));
- 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;
- }
0 0
- 逆序带头结点的单向链表
- 带头结点的循环单向链表
- 带头结点的单向链表
- 带头结点的非循环单向链表
- 不带头结点的循环单向链表
- 带头结点的链表
- 带头结点的链表
- 带头结点的链表
- 链表的学习—带头结点单向链表的逆置
- 不带头结点的单向链表排序——插入排序(C语言)
- 带头结点的双向循环链表
- 带头结点的链表基本操作
- 不带头结点的链表实现
- 带头结点的双向循环链表
- 顺序链表 带头结点的
- 反转带头结点的链表
- 带头结点的线性链表类型
- 带头结点的线性链表类型
- activiti5.20简单介绍(八) -- 流程操作续
- idea中maven下载依赖包慢
- CSS和JavaScript实现右拉菜单
- JAVA开发中的路径问题总结
- python实现短网址系统
- 带头结点的单向链表
- SplashActivity最简单的引导页
- 实现 select中指定option选中触发事件
- 阿里云部分主机性能测试
- 行内元素与块元素之间的转换
- 数据库索引的使用
- 20161109
- Android中Activity的四种加载(启动)模式
- 在3d世界里 表示 相对屏幕的 上下左右方向