• 数据结构上机实验:单链表操作


    #include <iostream>
    #include <malloc.h>
    using namespace std;
    
    typedef struct Node
    {
        char c;
        struct Node *next;
    }*LinkList,LNode;
    
    //初始化单链表h
    LinkList Init(LinkList &h)
    {
        h=(LNode*)malloc(sizeof(LNode));
        if(h==NULL)
        {
            cout<<"没有足够的内存空间"<<endl;
            exit(0);
        }
        h->next=NULL;
        return h;
    }
    //尾差法插入元素
    void InsertNum(LinkList &h,int n)
    {
        LinkList r,s;
        r=h;
        for(int i=0;i<n;i++)
        {
            s=(LNode*)malloc(sizeof(LNode));
            r->next=s;
            cin>>s->c;
            r=s;
        }
        r->next=NULL;
    }
    //输出单链表h
    void outputLinkList(LinkList h)
    {
        LinkList p=h->next;
        while(p!=NULL)
        {
            cout<<p->c<<" ";
            p=p->next;
        }
    }
    //求单链表h的长度
    int GetLength(LinkList h)
    {
        LinkList p;
        p=h->next;
        int count=0;
        while(p!=NULL)
        {
            count++;
            p=p->next;
        }
        return count;
    }
    //输出单链表的长度
    void outputListLength(LinkList h)
    {
        cout<<"当前链表的长度为: "<<GetLength(h)<<endl;
    }
    //判断单链表h是否为空表
    void Empty(LinkList h)
    {
        if (h->next==NULL)
            cout<<"该链表为空!"<<endl;
        else
            cout<<"该链表不为空!"<<endl;
    }
    //输出单链表h的第n个元素
    void outputNthNum(LinkList h,int n)
    {
        int curLen=GetLength(h);
        if(n<=0||n>curLen)
        {
            cout<<"位置输入错误!"<<endl;
            exit(0);
        }
        else
        {
            LinkList p=h->next;
            for(int i=1;i<n;i++)
            {
                p=p->next;
            }
            cout<<"该链表的第"<<n<<"个元素为: "<<p->c<<endl;
        }
    }
    //输出元素a的位置
    void outputNumPosition(LinkList h,char a)
    {
        LinkList p=h->next;
        int position=1;
        while(p!=NULL)
        {
            if(p->c==a)
            {
                cout<<"元素"<<a<<"在链表中的位置为 :"<<position<<endl;
            }
            p=p->next;
            position++;
        }
        if(position-GetLength(h)>1)
            cout<<"元素"<<a<<"在链表中不存在!"<<endl;
    }
    //在第N个位置上插入元素f
    void InsertNumOnth(LinkList &h,int n,char a)
    {
        int len=GetLength(h);
        if(n<=0||n>len)
        {
            cout<<"位置错误,不能插入!"<<endl;
            exit(0);
        }
        else
        {
            LinkList p=h->next;
            LinkList temp;
            temp=(LNode*)malloc(sizeof(LNode));
            if(n==1)
            {
                temp->next=p;
                h->next=temp;
                temp->c=a;
            }
            else
            {
                for(int i=2;i<n;i++)
                {
                    p=p->next;
                }
                temp->next=p->next;//3
                p->next=temp;
                temp->c=a;
            }
        }
    }
    //删除链表的第n个元素
    void deleteNthNum(LinkList &h,int n)
    {
        if(n<=0||n>GetLength(h))
        {
            cout<<"删除位置输入错误!"<<endl;
            exit(0);
        }
        else
        {
           int j=0;
           LinkList p=h,q;
           while(j<n-1&&p!=NULL)
           {
               j++;
               p=p->next;
           }
           q=p->next;
           p->next=q->next;
           free(q);
        }
    }
    //释放链表
    void freeList(LinkList &h)
    {
        free(h);
    }
    
    int main()
    {
        LinkList h;
        cout<<"欢迎进入单链表操作程序,本程序提供以下操作:"<<endl;
        cout<<endl;
        cout<<"1.初始化链表           2.插入n个元素           3.输出单链表"<<endl;
        cout<<"4.输出单链表的长度     5.输出链表的第n个元素   6.输出元素a的位置"<<endl;
        cout<<"7.判断链表是否为空     8.在第n个位置插入元素f  9.删除第n个元素"<<endl;
        cout<<endl;
        cout<<"输入数字1~8选择您的操作,输入0退出本系统!(为保证程序顺利运行,已默认执行初始化操作)"<<endl;
        cout<<"请输入数字:"<<endl;
        int op;
        Init(h);
        while(cin>>op&&op)
        {
            switch(op)
            {
            case 2:
                {
                    int n;
                    cout<<"输入n的值:";cin>>n;
                    cout<<"输入插入的n个数的值:";
                    InsertNum(h,n);
                    cout<<"插入成功!"<<endl;
                    break;
                }
            case 3:
                {
                    cout<<"当前链表为:"; outputLinkList(h);
                    cout<<endl;break;
    
                }
            case 4:
                {
                    outputListLength(h);break;
                }
            case 5:
                {
                    int n;
                    cout<<"输入n的值:";cin>>n;
                    outputNthNum(h,n);break;
                }
            case 6:
                {
                    char a;
                    cout<<"输入a的值:";cin>>a;
                    outputNumPosition(h,a);break;
                }
            case 7:
                {
                    Empty(h);break;
                }
            case 8:
                {
                    int n;char f;
                    cout<<"输入n的值: ";cin>>n;
                    cout<<"输入f的值: ";cin>>f;
                    InsertNumOnth(h,n,f);
                    cout<<"插入成功!"<<endl;
                    break;
                }
            case 9:
                {
                    int n;
                    cout<<"输入n的值: ";cin>>n;
                    deleteNthNum(h,n);
                    cout<<"删除成功!"<<endl;
                    break;
                }
            }
        }
        return 0;
    }
    


    运行:

  • 相关阅读:
    20162317袁逸灏 第十六周实验报告:实验五 网络编程与安全
    20162317-20162315结对编程-四则运算(挑战出题)
    第十四周实验报告:实验四 Android程序设计
    20162305 2016-2017-2 《程序设计与数据结构》第9周学习总结
    20162305 2016-2017-2 《程序设计与数据结构》第8周学习总结
    20162305 实验二 Java面向对象程序设计 实验报告
    20162305 2016-2017-2 《程序设计与数据结构》第7周学习总结
    20162305 2016-2017-2 《程序设计与数据结构》第6周学习总结
    20162305 2016-2017-2 《程序设计与数据结构》第5周学习总结
    20162305 李昱兴 实验报告一
  • 原文地址:https://www.cnblogs.com/sr1993/p/3697947.html
Copyright © 2020-2023  润新知