单链表的增、删、改、查多种功能的实现(c++语言)

来源:互联网 发布:有java基础学python 编辑:程序博客网 时间:2024/05/29 14:04

】以下是在单链表中进行增、删、改、查等功能的c++代码实现,代码不多,带有详细注解,希望读者能够耐心的看完,同是也希望自己的努力能帮助到初学者和对此有疑问的人,不喜勿喷,若有错误之处,请多多指点,谢谢!

#include <iostream>

#include <cstdlib>
#define OK 1
#define ERROR 0
typedef char ElemType;
using namespace std;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode, *LinkList;

void Create_HLinkList(LinkList L)//头插法建表
{
    LinkList p;
    p -> next = NULL;
    char ch;
    while(cin >> ch && ch != '#')
    {
        if(!p)
        {
            cout << "创建链表失败" << endl;
            exit(ERROR);
        }
        p = (LinkList)malloc(sizeof(LNode));
        p -> data = ch;
        p -> next = L -> next;//将L作为头指针,新建节点p始终插在链表的最左端即链表头部
        L -> next = p;
    }
}
void Create_ELinkList(LinkList L)//尾插法建表
{
    LinkList p;
    char ch;
    cout << "向链表添加元素,并以#号键结束!" << endl;
    while(cin >> ch && ch != '#')
    {
        p = (LinkList)malloc(sizeof(LNode));
        if(!p)
        {
            cout << "创建链表失败" << endl;
            exit(ERROR);
        }
        p -> data = ch;
        p -> next = NULL;//将新建节点p的指针域设置为空即使新建节点始终插在链表尾部作为为节点
        L -> next = p;//使指针指向新建节点p
        L = p;//让指针L后移一位,此时指针L相当于一个游标,可遍历整个链表
    }
    L -> next = NULL;
}

void Output_LinkList(LinkList L)
{
    LinkList p;
    p = L -> next;
    if(p == NULL)
    {
        cout << "链表为空!" << endl;
        exit(ERROR);
    }
    while(p != NULL)
    {
        cout << p -> data << " ";
        p = p -> next;
    }
    cout << endl;
}

void Insert_LinkList(LinkList L, int i, ElemType e)//向链表插入新元素
{
    LinkList p, h;
    h = (LinkList)malloc(sizeof(LNode));
    int k;
    char ch;
    int j = 0;
    if(i <= 0)
    {
        cout << "输入位置非法,过小,请重新输入!" << endl;
        cin >> k >> ch;
        Insert_LinkList(h, k, ch);
    }
    while(L -> next != NULL && j < i - 1)
    {
        L = L -> next;
        j++;
    }//找到指定位置的前一个节点
    p = (LinkList)malloc(sizeof(LNode));
    p -> data = e;//将将要插入链表的元素存入到新建节点的数据域中
    p -> next = L -> next;//将新建节点插入指定位置
    L -> next = p;//令指定位置的前一个节点指向新建节点,即完成了插入操作
}
void Delete_LinkList(LinkList L, int i)//删除指定元素
{
    //LinkList p;
    int j = 0;
    while(L -> next != NULL && j < i - 1)
    {
        L = L -> next;
        j++;
    }//找出指定位置的前一个节点
    //p = L -> next;
    //L -> next = p -> next;
    //free(p);
    L -> next = L -> next -> next;//令指定位置的前一个节点指向指定位置的后一个节点,即完成了删除操作
}

void Update_LinkList(LinkList L, int k, ElemType e)//修改指定元素为指定常量
{
    int j = 0;
    while(L -> next != NULL && j < k)
    {
        L = L ->next;
        j++;
    }//找到指定元素的位置
    L -> data = e;//进行了元素修改
}

void Lookup1_LinkList(LinkList L, int l)//查看指定位置元素,注意这里的位置为逻辑位置,即先后顺序
{
    int j = 0;
    if(L -> next == NULL)
    {
        cout << "链表为空!" << endl;
        exit(ERROR);
    }
    while(L -> next != NULL)
    {
        if(j == l)
        {
             cout << L -> data << endl;
             break;
        }
        else
        {
            L = L -> next;
            j++;
        }
    }
}

void Lookup2_LinkList(LinkList L, ElemType e)//查看指定元素的位置,注意这里的位置为逻辑位置,即顺序
{
    int j = 0;
    if(L -> next == NULL)
    {
        cout << "链表为空!" << endl;
        exit(ERROR);
    }
    while(L -> next !=NULL)
    {
        if(L -> next -> data == e)//因为L为头指针,所以在遍历每个节点所存元素的时候应为L->next->data
        {
            cout << j + 1 << endl;
            break;
        }
        else
        {
            L = L -> next;
            j++;
        }
    }
}

int main()
{
    while(1)
    {
        LinkList H;
        int n, i, j, k, l;
        char e, m, ch;
        H = (LinkList)malloc(sizeof(LNode));
        H -> next = NULL;
        cout << "1.头插法建表,2.尾插法建表,0.结束操作" << endl;
        cin >> n;
        if(n == 1)
        {
            Create_ELinkList(H);
            Output_LinkList(H);
        }
        else if(n == 2)
        {
            Create_ELinkList(H);
            Output_LinkList(H);
        }
        else if(n == 0)
            break;
        else
            continue;
        cout << "输入插入元素的位置和元素:" << endl;
        cin >> i >> e;
        Insert_LinkList(H, i, e);
        Output_LinkList(H);
        cout << "输入删除元素的位置:" << endl;
        cin >> j;
        Delete_LinkList(H,j);
        Output_LinkList(H);
        cout << "输入修改元素的位置和将要修改为的元素:" << endl;
        cin >> k >> m;
        Update_LinkList(H,k,m);
        Output_LinkList(H);
        cout << "输入查找的位置:" << endl;
        cin >> l;
        Lookup1_LinkList(H, l);
        cout << "输入查找的元素:" << endl;
        cin >> ch;
        Lookup2_LinkList(H, ch);
    }
    return 0;
}

0 0