当前位置 : 主页 > 编程语言 > c++ >

C——链表

来源:互联网 收集:自由互联 发布时间:2021-06-23
/* myLinkedList.c */ /* 链表 */ #include stdio.h #include stdlib.h #include stdbool.h /* 节点结构 */ typedef struct node { int value; /* 节点的值 */ struct node *next; /* 指向下一个节 */ } Node; /* 用户界面 */ void inter
/* myLinkedList.c */
/* 链表 */

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

/* 节点结构 */
typedef struct node {
    int value;            /* 节点的值 */
    struct node *next;    /* 指向下一个节 */
} Node;

/* 用户界面 */
void interface(void){
    puts("+*************************************************+");
    puts("+     0, quit               退出                  +");
    puts("+     1, add nodes          添加                  +");
    puts("+     2, find node          查找                  +");
    puts("+     3, delete node        删除                  +");
    puts("+     4, traverse nodes     遍历                  +");
    puts("+     5, clear nodes        清除                  +");
    puts("+*************************************************+");
}

/* 链表函数 */
/* 添加节点 */
/* 注意:函数需要修改到head,需要将head的地址传入 */
void addNode(Node **head, int number){
    /* 使用malloc动态分配一个新节点 */
    Node *node = (Node*)malloc(sizeof(Node));
    node->value = number;
    node->next = NULL;

    Node *last = *head;
    if(!last){
        /* 如果head为空,说明链表为空,将head指向node节点 */
        *head = node;
    }else{
        /* 找到链表尾部,将last节点结构的next属性执行node节点 */
        while(last->next){
            last = last->next;
        }
        last->next = node;
    }
}

/* 根据值查找节点 */
int findNode(Node *head, int number){
    int index = 0;
    for(Node *p=head; p; p=p->next, index++){
        if(p->value==number)
            return index;
    }
    return -1;
}

/* 根据值删除节点 */
bool deleteNode(Node **head, int number){
    /* 如果要删除第一个节点,需要改变head指向第二个节点并free第一个节点 */
    if(number==0){
        Node *first = *head;
        Node *second = first->next;
        free(first);
        *head = second;
        return true;
    }else{
        /* p指向当前节点,f指向p之前的节点 */
        Node *f = NULL;
        for(Node *p=*head; p; p=p->next){
            if(p->value==number){
                f->next = p->next;
                free(p);
                return true;
            }
            f = p;
        }
    }
    return false;
}

/* 遍历链表 */
void traverseNodes(Node *head){
    /* 遍历链表,从头到尾,遇到节点的next为NUll,则表明到了链表尾部 */
    for(Node *p=head; p; p=p->next){
        printf("%d -> ", p->value);
    }
    printf("0\n");
}

/* 清空链表 */
bool clearNodes(Node **head){
    /* 遍历链表,清空节点 */
    Node *q = NULL;
    for(Node *p=*head; p; p=q){
        q = p->next;
        free(p);
    }
    *head = NULL;
    return true;
}

int main(int argc, char *args[]){
    /* head为指向链表头部节点的指针 */
    Node *head = NULL;
    int flag, number;

    interface();
    for(;;){
        printf("Command: ");
        scanf("%d", &flag);
        switch(flag){
            case 0: 
                printf("Bye!\n");
                return 0;
            case 1:
                printf("Enter numbers(0 to stop): ");
                for(;;){
                    scanf("%d", &number);
                    if(number==0)
                        break;
                    addNode(&head, number);
                }
                break;
            case 2:
                printf("Enter the node value: ");
                scanf("%d", &number);
                printf("index: %d\n", findNode(head, number));
                break;
            case 3:
                printf("Enter the node value: ");
                scanf("%d", &number);
                if(deleteNode(&head, number))
                    printf("Successfully deleted node %d\n", number);
                else
                    printf("Failed to locate node %d\n", number);
                break;
            case 4:
                traverseNodes(head);
                break;
            case 5:
                if(clearNodes(&head))
                    printf("Done!\n");
                break;
        }
    }

    return 0;
}
网友评论