数据结构单链表入门代码

Posted 若你遇见她

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构单链表入门代码相关的知识,希望对你有一定的参考价值。

         本人当初在学习数据结构的时候,一直搞不清楚代码(其实就是自己没练)。现在自己学后。就写了一个之前在网上抄作业看见的输出一样的程序。希望可以帮助学弟学妹们学习理解链表代码的编写。因为网上叙述链表原理的博客和文章特别多。我这里就不赘述了。上代码。

ps:因为是我自己按照自己的想法来写的,肯定不是最优解。望各位大佬见谅。

 

 

// hello Word.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include<malloc.h>  //分配内存
#include<stdio.h>  //

typedef struct ListNode 
    int data;  //数据存放点
    struct ListNode* next;   //后继指向
ListNode; //结构体别名



//链表生成函数,返回类型为ListNode节点类型(返回头节点)
ListNode*Initlist(int n) //n链表为长度

    ListNode *head, *p, * s;    //头结点,链表构建指针变量,链表接入指正变量    
    head = (ListNode*)malloc(sizeof(ListNode));//固定语法,动态分配内存给头结点
    head->next = NULL;           //现在还是空链表,末尾指向NULL
    int i = 1;
    p = head;
    while(n)
    
        printf("请输入第""%d""节点的值",i);
        s = (ListNode*)malloc(sizeof(ListNode));//接入的指针变量的动态内存分配
        scanf_s("%d", &s->data );   //输入数据
        s->next = NULL;             //尾结点指向空
        p->next = s;                //将s点链接到p后面
        p = p->next;               //p指向其下一节点,即s点
        n-=1;   //剩余长度值修正
        i++;

    
    
    return head;       //返回头结点

链表增加函数
ListNode* Add(ListNode* head,int opo,int data)//opo为添加的位置,date为需要添加的数据
    ListNode* p = head;                 //建立指向点,并指向头结点
    for (int i = 1; i < opo; i++) //找出需要添加位置的上一节点。
        if (p->next == NULL)        //若链表下一级指向空,则证明已经到达链表最后节点
            printf("链表长度不够,无法插入");
            return NULL;
          //  break;
        
        p = p->next;
    
    //插入
    ListNode* a = (ListNode*)malloc(sizeof(ListNode));
    a->data = data;
    a->next = p->next;
    p->next = a;

    return head;


按照位删除
ListNode* Dele(ListNode* head, int e)
    ListNode* p = head;
    for(int i=1;i<e;i++)
        if (p->next == NULL)
            printf("你要删除的位置大于链表长度");
            printf("\\n");
            return head;
        
        p = p->next;

    
    //删除
    p->next = p->next->next;
    return head;


/按位更改
ListNode* Correct(ListNode* head,int opo,int data) 
    ListNode* p = head;
    for (int i = 1; i <= opo; i++) 
        if (p->next == NULL) 
            printf("你要更改的位置不存在");
            printf("\\n");
            return head;
        
        p = p->next;
    
    p->data = data;
    return head;



/按位查找
ListNode* find(ListNode* head,int opo,int len) 
    ListNode* p = head;
    int i = 1;
    if(opo>len)  //检查该位置是否超出链表最大长度
        printf("该位置超出最大链表长度");
        return head;
    

    for (i; i <= opo;i++) //开始检索该位置
        p = p->next;
    
    printf("你找的数据为""%d\\n", p->data);
    return head;




按照值删除
ListNode* DDele(ListNode* head, int data,int len)
    ListNode* h = head;
    ListNode* p = h->next;
    int w = 1;// while (p->next)
    for(int i = 1;i<=len;i++)
        if (p->data == data)
            if (p->next == NULL)  //尾结点
            
                h->next = NULL;
                w++;
                continue;
            

            else if(p->next)    //普通节点
                h->next = p->next;
                p = p->next;
                w++;
             continue;
            
            
        
        h = h->next;//若非需要的值就直接下一跳
        p = p->next;

    
    if (w == 1)
        printf("该值不存在链表中\\n");
    return head;



//按值更改
ListNode* DCorrect(ListNode* head,int data1,int data2,int len) 
    ListNode* p = head;
    int w = 0;
    for (int i = 0; i <= len; i++) 
        if (p->data == data1) 
            p->data = data2;
            w++;
        
        p = p->next;
    
    if (w == 0) 
        printf("本链表中不存在该数\\n");
    
    return head;




///按值查找
ListNode* Dfind(ListNode* head,int data,int len) 
    ListNode* p = head;
    int w = 0;
    for (int i = 0; i < len; i++) 
        if (p->data == data) 
            printf("该数据的位置为""%d\\n",i);
            w++;
        
        p = p->next;
    
    if (w == 0)
        printf("该链表中不存在该值\\n");
    return head;


打印链表函数
void display(ListNode* head)   
    ListNode* p = head;   //实例化一个结构体,并指向头结点。以此来作为打印点
    printf("链表当前状态为");
    while (p->next) 
        p = p->next;
        printf("%d", p->data);
    
    printf("\\n");

    

//主函数
int main()

    int len,data,opo; //定义链表长度,添加值,位置
    int data1,data2,dos;
    
    printf("                                               欢迎进入林哥链表模拟器   \\n"); //装逼
    printf("请输入你需要的链表长度"); //生成长度
    scanf_s("%d", &len);

    ListNode* p =  Initlist(len); //链表生成
    display(p);             //链表打印
    printf("\\n");

    while (1)
        printf("按位置增加输入 1                  按照位置删除输入 2\\n");
        printf("按位置改动输入 3                  按照位置查找输入 4\\n");
        printf("按数据删除输入 5                  按照数据更改输入 6\\n");
        printf("按数据查找输入 7                  \\n");
        scanf_s("%d", &dos);

        if (dos == 1) 
            printf("请输入需要插入的位置");    ///插入
            scanf_s("%d", &opo);
            printf("请输入需要插入的值");
            scanf_s("%d", &data);
            p = Add(p, opo, data);
            display(p);             //链表打印
            printf("\\n");

        

        else if (dos == 2) 
            printf("请输入需要删除的位置");  //按位删除
            scanf_s("%d", &opo);
            p = Dele(p, opo);
            display(p);
            printf("\\n");

        
        else if (dos == 3) 
            printf("请输入需要更改的位置");  //按位更改
            scanf_s("%d", &opo);
            printf("请输入需要更改进入的值");
            scanf_s("%d", &data);
            p = Correct(p, opo, data);
            display(p);
            printf("\\n");
        

        else if (dos == 4)                   //按位查找
            printf("请输入你需要寻找的位置");
            scanf_s("%d", &opo);
            p = find(p, opo, len);
            display(p);
            printf("\\n");
        

        else if (dos == 5)                   //按数据删除
            printf("请输入需要删除的值");
            scanf_s("%d", &data);
            p = DDele(p, data, len);
            display(p);
            printf("\\n");

        
        else if (dos == 6)                  //按照数据更改
            printf("请输入你需要寻找的值");
            scanf_s("%d", &data1);
            printf("请输入你需要寻跟换的值");
            scanf_s("%d", &data2);
            p = DCorrect(p, data1, data2, len);
            display(p);
            printf("\\n");
        

        else if (dos == 7)                      //按照数据寻找
            printf("请输入你需要寻找位置的值");
            scanf_s("%d", &data);
            p = Dfind(p, data, len);
            display(p);
            printf("\\n");

        
       
        else
            break;


    
    printf("拜拜");


以上是关于数据结构单链表入门代码的主要内容,如果未能解决你的问题,请参考以下文章

数据结构单链表入门代码

C/C++语言数据结构快速入门(代码解析+内容解析)链表(单链表,双链表,循环链表,静态链表)

C/C++语言数据结构快速入门(代码解析+内容解析)链表(单链表,双链表,循环链表,静态链表)

C 中在单链表末尾添加节点的函数不起作用

数据结构C语言版 —— 链表增删改查实现(单链表+循环双向链表)

奉劝还在找工作的学弟学妹们:这一道字节跳动的算法面试题一定要会!