当前位置:   article > 正文

顺序表和单链表基本操作的实现_数据结构中在单链表l 中查找元素e的位置,查找成功,返回指向e的指针的代码如何写

数据结构中在单链表l 中查找元素e的位置,查找成功,返回指向e的指针的代码如何写

1、顺序表的建立、取指定元素、返回指定元素位置。

2、顺序表中插入新元素、删除指定元素操作的实现。

3、单链表的建立、取指定元素、返回指定元素位置。

4、单链表中插入新元素、删除指定元素操作的实现。

/*
该主要完成单链表中基本操作的实现,单链表中的元素类型为整型,共包含以下9个操作:

1、void InitList(LinkList &L)  //初始化单链表L
2、void CreateListF(LinkList &L,int n)  //前插法建单链表,要求使用[1,100]内的随机整数填充单链表L,参数n表示要向表中填充几个数据
3、void CreateListR(LinkList &L,int n)  //后插法建单链表,要求使用[1,100]内的随机整数填充单链表L,参数n表示要向表中填充几个数据
4、void CreateList(LinkList &L,int n)  //创建一个值递增有序的单链表L
5、void PrintList(LinkList L)    //输出单链表L 中各结点的值
6、int ListLength(LinkList L)  //求单链表L的长度
7、LNode *LocateElem(LinkList L,int e)  //在单链表L 中查找元素e的位置,查找成功,返回指向e的指针
8、bool ListInsert(LinkList &L,int i,int e)  //在单链表L的第i个结点前插入一个新元素e,插入成功,返回true,插入失败,返回false
9、bool ListDelete(LinkList &L,int i,int &e) //删除单链表L中第i 个结点,被删元素用参数e返回,删除成功,函数返回true,删除失败,函数返回false


本实验完成以后,请自行在此实验的基础上补充单链表其它基本操作的实现(例如:ClearList、PutElem、DestroyList、PriorELem、NextElem、GetElem等)
*/
#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;
typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,*LinkList;       //单链表表结构


//初始化单链表L
void InitList(LinkList &L)
{
    L=new LNode;//请同学们在此处把该操作补充完整
    L->next=NULL;
}

//前插法建表,要求使用[1,100]内的随机整数填充单链表L,参数n表示要向表中填充几个数据
//提示:生成[1,100]内的随机整数公式为: rand()%100+1 ,在使用rand()函数前要先使用srand(time(0))设置随机数种子 
void CreateListF(LinkList &L,int n)
{    
    int i;
    LinkList p;
    srand(time(0));
    L = (LNode *)malloc(sizeof(LNode));//请同学们在此处把该操作补充完整,然后再main里面调用并调试
    L->next=NULL;
    
    for(i=0;i<n;i++)
    {
        p = (LinkList)malloc(sizeof(LNode));
        p->data=rand() % 100 + 1 ;
        p->next=L->next;
        L->next=p;
    }
    
}

 
//后插法建表,要求使用[1,100]内的随机整数填充单链表L,参数n表示要向表中填充几个数据
void CreateListR(LinkList &L,int n)
{
    int i;
    LinkList p;
    srand(time(0));
    L = (LNode *)malloc(sizeof(LNode));//请同学们在此处把该操作补充完整,然后再main里面调用并调试
    L->next=NULL;
    LinkList r;
    r = (LNode *)malloc(sizeof(LNode));;
    r=L;
    for(i=0;i<n;++i)
    {
        p = (LNode *)malloc(sizeof(LNode));
        p->data=rand()%100+1;
        p->next=NULL;
        r->next=p;
        r=p;
    }
}

//选做
//创建一个值递增有序的单链表,请同学们补充此操作
void CreateList(LinkList &L,int n)
{
    LNode *p=L->next,*pre;
    LNode *r=p->next;  //r保持*p后继结点指针,以保证不断链 
    p->next=NULL;
    p=r;
    while(p!=NULL){
        r=p->next;  //保护*p的后继的结点指针 
        pre=L;
        while(pre->next!=NULL && pre->next->data < p->data)
            pre=pre->next;  //在有序表中查找插入*p的前驱结点*pre 
        p->next=pre->next;
        pre->next=p;
        p=r;
    }
}


//输出单链表L 中各结点的值 

void PrintList(LinkList L)
{

    LNode *p = L->next;
    while(p!=NULL)
    {
       printf("%d ", p->data);
       p=p->next;
    }    //请同学们在此处把该操作补充完整,并调试    
}

//求单链表L的长度 
int ListLength(LinkList &L)
{
    
    LNode *p;
    int count=0;
    p=L->next;
    while(p)
    {
        count++;
       p=p->next;
    }    //请同学们在此处把该操作补充完整,并调试
    return count;    
}


//在单链表L 中查找元素e的位置,查找成功,返回指向e的指针
LNode *LocateElem(LinkList L,int e)
{
    LNode *p;
    p=L->next;//请同学们在此处把该操作补充完整,并调试
    while(p && p->data!=e)
    p=p->next;
    return p;
}

//在单链表L的第i个结点前插入一个新元素e,插入成功,返回true,插入失败,返回false
bool ListInsert(LinkList &L,int i,int e)
{
    L = (LNode *)malloc(sizeof(LNode));
    LNode *p;//请同学们在此处把该操作补充完整,并调试
    p = (LNode *)malloc(sizeof(LNode));
    p=L;
    int j=0;
    while(p && (j<i-1))
    {    p=p->next;
        ++j;
    }
    if(!p||j>i-1)  return false;
    LNode *s;
    s = (LNode *)malloc(sizeof(LNode));;
    s->data=e;
    s->next=p->next;
    p->next=s;
    return true;
}

//删除单链表L中第i 个结点,被删元素用参数e返回,删除成功,函数返回true,删除失败,函数返回false
bool ListDelete(LinkList &L,int i,int &e)
{
    LNode *p;//请同学们在此处把该操作补充完整,并调试
    p=L;
    int j=0;
    while(p && (j<i-1))
    {    p=p->next;
        ++j;
    }
    if(!(p->next)||(j>i-1) ) return false;
    LNode *q;
    q=p->next;
    p->next=q->next;
    e=q->data;
    delete q;
    return true;
}
//操作菜单
void showmenu()
{    
    cout<<endl;
    cout<<"**************************顺序表基本操作*************************"<<endl;
    cout<<"1、头插法建表"<<endl;
    cout<<"2、尾插法建表"<<endl;
    cout<<"3、求单链表长度"<<endl;
    cout<<"4、在单链表中查找指定元素"<<endl;
    cout<<"5、在单链表中第i个结点前插入一个新结点"<<endl;
    cout<<"6、删除单链表中第i个结点"<<endl;
    cout<<"7、输出单链表"<<endl;
    cout<<"8、退出"<<endl;
    cout<<endl;      
}

int main()
{
    LinkList L;       //定义单链表的头指针L
    int n,e,pos,flag,k; 
    LNode *p;
    InitList(L);    //初始化单链表L
    cout<<"单链表L初始化成功"<<endl;
    
    //循环显示菜单,完成顺序栈的一系列操作
    do{
        showmenu();    
        cout<<"请选择要执行的操作序号"<<endl;
        cin>>k;    //k表示用户选择的操作序号
        switch(k)
        {
        case 1:    //执行入栈操作
            cout<<"请输入要创建的单链表的长度"<<endl;
            cin>>n;        //变量n表示要输入到单链表中的元素个数
            CreateListF(L,n);   //向L中填充n个随机整数
            cout<<"单链表L创建成功!"<<endl;
            break;
        case 2:   //执行出栈操作
            cout<<"请输入要创建的单链表的长度"<<endl;
            cin>>n;        //变量n表示要输入到单链表中的元素个数
            CreateListR(L,n);   //向L中填充n个随机整数
            cout<<"单链表L创建成功!"<<endl;
            break;
        case 3:   //输出顺序栈的长度及栈中的元素
            cout<<"单链表L的长度为:"<<ListLength(L)<<endl;
            break;
        case 4:    //输出栈顶元素
            cout<<"请输入要查找的元素的值"<<endl;
            cin>>e;           //变量e表示要查找的元素
            p=LocateElem(L,e);   //在L中查找元素e的位置,p表示查找结果,或为NULL,或为非NULL
            if(p) cout<<"查找成功"<<endl;
            else cout<<"表中没有值为"<<e<<"的结点"<<endl;
            break;
        case 5:    //输出栈顶元素
            cout<<"请输入插入位置及插入的值"<<endl;
            cin>>pos>>e;      //输入向L中插入元素的位置及值
            flag=ListInsert(L,pos,e);   //在单链表L的第pos个位置插入值e,flag表示插入操作结果,或为true,或为false
            if(flag)       //判断插入操作是否成功
                cout<<"插入操作成功!"<<endl;
            else
                cout<<"插入失败!"<<endl;
            break;
        case 6:    //输出栈顶元素
            cout<<"请输入删除元素的位置"<<endl;
            cin>>pos;       //输入删除位置
            flag=ListDelete(L,pos,e);     //删除单链表L中第pos个元素,被删元素的值用e返回,flag表示删除操作结果,或为true,或为false
            if(flag)       //判断删除操作是否成功
                cout<<"删除操作成功,被删元素为:"<<e<<endl;  //输出被删元素的值
            else
                cout<<"删除位置错误,操作失败!"<<endl;
            break;
        case 7:
            cout<<"表中元素为:"<<endl;
            PrintList(L);      //输出顺序表L中的元素
            break;
        case 8:
            cout<<"谢谢使用,再见!"<<endl;
            break;
        default:
            cout<<"操作序号错误,请输入正确的操作序号!"<<endl;
            break;         
        }//switch
    }while(k!=8);
    return 1;
}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/590852
推荐阅读
相关标签
  

闽ICP备14008679号