单向链表的创建及其简单功能的实现

目录

1.链表的创建

2链表的插入

3.链表的遍历

4.链表的清空

5.链表的销毁

6.链表的指定值的删除

7.完整的实现功能



1.链表的创建

#include <stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct linklist
{
    int a;
    struct linklist*next;
}link;

link* header()
{
    link *p=malloc(sizeof(link));
    p->a=1;
    p->next=NULL;
    int val=0;
    //创建尾部指针
    link* end=p;
    printf("请输入你的数据(以-1代表输入结束):\n");
    while(true)
    {
        scanf("%d",&val);
        if(val!=-1) 
        {
        link *linknext=malloc(sizeof(link));
        linknext->a=val;
        linknext->next=NULL;
        end->next=linknext;
        //更新尾部指针
        end=linknext;
        }
        else
        {
            break;
        }

    }
    return p;
}

链表的创建及其初始化

链表的创建为结构体 加指针指针的方式创建

链表的初始化则是通过对头节点的赋值来实现的

 

 先创建一个头节点也就是link*p=malloc(sizeof(link))

然后创建指针变量指向头节点,然后随着节点的创建移动指针变量链表即创建完毕

2链表的插入

//在原来数字后插入一个值
void oldlink(link* header)
{
    int olddate,newdate;
    //创建两个节点
    link*current=header;
    printf("是否要插入尾部:\n");
    printf("0代表插入,1则不插入\n");
    int b;
    scanf("%d",&b);
    if (b==1)
    {
    printf("原来的数字为:\n");
    scanf("%d",&olddate);
    printf("要插入的数字为:\n");
    scanf("%d",&newdate);
    link*newcurrent=current->next;
    while(current->a!=olddate)
    {
        current=newcurrent;
        newcurrent=current->next;
    }
    if(newcurrent==NULL)
    {
        printf("未找到目标值,插入失败\n");
    }
    else
    {
        link*new=malloc(sizeof(link));
        new->a=newdate;
        current->next=new;
        new->next=newcurrent;
        printf("插入成功\n");
    }
    }
    //直接插入尾部
    else if(b==0)
    {
        printf("要插入的数字为:\n");
        scanf("%d",&newdate);
        link*lin=header;
        while(lin->next!=NULL)
        {
            lin=lin->next;
        }
        link*new=malloc(sizeof(link));
        new->a=newdate;
        new->next=NULL;
        lin->next=new;
        printf("插入成功\n");
        printf("---------------\n");
    }
    
}

可以链表中插入值,得用双指针

 需要更改前一个的next还需要拿到后一个的地址来存放到当前节点

注意:

借助while循环即可实现但插入不到最后(如果有更好的代码请评论一下我没有想到),还有链表中的数字不能重复否则无法实现,借助if可以认为判断一下

3.链表的遍历

void print (link* head)
{
    link* p=head;
    printf("你的数据为:\n");
    while(p->next!=NULL)
    {
        p=p->next;
        printf("%d\n",p->a);
        
    }
}

4.链表的清空

void clearlink(link* header)
{
    if(header==NULL)
    {
        return;
    }
    link*p=header;
    while(p!=NULL)
    {
        link*lin=p->next;
        free(p);
        p=lin;
    }
    header->next=NULL;
}
//删除节点

需要借助一个新的指针变量来保存地址不然一旦free后便早不到后面的地址了,追后初始化NULL即可完成

5.链表的销毁

和链表的清空差不多,不过多free了一次

6.链表的指定值的删除

void cutlink(link* header)
{
    int a;
    printf("请输入要删除的数字:\n");
    scanf("%d",&a);    
    link*p=header;
    link*oldheader=NULL;
    //上一个节点
    link *older=NULL;
    while(p->a!=a)
    {
        
        oldheader=p;
        p=p->next;
    }
    if(p->a==a&&p->next!=NULL)
    {
    oldheader->next=p->next;
    printf("删除成功\n");
    printf("--------------\n");
    } 
    else if(p->a==a&&p->next==NULL)
    {
    oldheader->next=NULL;
    printf("删除成功\n");
    printf("----------\n");
    }
    else if(p->a!=a)
    {
        printf("未查询到该数字\n");
        printf("---------------\n");
    }
}

注意:不能完全删除的数字,只能删除第一个

7.完整的实现功能

.h

#ifndef _TEST_H_
#define _TEST_H_
typedef struct linklist
{
    int a;
    struct linklist*next;
}link;
//初始化链表
link* header();
//遍历链表
void print (link* header);
//在链表后加一个旧的值新的值
void oldlink(link* header);
//销毁链表
void dellink(link* header);
//清空链表
void clearlink(link* header);
//删除节点
void cutlink(link* header);

#endif

.c

#include"linklist.h"
#include <stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//菜单
void menu()
{
    printf("-----------------------------------\n");
    printf("1.输入数据、2输出数据\n");
    printf("3.插入数据、4删除数据\n");
    printf("5.清空数据\n");
    printf("(输入负数结束)\n");
    printf("-----------------------------------\n");
}
//初始化链表
link* header()
{
    link *p=malloc(sizeof(link));
    p->a=1;
    p->next=NULL;
    int val=0;
    //创建尾部指针
    link* end=p;
    printf("请输入你的数据(以-1代表输入结束):\n");
    while(true)
    {
        scanf("%d",&val);
        if(val!=-1) 
        {
        link *linknext=malloc(sizeof(link));
        linknext->a=val;
        linknext->next=NULL;
        end->next=linknext;
        //更新尾部指针
        end=linknext;
        }
        else
        {
            break;
        }
    }
    return p;
}
//遍历链表
void print (link* head)
{
    link* p=head;
    printf("你的数据为:\n");
    while(p->next!=NULL)
    {
        p=p->next;
        printf("%d\n",p->a);
        
    }
};
//在原来数字后插入一个值
void oldlink(link* header)
{
    int olddate,newdate;
    //创建两个节点
    link*current=header;
    printf("是否要插入尾部:\n");
    printf("0代表插入,1则不插入\n");
    int b;
    scanf("%d",&b);
    if (b==1)
    {
    printf("原来的数字为:\n");
    scanf("%d",&olddate);
    printf("要插入的数字为:\n");
    scanf("%d",&newdate);
    link*newcurrent=current->next;
    while(current->a!=olddate)
    {
        current=newcurrent;
        newcurrent=current->next;
    }
    if(newcurrent==NULL)
    {
        printf("未找到目标值,插入失败\n");
        printf("---------------");
    }
    else
    {
        link*new=malloc(sizeof(link));
        new->a=newdate;
        current->next=new;
        new->next=newcurrent;
        printf("插入成功\n");
        printf("-------------");
    }
    }
    //直接插入尾部
    else if(b==0)
    {
        printf("要插入的数字为:\n");
        scanf("%d",&newdate);
        link*lin=header;
        while(lin->next!=NULL)
        {
            lin=lin->next;
        }
        link*new=malloc(sizeof(link));
        new->a=newdate;
        new->next=NULL;
        lin->next=new;
        printf("插入成功\n");
        printf("---------------\n");
    }
    
}
//销毁链表
void dellink(link* header)
{
    
}
//清空链表
void clearlink(link* header)
{
    if(header==NULL)
    {
        return;
    }
    link*p=header;
    while(p!=NULL)
    {
        link*lin=p->next;
        free(p);
        p=lin;
    }
    header->next=NULL;
}
//删除节点
void cutlink(link* header)
{
    int a;
    printf("请输入要删除的数字:\n");
    scanf("%d",&a);    
    link*p=header;
    link*oldheader=NULL;
    //上一个节点
    link *older=NULL;
    while(p->a!=a)
    {
        
        oldheader=p;
        p=p->next;
    }
    if(p->a==a&&p->next!=NULL)
    {
    oldheader->next=p->next;
    printf("删除成功\n");
    printf("--------------\n");
    } 
    else if(p->a==a&&p->next==NULL)
    {
    oldheader->next=NULL;
    printf("删除成功\n");
    printf("----------\n");
    }
    else if(p->a!=a)
    {
        printf("未查询到该数字\n");
        printf("---------------\n");
    }
}
int main()
{
    menu();
    int a=1;
    link* p=NULL;
    while(a>0)
    {
    scanf("%d",&a);
    switch (a)
    {
    case 1:
    p=header();
    break;
    case 2:
    print(p);
    break;
    case 3:
    oldlink(p);
    break;
    case 4:
    cutlink(p);
    break;
    case 5:
    clearlink(p);
    break;
    }
    menu();   
    }
    return 0;
}

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
C++中的链表是一种常见的数据结构,它由多个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。链表有很多种类型,包括单向链表、双向链表和循环链表等。 以下是链表的基本操作: 1. 创建链表节点 链表节点通常由两个部分组成:数据和指向下一个节点的指针。我们可以定义一个结构体来表示节点: ```c++ struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {} }; ``` 这个结构体包含一个整数和一个指向下一个节点的指针,其中构造函数用于初始化节点的值。 2. 插入节点 插入节点是链表中最基本的操作之一。我们可以将新节点插入到链表的任何位置,包括链表的头部、尾部或中间。 ```c++ void insertNode(ListNode*& head, int val) { ListNode* newNode = new ListNode(val); newNode->next = head; head = newNode; } ``` 这个函数将创建一个新节点并将其插入到链表的头部。 3. 删除节点 删除节点也是链表中最基本的操作之一。我们可以从链表的任何位置删除节点,包括链表的头部、尾部或中间。 ```c++ void deleteNode(ListNode*& head, int val) { if (head == NULL) return; if (head->val == val) { ListNode* temp = head; head = head->next; delete temp; return; } ListNode* prev = head; ListNode* curr = head->next; while (curr != NULL) { if (curr->val == val) { prev->next = curr->next; delete curr; return; } prev = curr; curr = curr->next; } } ``` 这个函数将从链表中删除具有指定值的节点。 4. 遍历链表 遍历链表是查看链表中节点值的一种方法。 ```c++ void traverseList(ListNode* head) { ListNode* curr = head; while (curr != NULL) { cout << curr->val << " "; curr = curr->next; } } ``` 这个函数将遍历整个链表,并输出每个节点的值。 这些是链表的基本操作。在实际的应用程序中,我们可能需要使用更多的操作来实现特定的功能
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学c的小李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值