单链表的基本操作(初始化,建表,遍历,增加,删除,查找,逆序)等操作

    单链表是学习数据结构的基础,一些简单的操作还是要熟练掌握

    头文件list.h

//list.h
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#include <iostream>
using namespace std;

//定义节点结构体
typedef struct LNode
{
    int data;
    struct LNode * next;
}LNode,*LinkList;

//函数声明
LinkList LinkListInit();
void showmeu();
void CreateList(LNode *);
void printList(LNode *);
void addNode(LNode *);
void deleteNode(LNode *);
void searchNode(LNode *);
void reverList(LNode *);
void select(LNode *);

    源文件

//list.cpp
#include "list.h"
//list practice

//main函数
int main()
{
    LinkList head=LinkListInit();
    select(head);

    return 0;
}

//链表初始化
LinkList LinkListInit()
{
    LinkList pHead;
    pHead=(LinkList)malloc(sizeof(LNode));

    if(pHead==NULL)
    {
        cout<<"初始化失败!";
        exit(-1);
    }
    //初始化成功
    cout<<"初始化链表成功!"<<endl;
    pHead->next=NULL;
    
    return pHead;
}

void showmeu()
{
    cout<<endl<<"***************菜单,选择操作**********************"<<endl;
    cout<<"1.新建链表"<<endl;
    cout<<"2.遍历链表"<<endl;
    cout<<"3.添加节点"<<endl;
    cout<<"4.删除节点"<<endl;
    cout<<"5.查找节点"<<endl;
    cout<<"6.逆序链表"<<endl;
    cout<<"7.退出"<<endl;
    cout<<"******************************************************"<<endl;
}

void select(LNode *head)
{
    int selection;
    while(1)
    {
//        system("cls");//清屏
        showmeu();
        cout<<endl<<"请选择你的操作:";
        cin>>selection;
        switch(selection)
        {
            case 1:
                CreateList(head);break;
            case 2:
                printList(head);break;
            case 3:
                addNode(head);break;
            case 4:
                deleteNode(head);break;
            case 5:
                searchNode(head);break;
            case 6:
                reverList(head);break;
            case 7:
                exit(-1);
                
        }

    }

}

//创建链表
void CreateList(LNode * head)
{
    int n;
    int x;
    LinkList p=head;
    cout<<"请输入节点个数:";
    cin>>n;
    if(n<=0)
        exit(-1);
    for(int i=1;i<=n;i++)
    {
        LinkList q=(LinkList )malloc(sizeof(LNode));
        
        cout<<"请输入第"<<i<<"个节点值:";
        cin>>x;
        q->data=x;
        q->next=NULL;
        //关键的两句,用尾插法
        p->next=q;
        p=q;
    }
    cout<<"创建链表成功!"<<endl;
}

//遍历链表
void printList(LNode * head)
{
    LinkList p=head->next;
    if(p==NULL)
        cout<<"该链表还没有节点元素"<<endl;
    cout<<"遍历的结果是:"<<endl;
    while(p!=NULL)
    {
        cout<<p->data<<"  ";
        p=p->next;
    }
}
int getlistlong(LNode * head)
{
    LinkList p=head->next;
    int n=0;
    if(p==NULL)
        return 0;
    while(p!=NULL)
    {
        n++;
        p=p->next;
    }
    return n;
}

//插入节点
void addNode(LNode * head)
{
    int n;
    int x;
    int length=getlistlong(head);
    if(head==NULL)
        cout<<"请先创建头节点"<<endl;
    else
    {
        cout<<"请输入要插入的位置:";
        cin>>n;
        if(n>length)
        {    cout<<"因为要插入的位置比最后的位置还要大,已经为你插入到最后的位置"<<endl;
            n=length+1;
        }

        if(n<=0)
            cout<<"请输入大于0的位置"<<endl;

        cout<<"请输入要插入的值:";
        cin>>x;
        LinkList p=(LinkList)malloc(sizeof(LNode));
        p->data=x;

        LinkList q=head;

        for(int i=1;i<n;i++)
        {
            q=q->next;
        }
        p->next=q->next;
        q->next=p;

        cout<<"插入成功!"<<endl;
    }
    
}

//删除节点
void deleteNode(LNode * head)
{
    LinkList p;    //要删除的元素
    int n;
    if(head==NULL || head->next==NULL)
        cout<<"链表为空或长度为0,不能删除链表"<<endl;
    else
    {
        cout<<"请输入要删除的位置:";
        cin>>n;
        if(n<=0)
            cout<<"链表为空或长度为0,不能删除链表"<<endl;
        else
        {
            LinkList q=head;
            for(int i=1;i<n;i++)
            {
                q=q->next;
            }
            p=q->next;
            q->next=q->next->next;
            cout<<"删除的元素是:"<<p->data<<endl;
        }        
    }
}

//查找节点
void searchNode(LNode * head)
{
    LinkList p=head;
    int n=0;
    int x;
    cout<<"输入你要寻找的节点:";
    cin>>x;
    if(head==NULL || head->next==NULL) //若头节点为空,或后面也指向一个空的节点
        cout<<"链表为空,没有你要找的节点:"<<endl;
    else
    {
        while(p->next!=NULL)
        {
            if(p->data==x)
            {
                cout<<"找到你要找的节点的位置了,它在"<<n<<"个位置"<<endl;
                break;
            }
            else
            {
                p=p->next;
                n++;
            }
            if(p==NULL)
                cout<<"没有找到你要的这个节点!"<<endl;
        }
    }
}

//链表逆序
void reverList(LNode * head)
{
    LinkList p=NULL;
    LinkList q=NULL;
    if(head == NULL)
    {
        cout<<"链表为空,不需逆序!"<<endl;
    }
    p=head->next;
    while(p->next != NULL)
    {
        q=p->next;
        p->next=q->next;
        q->next=head->next;
        head->next=q;
    }
    cout<<"逆序成功,现在的链表的顺序是:"<<endl;
    printList(head);
    
}

运行结果:

单链表的基本操作(初始化,建表,遍历,增加,删除,查找,逆序)等操作


你可能感兴趣的:(单链表的基本操作(初始化,建表,遍历,增加,删除,查找,逆序)等操作)