今天上午自己写了一个链表的反转
#include <stdio.h> #include <stdlib.h> typedef struct _node { int n; _node *next; } node; int create_link(node **phead) { int x = 0; printf("input nums, press Ctrl+Z(win) or Ctrl+D(linux) to endn"); if (scanf("%d", &x) <= 0) { return 0; } *phead = (node *)malloc(sizeof(node)); if ( ! *phead) { return 1; } (*phead)->n = x; (*phead)->next = NULL; node *now = *phead; while (scanf("%d", &x) == 1) { node *new_node = (node *)malloc(sizeof(node)); if ( ! new_node) { // TO-DO: free memory return 1; } new_node->n = x; new_node->next = NULL; now->next = new_node; now = new_node; } return 0; } void print_link(node *head) { node *now = head; while (now) { printf("%d", now->n); if (now->next) { printf(" -> "); } now = now->next; } printf("n"); } void delete_link(node **head) { node *now = *head; while (now) { node *tmp = now->next; free(now); now = tmp; } *head = NULL; } void reverse_link(node **phead) { node *pre = *phead; node *curr = pre->next; if ( ! curr) { // 只有一个节点 return; } node *next = curr->next; pre->next = NULL; while (1) { curr->next = pre; if (next) { pre = curr; curr = next; next = next->next; } else { break; } } *phead = curr; } int main() { node *head = NULL; create_link(&head); print_link(head); reverse_link(&head); print_link(head); delete_link(&head); return 0; }
输入输出
input nums, press Ctrl+Z(win) or Ctrl+D(linux) to end 3 1 2 4 0 ^Z 3 -> 1 -> 2 -> 4 -> 0 0 -> 4 -> 2 -> 1 -> 3
==================================================
2012-09-08 12:39:03 update 参考这里 http://blog.csdn.net/rerli/art…,反转函数有更简单的写法
void reverse_link(node **phead) { node *pre = NULL; node *curr = *phead; node *next = NULL; while (curr) { next = curr->next; curr->next = pre; pre = curr; curr = next; } *phead = pre; }
================================================
参考这里,http://blog.csdn.net/rerli/art…,写了链表的插入排序
void insert_sort(node **phead) { node *head = *phead; // 把 head 的下一节点保存起来 node *first = head->next; // 断开 head,使其成为初始的有序链表 head->next = NULL; while (first) { node *p, *q, *t; // 找到插入点 for (t=first, q=head; q && q->n < t->n; p=q, q=q->next); // 把 first 节点从无序链表中断开 first = first->next; if (q == head) { // 插入在头结点之前 head = t; } else { // p 是 q 的前驱 p->next = t; } t->next = q; } *phead = head; }
======================================================
2012-09-08 15:02:07 update 相比于传二维指针,可以使用 c++ 的写法,传引用,这样可读性会高很多
int create_link(node *&head) { int x = 0; printf("input nums, press Ctrl+Z(win) or Ctrl+D(linux) to endn"); if (scanf("%d", &x) <= 0) { return 0; } head = (node *)malloc(sizeof(node)); if ( ! head) { return 1; } head->n = x; head->next = NULL; node *now = head; while (scanf("%d", &x) == 1) { node *new_node = (node *)malloc(sizeof(node)); if ( ! new_node) { // TO-DO: free memory return 1; } new_node->n = x; new_node->next = NULL; now->next = new_node; now = new_node; } return 0; }
调用的时候改成
int main() { node *head = NULL; create_link(head); print_link(head); reverse_link(&head); print_link(head); insert_sort(&head); print_link(head); delete_link(&head); return 0; }