曲径通幽论坛

标题: 链表反转 [打印本页]

作者: beyes    时间: 2009-7-27 21:36
标题: 链表反转
code:
#include <stdio.h>
#include <stdlib.h>

struct llist {
    int num;
    struct llist *next;
};
typedef struct llist node;
typedef node   *llink;

/*-----------*/
/*  链表输出 */
/*-----------*/
void printllist(llink ptr)
{
    while (ptr != NULL) {
        printf("[%d]", ptr->num);
        ptr = ptr->next;
    }

    printf("\n");
}


/*-----------*/
/*  链表创建 */
/*-----------*/
llink createllist(int *array, int len)
{
    llink head;                /*链表开始指针*/
    llink ptr, ptr1;
    int i;
   
    /*创建第一个结点*/
    head = (llink) malloc(sizeof(node));
    if (!head)                 /*检查指针*/
      return NULL;
   
    head->num = array[0];            /*创建结点内容*/
    head->next = NULL;            /*设置指针初值*/
    ptr = head;                /*ptr指向链表开始*/
    for (i = 1; i < len; i++) {        /*创建其它结点循环*/
        ptr1 = (llink)malloc(sizeof(node));
        if (!ptr1)
          return NULL;
        ptr1->num = array[i];        /*创建结点内容*/
        ptr1->next = NULL;        /*设置指针初值*/
        ptr->next = ptr1;        /*连接结点*/
        ptr = ptr->next;        /*指向下一结点*/
    }
    return head;
}

/*-----------*/
/*链表的反转 */
/*-----------*/
llink invertllist(llink head)
{
    llink mid, last;
    mid = NULL;
    while ( head != NULL ) {
        last = mid;
        mid = head;
        head = head->next;
        mid->next = last;
    }
    return mid;
}

/*-------------*/
/*链表内存释放 */
/*-------------*/
void freellist(llink head)
{
    llink ptr;
    while( head != NULL) {
        ptr = head;
        head = head->next;
        free(ptr);
    }
}
int main(void)
{
    int llist1[6] = {1, 2, 3, 4, 5, 6};    /*数组内容*/
    llink head;                /*指向链表开始*/
   
    head = createllist(llist1, 6);
    if (!head) {
        printf("内存分配失败! \n");
        exit(1);
    }
    printf("原来的链表: ");
    printllist(head);
    head = invertllist(head);
    printf("反转后的链表: ");
    printllist(head);
    freellist(head);
}




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2