数据结构 单链表

做一个豁达而努力的自己。

单链表的定义:单链表连式存储的数据结构,是用任意的存储位置存储数据。

线性表的单链表存储结构:

typedef struct Node

{

    ElemType data;

    struct Node *next;

}Node, *LinkList;

无论链表是否为空,头指针均不为空,头指针是链表的必要元素。

生成头指针:LinkList head;

头结点可以不存储数据,同时它可以存储链表的长度等信息,但不是链表的必要元素。

生成头结点:L = new Node;

#include <iostream>
#include <cstdlib>
using namespace std;

//单链表结构的定义
typedef struct Node
{
    int data;
    struct Node *next;
}*LinkList;
//单链表的初始化
bool InitList(LinkList &L)
{
    L = new Node;   //生成头节点,头指针指向头结点
    if(!L)
        return false;
    L->next = NULL;
    return true;
}
//单链表的创建(头插法,输入顺序与输出顺序相反)
void CreateList_H(LinkList &L)
{
    int n;
    LinkList s; //s为存放新节点的指针
    cout << "输入要存放的数据元素个数:";
    cin >> n;
    while(n--)
    {
        s = new Node;
        cout << "输入int型数据:";
        cin >> s->data;
        s->next = L->next;   //新节点指向头结点指向的节点
        L->next = s; //头结点指向新节点
    }
}
//单链表的创建(尾插法)
void CreateList_T(LinkList &L)
{
    int n;
    LinkList s, r;  //s为存放新节点的指针,r存放尾指针
    r = L; //尾指针指向头结点
    cout << "输入要存放的数据元素个数:";
    cin >> n;
    while(n--)
    {
        s = new Node;
        cout << "输入int型数据:";
        cin >> s->data;
        s->next = NULL;
        r->next = s;
        r = s;
    }
}
//单链表的查找
bool GetList(LinkList L, int i, int &e)
{
    int j = 1;
    LinkList p;
    p = L->next;
    while(p && j < i)
    {
        p = p->next;
        j++;
    }
    if(!p || j > i)
        return false;
    e = p->data;
    return true;
}
//单链表的插入
bool InsertList(LinkList &L, int i, int e)
{
    int j = 1;
    LinkList s, p;
    p = L;
    while(p && j < i)    //循环到i-1的数据节点
    {
        p = p->next;
        j++;
    }
    if(!p || j > i)
        return false;
    s = new Node;
    s->data = e;
    s->next = p->next;
    p->next = s;
    return true;
}
//单链表的删除
bool DeleteList(LinkList &L, int i)
{
    int j = 1;
    LinkList p,q;
    p = L;
    while(p->next && j < i)
    {
        p = p->next;
        j++;
    }
    if(!(p->next) || j > i)
        return false;
    q = p->next;
    p->next = q->next;
    delete q;
    return true;
}
//单链表的销毁
void DestroyList(LinkList &L)
{
    LinkList p, q;
    p = L->next;
    while(p)
    {
        q = p->next;
        delete p;
        p = q;
    }
    L->next = NULL; //头指针指针域为空
}
//单链表的输出
void PutList(LinkList L)
{
    cout << "元素数据:" << endl;
    LinkList p;
    p = L->next;
    while(p)
    {
        cout << p->data << endl;
        p = p->next;
    }
}
//菜单
void menu()
{
    cout << "1.单链表的初始化" << endl;
    cout << "2.单链表的头插发创建" << endl;
    cout << "3.单链表的尾插法创建" << endl;
    cout << "4.单链表的查找" << endl;
    cout << "5.单链表的插入" << endl;
    cout << "6.单链表的删除" << endl;
    cout << "7.单链表的销毁" << endl;
    cout << "8.单链表的输出" << endl;
    cout << "0.退出单链表" << endl;
}
int main()
{
    LinkList head;  //生成头指针,存放的是头结点或首元结点的指针
    int e, i;
    bool n;
    int num = -1;
    while(num != 0)
    {
        system("cls");
        menu();
        cout << "请选选项:";
        cin >> num;
        switch(num)
        {
            case 1: n = InitList(head);
                    if(n == 0)
                        cout << "初始化失败" << endl;
                    else
                        cout << "初始化成功" << endl;
                        break;
            case 2: CreateList_H(head);
                    cout << "头插法创建成功" << endl;
                    break;
            case 3: CreateList_T(head);
                    cout << "尾指针创建成功" << endl;
                    break;
            case 4: cout << "请输入要查找的位置:";
                    cin >> i;
                    n = GetList(head, i, e);
                    if(n == 0)
                        cout << "查找失败" << endl;
                    else
                    {
                        cout << "查找结果:";
                        cout << e << endl;
                    }
                    break;
            case 5: cout << "请输入要插入的位置:";
                    cin >> i;
                    cout << "请输入int型数据:";
                    cin >> e;
                    n = InsertList(head, i, e);
                    if(n == 0)
                        cout << "插入失败" << endl;
                    else
                        cout << "插入成功" << endl;
                    break;
            case 6: cout << "请输入删除位置:";
                    cin >> i;
                    n = DeleteList(head, i);
                    if(n == 0)
                        cout << "删除失败" << endl;
                    else
                        cout << "删除成功" << endl;
                    break;
            case 7: DestroyList(head);
                    break;
            case 8: PutList(head);
                    break;
            case 0: break;
            default : "没有输入选项";
        }
        system("pause");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37043100/article/details/79537822