C——链表

/* 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;
}

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...