数据结构单链表入门代码

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

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("拜拜");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值