不带表头结点的非循环单向链表
2016-11-06 20:57
239 查看
#include<stdio.h> #include<stdlib.h> struct node { int num; struct node *next; }; typedef struct node Node; typedef struct node * Link; void create_link(Link *head) { *head = NULL; } void insert_node_head(Link *head,Link new_node) { new_node->next = *head; *head = new_node; } void display_node(Link head) { Link tmp; tmp = head; if(NULL == head) { printf("link is empty!\n"); return; } while(tmp != NULL) { printf("num = %d\n",tmp->num); tmp = tmp->next; } } 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 insert_node_tail(Link *head,Link new_node) { Link tmp; tmp = *head; if(*head == NULL) { new_node->next = *head; *head = new_node; } else { 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; if(NULL == *head) { 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) { *head = 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; /*while (tmp != NULL) { *head = tmp->next; free(tmp); tmp = tmp->next; }*/ while(tmp != NULL) { *head = (*head)->next; free(tmp); tmp = *head; } } void insert_node_mid(Link *head,Link new_node,int num) { Link tmp; Link p; tmp = *head; p = *head; if(NULL == *head) { new_node->next = *head; *head = new_node; } else { while((num > tmp->num) &&(tmp->next != NULL)) { p = tmp; tmp = tmp->next; } if(num <= tmp->num) { if(tmp == *head) { new_node->next = tmp; *head = 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 || (*head)->next == NULL) { printf("No need reverse!\n"); return; } else { p3 = *head; p2 = p3->next; if(p2->next == NULL) { p2->next = p3; p3->next = NULL; *head = 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 = 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,10); // delete_node(&head,num); display_node(head); //release(&head); reverse_link(&head); display_node(head); return 0; }
相关文章推荐
- 带头结点的非循环单向链表
- 带表头结点的单向链表
- 创建带表头结点的单向链表,并实现各种功能
- 不带表头结点的单向链表总结
- 单向带表头链表中找节点
- 交换单向链表的头结点和第n个节点
- 一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针
- 华为oj:输出单向链表中倒数第k个结点
- 输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针
- 华为oj_输出单向链表中倒数第k个结点
- 带表头结点的双向循环链表
- 13、输入一个单向链表,输出该链表中倒数第k个结点
- C语言实现链表之单向链表(五)头结点前插入结点
- 输出单向链表中倒数第k个结点
- 华为OJ——输出单向链表中倒数第k个结点
- 单链表(表头结点)
- 单向链表中间结点
- 单向链表倒数k个结点
- 第7题 微软亚院之编程判断俩个链表是否相交 给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交,并找出第一个相交结点。
- 单向链表指针头结点的修改