题解 | #【模板】链表#

【模板】链表

https://www.nowcoder.com/practice/97dc1ac2311046618fd19960041e3c6f

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//创建链表头节点
typedef  int  DataType;
typedef  struct  linknode {     /*单链表存储类型*/
    DataType       data;         /*定义结点的数据域*/
    struct  linknode*   Next;    /*定义结点的指针域*/
} LinkList;

LinkList*  InitList() {
    /*初始化链表函数*/
    LinkList*  head;
    head = (LinkList*)malloc(sizeof(LinkList)); /*动态分配一个结点空间*/
    head->Next = NULL;
    return head;                    /*头结点L指针域为空,表示空链表*/
}
void CreateListL(LinkList*  head, int n) {
    /*建立链表函数*/
    LinkList*  s;

    s = (LinkList*) malloc(sizeof(LinkList)); /*生成新结点*/
    s->data = n;
    s->Next = NULL;         /*将新结点的指针域为空*/
    head->Next = s;
}



//插入操作
void Insert(LinkList*  head, int target, int value) {
    //把p 指向头节点遍历
    LinkList* p = head;
    //插入的数分配内存空间
    LinkList* NewCode = (LinkList*) malloc(sizeof(LinkList));
    NewCode->data = value;
    NewCode->Next = NULL;
    //链表为空直接返回
    if (p->Next == NULL) {
        CreateListL(p, value);

    } else {
        //确保p还没有遍历到链表尾,找到要插入元素的位置
        while ( p->Next != NULL && p->Next->data != target) {
            p = p->Next;
        }
        //找到了要插入的元素
        if (p->Next != NULL) {
            //插入元素
            NewCode->Next = p->Next;
            p->Next = NewCode;//放入前面

            //未找到元素
        } else {
            p->Next = NewCode;//链表尾
        }

    }

}
LinkList* Delete(LinkList* head, int value) {
    
    LinkList* p = head;
    if (head == NULL) {
        return NULL;
    }

    while (p->Next != NULL && p->Next->data != value) {
        p = p->Next;
    }

    if (p->Next != NULL) {
        LinkList* temp = p->Next;
        p->Next = temp->Next;
        free(temp);
    }

    return head;
}
//将链表元素输出
void printLinkedList(LinkList*  head) {
    //判断是否为空
    //头指针的Next指针为空,表示整个链表为空,无法进行遍历和输出操作
    if (head->Next == NULL) {
        printf("NULL");
        return;
    }
    LinkList* p = head;
    p = p->Next;
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->Next;
    }
}

int main() {
    LinkList* head;
    head = InitList();
    int target, value, data;
    int x, i; //操作次数
    char ch[100000];
    scanf("%d", &x);
    for (i = 0; i < x; i++) {
        scanf("%s", ch);

        if (strcmp(ch, "insert") == 0) {
            scanf("%d", &target);
            scanf("%d", &value);

            Insert( head, target, value);
        } else if (strcmp(ch, "delete") == 0) {
            scanf("%d", &data);
            //更新头指针
           head = Delete(head, data);
        }
    }
    
         printLinkedList(head);
    
    
       
        
    

    return 0;
}

全部评论

相关推荐

头顶尖尖的程序员:我是26届的不太懂,25届不应该是找的正式工作吗?为什么还在找实习?大四还实习的话是为了能转正的的岗位吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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