c++/c详细链表操作(头插尾插创建,插入,删除,查找,遍历,清空)

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<windows.h>
using namespace std;
typedef struct Node
{
    int number;//数据域
    struct Node*next;//指针域
} Node,*Linklist;
//链表的初始化
void linklistIntit(Linklist &L)
{
    L=(Linklist)malloc(sizeof(Node));
    L->next=NULL;
}
//头插法创建链表
void linklistheadCreat1(Linklist &L,int n)
{
    Linklist p;
    for(int i=0; i<n; i++)
    {
        p=(Linklist)malloc(sizeof(Node));//开辟空间
        cout<<"请你输入数据\n";
        cin>>p->number;
        p->next=L->next;
        L->next=p;
    }
}
//尾插法创建链表
void linklistheadCreat2(Linklist &L,int n)
{
    Linklist rear=L;//定义rear由下下面操作(rear=p;)让rear始终指向尾部节点

    for(int i=0; i<n; i++)
    {
        Linklist p=(Linklist)malloc(sizeof(Node));
        cout<<"请输入数据\n";
        cin>>p->number;
        rear->next=p;
        rear=p;
        rear->next=NULL;//必不可少指向空
    }
}
//遍历链表
void linklistTreavle(Linklist &L)
{
    Linklist p;
    p=L->next;
    while(p)
    {
        printf("%d ",p->number);
        p=p->next;
    }
}
//查找指定元素
bool linklistLocate(Linklist &L,int data)
{
    Linklist p;
    p=L->next;
    while(p)
    {
        if(p->number==data)
        {
            cout<<"已找到"<<data<<'\n';
            return true;
        }
        p=p->next;
    }
    cout<<"抱歉没有您要的值!"<<'\n';
    return false;
}
//指定位置插入指定元素
void linklistInsert(Linklist &L,int n,int data)
{
    Linklist p;
    p=L->next;
    for(int i=0; i<n-1; i++)
    {
        p=p->next;
    }
    Linklist q=(Linklist)malloc(sizeof(Node));
    q->number=data;
    q->next=p->next;//顺序不能颠倒
    p->next=q;
}
//删除指定元素
bool linklistDelete(Linklist &L,int data)
{
    Linklist p,q;//两个指针使p始终在q的前一个,这样方便删除q之后做好接下来的连接工作
    p=L;
    q=L->next;
    while(q)
    {
        if(q->number==data)
        {
            p->next=q->next;
            free(q);
            cout<<"找到并且删除!\n";
            return true;
        }
        p=q;//使p始终在q的前面
        q=q->next;
    }
    cout<<"不存在您找的值!\n";
    return false;
}
//清空链表
void linklistClear(Linklist &L)
{
    Linklist p=L;
    while(L)
    {
        L=L->next;//先移动L
        free(p);//再释放p
        p=L;//再移动p
    }
    cout<<"链表清空完毕!\n";
}
//菜单
void linklistMenu()
{
    cout<<"链表已经完成初始化"<<'\n';
    cout<<"1.头插法建立链表"<<"2.尾插法建立链表"<<'\n';
    cout<<"3.链表中插入数据"<<"4.删除指定数据"<<'\n';
    cout<<"5.查找指定元素"<<"6.清空链表"<<'\n';
    cout<<"7.遍历链表"<<'\n';

}
int main()
{
    int data,n,i;
    Linklist L;
    linklistIntit(L);
    while(1)
    {
        system("cls");//清屏

        linklistMenu();
        cin>>i;
        switch(i)
        {
        case 1:
            cout<<"请输入数量!"<<'\n';
            cin>>n;
           linklistheadCreat1(L,n);
            break;
        case 2:
            cout<<"请输入数量!"<<'\n';
            cin>>n;
            linklistheadCreat2(L,n);
            break;
        case 3:
            cout<<"请输入位置和新值!"<<'\n';
            cin>>n>>data;
           linklistInsert(L,n,data);
            break;
        case 4:
            cout<<"请输入要删除的值!"<<'\n';
            cin>>data;
           linklistDelete(L,data);
            break;
        case 5:
            cout<<"请输入要查找的值!"<<'\n';
            cin>>data;
            linklistLocate(L,data);
            break;
        case 6:
            linklistClear(L);
            break;
        case 7:
            linklistTreavle(L);
        }

        system("pause");//按任意键继续

    }
    return 0;
}

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值