线性表的基本操作

来源:互联网 发布:java实现线程安全 编辑:程序博客网 时间:2024/05/16 14:15

实验目的:了解线性表的基本概念,掌握线性表的两种存储结构——顺序存储和链式存储,掌握在两种存储结构上实现线性表的基本操作,掌握用C上机调试线性表操作的基本方法。
实验内容:
a.输入一组整型元素序列,建立线性表。
b.实现该线性表的遍历。
c.在该线性表中查找某一元素,查找成功显示查找元素,否则显示查找失败。
d.在该线性表中删除或插入指定元素。
实验要求:分别采用线性表的两种存储结构(顺序存储结构、链式存储结构)来实现以上基本操作。

顺序表

#include<stdio.h>#include<iostream>#include<stdlib.h>#include<iomanip>#define LIST_INIT_SIZE 5#define LISTINCREMENT 10using namespace std;typedef struct{    int *elem;    int length;    int listsize;}SqList;int InitList_Sq(SqList &L){    //构造一个空的线性表L    L.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));    if(!L.elem) return 0;       //存储分配失败     L.length=0;                 //空表长度为0     L.listsize=LIST_INIT_SIZE;  //初始存储容量     return 0; }void return_elem(SqList L)//遍历顺序表 {    cout<<"表中元素为:"<<endl;     for(int i=0;i<L.length;i++)    {        cout<<setw(5)<<L.elem[i];    }    cout<<endl;}void LocateElem_Sq(SqList L,int e,int (*compare)(int,int))//在顺序表中查找第一个与e满足compare()的元素的位序//若找到,则返回其在L中的位序,否则返回0 {    int i=1;            //i的初值为第一个元素的位序    int *p=L.elem;      //p的初值为第一个元素的存储位置    while(i<=L.length&&!(*compare)(*p++,e))++i;   //当i的值不超过表长且比较的两个数不相等时继续     if(i<=L.length){        cout<<e<<"是该表中的第"<<i<<"个元素"<<endl;     }    else{        cout<<"没有找到该元素"<<endl;     }}int compare(int i,int j){    if(i==j) return 1;    else    return 0;}int ListInsert_Sq(SqList &L,int i,int e)//在顺序表L中第i个位置之前插入新的元素e//i的合法值为1 ≤i≤L.length+1 {    if(i<1||i>L.length+1)    {        cout<<"插入位置不合法"<<endl;         exit(1);    //i值不合法     }    if(L.length>=L.listsize)    {           //存储空间已满,增加分配    int *newbase;    newbase=(int*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));    if(!newbase)exit(1);//存储分配失败    L.elem=newbase;    L.listsize+= LISTINCREMENT;    }    int *q;    q=&(L.elem[i-1]);//q为插入位置    for(int *p=&(L.elem[L.length-1]); p>=q; --p)    {        *(p+1)=*p;//插入位置之后元素右移     }     *q=e;//插入e    ++L.length;    return 0; }int ListDelete_Sq(SqList &L,int i)//删除元素 {    if(i<1||i>L.length)exit(1);    int *p=&L.elem[i-1];//p为要删除元素的位置     int *q=&L.elem[L.length-1];//标记最后一个元素的位置     for(;p<q;p++)    {        *p=*(p+1);    }    L.length--;    return 0;}int main(){    int num;    SqList L;    InitList_Sq(L);    int e1;    int e2;    int e3;    int location;    cout<<"请输入元素的个数"<<endl;    cin>>num;    if(num>100||num<1)return 0;//num值不合法     cout<<"请输入"<<num<<"个元素"<<endl;     for(int i=0;i<num;i++)    {    cin>>L.elem[i];    ++L.length;    }    return_elem(L);                 //输出表中元素     cout<<"请输入要查找的元素"<<endl;    cin>>e1;    int (*pf) (int,int);                    //定义指向函数的指针     pf=compare;                             //将函数的入口地址赋给 pf     LocateElem_Sq(L,e1,pf);                 //  LocateElem_Sq(L,e,compare);    cout<<"请输入要插入的元素"<<endl;    cin>>e2;    cout<<"请输入要插入的位置"<<endl;    cin>>location;    ListInsert_Sq(L,location,e2);    return_elem(L);                 //输出表中元素     cout<<"请输入要删除的元素的位置"<<endl;    cin>>e3;    ListDelete_Sq(L,e3);            //删除元素     return_elem(L);                 //输出表中元素     return 0;}

链表

#include<stdio.h>   //c#include<stdlib.h> //malloc#include<iostream> //c++#include<iomanip>using namespace std;typedef struct LNode{    int data;    struct LNode *next;}LNode,*LinkList;void CreateList_L(LinkList &L,int n)//逆位序输入n个元素的值,建立带表头结点的单链线性表L //!!!!逆位序,逆位序,逆位序 !!! ! {    if(n<1)exit(1);//num值不合法     LNode *p;    L=(LinkList) malloc (sizeof (LNode));    L->next=NULL;       //先建立一个带头结点的单链表    cout<<"请输入"<<n<<"个元素"<<endl;     for (int i=n;i>0;--i)               //头节点没有data     {        p=(LinkList) malloc (sizeof (LNode));//生成新节点        scanf("%d",&p->data);       //输入元素值        p->next=L->next;        //插入到表头         L->next=p;     } }void return_elem(LinkList L)//遍历顺序表 {    LNode *p;    p=L->next;     cout<<"表中元素为:"<<endl;     while(p)    {        cout<<setw(5)<<p->data;        p=p->next;    }    cout<<endl;}int search(LinkList L,int s){    LNode *p=L;    p=p->next; //头指针为空,跳过头指针     int j=1;    while(p&&j<s)    {    p=p->next;    j++;    }    if (!p)cout<<"没有找到该元素"<<endl;     else cout<<"链表中的第"<<s<<"个元素为:"<<p->data<<endl;     return 0; }int ListInsert(LinkList &L,int i,int e){    LNode *q=L;    int j=0;    while(q&&j<i-1)    {        q=q->next;        j++;    }                   //当插入位置合理以后再开辟内存    if(!q||j>i-1)exit(1);     LNode *p=(LinkList) malloc (sizeof (LNode));    p->data=e;    p->next=q->next;    q->next=p;    return 0;}void ListDelate(LinkList &L,int i)//删除元素 {    LNode *q=L;    int j=0;    while(q->next&&j<i-1)    {        q=q->next;        j++;    }    if(!q->next||j>i-1)exit(1);    LNode *p;    p=q->next;//要删除的元素     q->next=p->next;    free(p);        }int main(){    int num;    int s;    LinkList L;    int location;    int e;    cout<<"请输入元素的个数"<<endl;    cin>>num;    CreateList_L(L,num);    return_elem(L);    cout<<"请输入要查找元素的位序"<<endl;    cin>>s;    search(L,s);    cout<<"请输入插入的元素以及元素的位置"<<endl;    cin>>e>>location;    ListInsert(L,location,e);    return_elem(L);    cout<<"请输入要删除元素的位置"<<endl;    cin>>location;     ListDelate(L,location);//删除元素     return_elem(L);    return 0;}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 厨宝怎么样 厨宝橱柜 厨宝10l ferroli厨宝 好厨宝 厨宝团购 厨宝即热式 小厨宝即热式好还是储水式好 厨宝什么牌子好 小厨宝什么牌子好 厨宝即热式好还是储水式好 小厨宝是什么 小厨宝安装图 小厨宝就是个坑 储水式小厨宝什么牌子好 阿诗丹顿小厨宝怎么样 帅康小厨宝价格 美的厨宝价格 厨宝哪个品牌好 卫生间 小厨宝 小厨宝热水器 小厨宝是一种电热水器 储水式小厨宝 小厨宝安装示意图 小厨宝和电热水龙头哪个好 厨宝和电热水龙头哪个好 厨宝什么品牌质量好 厨宝哪个牌子好 厨宝哪个牌子质量好 厨宝吸油烟机 阿诗丹顿厨宝怎么样 哪个牌子的厨宝好 厨宝哪个品牌质量好 阿诗丹顿厨宝 格林姆斯厨宝 史密斯厨宝怎么样 伊莱克斯厨宝 厨宝烤箱怎么样 海尔厨宝怎么样 什么品牌的厨宝好 厨宝 电热水龙头