单链表的基本实现

Posted dkbob

tags:

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

编程过程:

1:动笔加思考(最重要的是思考,别直接去看别人的代码实现)

2:上机敲代码

3:查看运行结果

4:操作有问题则针对每个操作仔细分析

5:百思不得其解则百度或者查阅资料

#include<iostream>
using namespace std;

//单链表基本操作的实现
//头结点存放表长等数据;
//头指针可指向首元节点,头结点

typedef struct list 
{
    int age;
    struct list* next;
}lnode, *linklist;

void initiallist(linklist &l)
{

    l->next = NULL;
    cout << "初始化成功" << endl;
    return;
}//单链表的初始化

void listisempty(linklist &l)
{
    if (l->next == NULL)
    {
        cout << "该表是空表" << endl;
        return;
    }
    else
        cout << "该表不是空表" << endl;
    return;
}//判断单链表是不是空表

void listdestory(linklist& l)
{
    list * lnode;
    lnode = l;
    while (l)//不能用l;
    {
        lnode = l;
        l = l->next;
        delete lnode;
    }
}//单链表的销毁操作//头指针头结点都不存在;


void listempty(linklist& l)
{

    
    list* p,* q;
    p=l->next;
    while(p)
{
  q=p->next;
  delete p;
  p=q;
}
l->next=NULL; 
}
//只保留头结点和destory区别开来;

int  listlength(linklist& l)
{
    list *p;
    p=l->next;
    int length=0;
    while(p)
    {
    length++;
    p=p->next;
    }
    return length;
}//求单链表的长度:


void listfind1(linklist& l)
{
    int t;
    int i;
    linklist p;
    p = l;
    cout << "请输入你要查找元素的位置" << endl;
    cin >> t;
    if (t < 1 || t>listlength(l))
    {
        cout << "error" << endl;
        return;
    }
    else
    {
        for (i = 1; i <= t; i++)
        {
            p = p->next;
        }
        cout << "第i个位置的元素为" << p->age << endl;
        return;
    }
}//取第i个位置的元素;

void listfind2(linklist& l)
{
    int t;
    int i = 1;
    linklist p;
    p = l->next;
    cout << "请输入查找元素的值" << endl;
    cin >> t;
    for (i = 1; i <= listlength(l); i++)
    {
        if (p->age == t)
        {
            break;
        }
        else
        {
            p = p->next;
        }
    }
    cout << "查找到其位置是" << i << endl;
}//按值查找元素位置

void listinsert(linklist& l)
{
    int t, i;//i为计数器
    linklist  p;
    p = l->next;//指向首元结点
    linklist m=new list;
    
    cout << "请输入新结点的数据的年龄" << endl;
    cin >> m->age;

    cout << "请输入插入结点的位置" << endl;
    cin >> t;//要找到t-1结点位置;
    
    for (i = 1; i < t - 1; i++)
    {
        p = p->next;
    }
    m ->next= p->next;
    p->next = m;

}//在第i个结点前插入


void listdelete(linklist& l)
{

    int t,i=1;
    linklist p;
    linklist q;
    p = l;
    cout << "请输入删除结点的位置" << endl;
    cin >> t;
    if (t == 1)
    {
        p->next = p->next->next;
    }

    else if (t==listlength(l))
    {
        for (i = 1; i <=t-1; i++)
        {
            p = p->next;
        }
        p->next = NULL;
    }


    else if (t > 1 && t < listlength(l))
    {
        for (i = 1; i<=t-1; i++)
        {
            p = p->next;
        }
        q = p->next;
        cout << "删除结点的数据为" << q->age << endl;//输出结点数据
        p->next = p->next->next;
        delete q;//把删除结点删除
    }
}//删除某个结点


void inserthead(linklist& l)
{
    int count,i;
    cout << "请输入创建节点个数" << endl;
    cin >> count;
    for (i=1; i <= count; i++)
    {
        linklist p=new list;
        cout << "请输入第" << i << "个结点的年龄" << endl;
        cin >> p->age;
        p->next = l->next;
        l->next = p;
    }
}//头插法

void insertrear(linklist& l)
{

    linklist t;
    int i;
    t = l;
    int j;
    cout << "请输入结点个数" << endl;
    cin >> j;
    
    for (i = 1; i <= j; i++)
    {
        linklist p = new list;
        cout << "请输入第"<<i<<"个结点的年龄" << endl;
        cin >> p->age;
        t->next = p;

        t = p;
    }
    t->next = NULL;
}//尾插法

void listallput( linklist& l)
{
    linklist p;
    int i = 1;
    p = l->next;
    cout << "如果为头插法则最后输入最先输出" << "尾插法则反之" << endl;
    while (p)
    {
        cout <<"第"<<i<<"个数据为"<< p->age << endl;
        p = p->next;
        i++;
    }
}//将整个链表的数据输出


void insertleast(linklist& l)
{
    linklist p;
    p = l;
    linklist q = new list;
    cout << "请输入结点的数据" << endl;
    cin >> q->age;
    if (p ->next== NULL)
    {
        p->next = q;
        q->next = NULL;
    }
    else
    {
        while (p->next != NULL)
        {
            p = p->next;
        }
        q->next = p->next;
        p->next = q;
    }
}//链表最后插入数据

int main()
{

    list* head;
    head = new list;

    int i, j, m;
    cout << "请输入下列选项" << endl;
    cout << "1:链表初始化" << "2:链表头插法" << "3:链表尾插法" << endl;
    cout << "4:在某结点前插入" << "5:删除某结点" << endl;
    cout << "6:根据位置查找元素的信息" << "7:根据元素的信息查找元素的位置" << endl;
    cout << "8:链表的销毁" << "9:链表清空保留头结点" <<"10:判断链表是否为空链表" << endl;
    cout <<  "11:求链表的长度" <<"12:链表全部输出"<< "13:在链表最后插入结点"<<endl;
    cin >> m;

    while (1)
    {

        switch (m)
        {
        
    case 1:initiallist(head); break;//head 初始化的话不能对其内容赋值操作;如果形参用&可以不初始化
    case 2:inserthead(head); break;//头插法
    case 3:insertrear(head); break;//尾插法
    case 4:listinsert(head); break;//在某结点前插入
    case 5:listdelete(head);    break;//删除某个结点
    case 6 :listfind1(head); break;//根据位置查找元素的信息
    case 7:listfind2(head); break;//根据元素的信息查找元素的位置
    case 8:listdestory(head); break;//链表的销毁
    case 9:listempty(head); break;//链表清空保留头结点
    case 10:listisempty(head); break;//判断链表是否为空链表
    case 11:cout << "链表长度为" << listlength(head) << endl; break;//求链表的长度
    case 12:listallput(head); break;
    case 13:insertleast(head); break;
        }

        cout << "退出请输入0" << endl;
        cin >> m;
        if (m == 0)
        {
            break;
        }

}
    cout << "谢谢您的使用" << endl;
    return 0;

}
————————————————
版权声明:本文为CSDN博主「迪克鲍勃必须勃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_52913841/article/details/117229090

以上是关于单链表的基本实现的主要内容,如果未能解决你的问题,请参考以下文章

单链表基本操作

用Java实现单链表的基本操作

数据结构单链表的介绍和基本操作(C语言实现)保姆级别详细教学

单链表的基本实现

Day2:单链表的基本操作

单链表的基本操作实现