C | 实现单链表结构

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

typedef struct Node {
    char data;
    struct Node * next;
} node;

node * initLinkedList() {
    /* initalize the linked list (has head node) */
    node * p = (node *)malloc(sizeof(node));
    node * temp = p;

    int i;
    for (i = 0; i < 4; i++) {
        node * n = (node *)malloc(sizeof(node));
        n->data = i;
        n->next = NULL;

        temp->next = n;
        temp = temp->next;
    }

    return p;
}

node * insertElem(node * p, int elem, int index) {
    node * temp = p; 

    int i;
    for (i = 0; i < index; i++) {
        if (temp == NULL) {
            printf("Illegal Index");
            return p;
        }
        temp = temp->next;
    }

    node * newNode = (node *)malloc(sizeof(node));
    newNode->data = elem;

    newNode->next = temp->next;
    temp->next = newNode;

    return p;
}

node * deleteElem(node * p, int index) {
    node * temp = p;

    int i;
    for (i = 0; i < index; i++) {
        temp = temp->next;
    }

    node * del = temp->next;
    temp->next = temp->next->next;

    free(del);

    return p;
}

int searchElem(node * p, int elem) {
    node * temp = p;

    int i = 0;
    while (temp->next) {
        temp = temp->next;
        if (temp->data == elem) {
            return i; // return the index of the element
        }
        i++;
    }

    return -1; // if not found
}

node * updateElem(node * p, int index, int newElem) {
    node * temp = p;

    int i;
    for (i = 0; i <= index; i++) {
        temp = temp->next;
    }

    temp->data = newElem;

    return p;
}

void display(node * p) {
    /* display the linked list (has head node) */
    node * temp = p;
    while (temp->next) {
        temp = temp->next;
        printf("%d ", temp->data);
    }
    printf("\n");
}

int main(void) {
    printf("Linked List: ");
    node * p = initLinkedList();
    display(p);

    p = insertElem(p, 10, 1);
    p = insertElem(p, 20, 1);
    printf("After insertion: ");
    display(p);

    p = deleteElem(p, 1);
    p = deleteElem(p, 1);
    printf("After deletion: ");
    display(p);

    printf("Index of \"2\": %d\n", searchElem(p, 2));

    p = updateElem(p, 1, 100);
    printf("After update: ");
    display(p);

    return 0;
}
全部评论

相关推荐

白火同学:只是实习的话,你这份简历应该也差不多了。真要优化的话,因为面实习的话,没有开发经验,面试更重视技术栈水平。 1、重视JavaSE的基础吧,集合、泛型算是比较基础的基础,多线程、反射、JVM内存模型才是基础; 2、技术栈写到具体的点,比如Elasticsearch的使用写到某个点,限制面试官自由发挥,防止问了相关问题最后又答不上,如果真没把握建议不写,降低面试官的心理预期; 3、技术栈不要重复,比如技术栈第二条和第八条可以合并改为“熟悉Redis中间件,包括基本数据结构、缓存策略、持久化机制,了解缓存三剑客及其解决方案,并有相关项目经验。”; 4、项目指标量化,比如“达到xx秒的响应速度”(不过这个就有点偏校招社招的要求了,实习简历不写也无伤大雅)。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-04 14:23
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务