C语言基础 - 实现单向链表

回归C基础
实现一个单向链表,并有逆序功能 (大学数据结构经常是这么入门的)

//定义单链表结构体
typedef struct Node{
    int value;
    struct Node *next;
}Node;

//创建链表
Node* createNode(int value,Node *next){
    Node *node = malloc(sizeof(Node));
    node->value = value;
    node->next = next;
    return node;
}

//打印链表
void printList(Node *list){
    for (Node *node = list; node != NULL; node = node->next) {
        printf("current node value %d \n",node->value);
    }
    
}

//反转链表
Node* reverse(Node *listNode){
    Node *reList = NULL;
    Node *tmp;
    while (listNode != NULL) {
        tmp = malloc(sizeof(Node));
        //逆转之后,原链表的头结点就是新链表的尾结点
        //如果不是第一个结点,则本次产生的新结点是上次结点的前一个
        if (reList == NULL) {
            tmp->next = NULL;
        }else{
            tmp->next = reList;
        }
        tmp->value = listNode->value;
        reList = tmp;
        listNode = listNode->next;
    }
    //原链表的最后一个结点是新链表的头结点
    return reList;
}

//销毁
void destroyList(Node *list){
    Node *tmp;

    while (list != NULL) {
        tmp = list;
        list = list->next;
        free(tmp);
    }
    printf("链表销毁\n");
}

测试打印结果

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        Node *first = createNode(0, NULL);
        Node *list = first;
        
        first->next = createNode(2, NULL);
        first = first->next;
        
        first->next = createNode(3, NULL);
        first = first->next;
        
        first->next = createNode(4, NULL);
        first = first->next;
        
        first->next = createNode(7, NULL);
        first = first->next;
        
        printf("源数据:\n");
        printList(list);

        printf("反转后数据:\n");
        list = reverse(list);
        printList(list);
        
        destroyList(list);

    }
    return 0;
}

结果:

c-lianbiao.png

posted @ 2017-07-05 22:20  凯凯楷  阅读(130)  评论(0编辑  收藏  举报