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;
}

顺序表和单链表基本操作的实现相关推荐

  1. 数据结构实验二——建立具有至少10个元素的顺序表或单链表,并能对该表进行查找、删除等基本操作。

    结合实际应用,建立具有至少10个元素的顺序表或单链表,并能对该表进行查找.删除等基本操作. //主函数 #include"Sq.h" #include<stdio.h> ...

  2. 数据结构----顺序表与单链表(JAVA)

    下面为学习顺序表和单链表的一些基本操作函数: 1 public class SeqList<T> extends Object { 2 protected int n; 3 protect ...

  3. 数据结构——线性表:顺序表、单链表、双链表(C++)

    内容概要: 1.代码部分: 线性表抽象类 顺序表类 单链表类 双链表类 主函数 2.基本概念及注意事项 代码(测试环境VS2017): //线性表ADT类的定义:ADT_List.htemplate ...

  4. 数据结构个人笔记 第三课 顺序表和单链表

    数据结构个人笔记 第三课 顺序表和单链表 顺序表的基本操作 插入元素 删除元素 顺序表查找元素 顺序表更改元素 本节总结代码 单链表 链表的节点 头节点.头指针和首元结点 链表的创建(初始化) 本节总 ...

  5. 逆置单链表c语言程序,(数据结构C语言版)顺序表和单链表的逆置

    <(数据结构C语言版)顺序表和单链表的逆置>由会员分享,可在线阅读,更多相关<(数据结构C语言版)顺序表和单链表的逆置(7页珍藏版)>请在人人文库网上搜索. 1.实验1-1顺序 ...

  6. 线性表之顺序表与单链表的区别及优缺点

    这里比较的是基于C语言实现的顺序表与单链表,与其他语言的实现可能会有差异,但我相信语言是相通的,它们的实现机制应该也差不多. 1.What 什么是顺序表和单链表 ①顺序表: 顺序表是在计算机内存中以数 ...

  7. java如何给顺序表赋值_JAVA模拟新增顺序表及单链表

    最近在回顾大学学的数据结构,这里给大家用javwww.cppcns.coma模拟顺序表和单链表的新增 1顺序表新增 /** * 顺序www.cppcns.com表 * * @author cjd * ...

  8. 顺序表和单链表的插入删除操作时间复杂度的区别

    顺序表和单链表的插入删除操作时间复杂度的区别 最近在学习数据结构,看到如果需要用到大量的插入和删除操作,单链表的效率会高于顺序表.看到这里时内有有个疑惑,这两种数据结构的插入和删除操作的时间复杂度不都 ...

  9. 数据结构顺序表和单链表优缺点

    1:顺序表的优缺点:List 优点:顺序表示用地址连续的存储单元顺序存储线性表中的各个元素,逻辑上相领的数据元素在物理位置上也相领,因此,在顺序表中查找任何一个位置上的数据元素非常方便: 缺点:在顺序 ...

最新文章

  1. 李彦宏首次公布24字百度愿景,要做最懂用户的公司
  2. 理解SharePoint中的Managed Path
  3. C# 系统应用之Cookie\Session基础知识及php读取Cookie\Session
  4. oracle快速了解法,【oracle】rownum的快速了解
  5. const数组,strstr,strstr,
  6. c# xmlhttp POST提取远程webservice数据
  7. @Entity,@Indexed @XmlRootElement
  8. Android 开发之 fill_parent、wrap_content和match_parent的区别
  9. docker登录密码错误_Docker安装运行Mysql 5.7.31容器并修改数据库密码
  10. Java知多少(51)finally
  11. 密封槽设计标准_密封槽设计标准
  12. 【历史上的今天】9 月 3 日:谷歌发布 Android 10;微软收购诺基亚;eBay 诞生
  13. Linux-网络管理
  14. Linux基础8-TCP的面向链接(三次四次)
  15. 起底知网:大发学术财?学术富士康?定位偏差的知识工程?
  16. 前端构建工具gulpjs的使用介绍及技巧
  17. 敏捷开发的Scrum晨会实践
  18. c++/mfc 播放音乐,视频文件
  19. java API学习记录
  20. 【学习记录】图片局部放大

热门文章

  1. CAN总线,RS485总线终端电阻接线规则
  2. 微信小程序 数组(增,删,改,查)
  3. OFweek 2019智慧城市发展高峰论坛圆满举行
  4. basemap基础投影与地图样式
  5. 欢迎来到Jsp编程课时十二——今天实现的目标是。@1将数据库的数据发送到浏览器。@2利用浏览器实现对数据库的增删改查操作。@3理解MVC三层架构的定义。
  6. MySql高级部分<二>
  7. 注册商标遇到过哪些问题?
  8. 年度推荐书单:为你精选23本商业书
  9. “听相声的可以出去了,我们是来卖货的。”
  10. 显卡驱动导致的屏保运行假死