zoukankan      html  css  js  c++  java
  • 《线性表的总结---线性顺序表(静态,动态)---线性链表(动态)》


    //【静态顺序表的练习】
    /*
    需求:创建一个静态的顺序表存放整数,大小为10,完成以下操作
    1,输入6个整数,打印出顺序表中的内容,并显示表中剩余的空间个数。
    2,在顺序表中的第3个位置插入元素0,打印输出顺序表中的内容,并显示表中剩余的空间个数。
    3,再试图插入表中第11个位置整数0,程序提示超出范围。
    4,删除表中第6个元素,打印出顺序表中的内容,并显示表中剩余的空间个数。
    */

    /*
    #include<stdio.h>
    #define MaxSize 10

    //想顺序表中插入元素
    void insertElem(int Sqlist[],int &len,int i,int x)
    {
    int t;
    if(len==MaxSize || i<1 || i>len+1)
    {
    printf("插入位置非法! ");
    return;
    }
    for(t=len-1;t>=i-1;t--)
    Sqlist[t+1]=Sqlist[t];
    Sqlist[i-1]=x;
    len = len+1;
    }

    //向顺序表中删除元素
    void DelElem(int Sqlist[],int &len,int i)
    {
    int j;
    if(i<1 || i>len)
    {
    printf("This insert is illegal");
    return; //非法删除
    }
    for(j=i;j<=len-1;j++)
    Sqlist[j-1]=Sqlist[j]; //将第i个元素之后的元素前移
    len = len-1;
    }

    //主函数
    int main()
    {
    int Sqlist[MaxSize]; //定义一个静态顺序表
    int len,i;
    printf("请输入6个整数(以空格分开):");
    for(i=0;i<6;i++)
    scanf("%d",&Sqlist[i]);
    len = 6;
    printf("表中的元素如下:");
    for(i=0;i<len;i++)
    //输出顺序表中的6个整数
    printf("%3d",Sqlist[i]);
    //显示顺序表中的剩余空间
    printf(" 表中剩余空间为:%d ",MaxSize-len);

    //调用insertElem(int Sqlist[],int &len,int i,int x)函数,向顺序表中插入元素
    //向顺序表中的第3位置插入整数0
    printf("在表中的第3个位置插入整数0");
    insertElem(Sqlist,len,3,0);
    printf(" ");
    printf("表中的元素如下:");
    for(i=0;i<len;i++)
    //输出顺序表中的所有元素
    printf("%3d",Sqlist[i]);
    //显示表中剩余空间
    printf(" 表中剩余空间为: %d ",MaxSize-len);

    //调用insertElem(int Sqlist[],int &len,int i,int x)函数,在表中的第11位置插入整数0
    printf("在表中的第11个位置插入整数0:");
    insertElem(Sqlist,len,11,0);

    //调用DeElem(int Sqlist[],int &len,int i)函数,删除顺序表中的第6个元素
    printf("删除表中第6个元素");
    DelElem(Sqlist,len,6);
    printf("表中元素如下:");
    for(i=0;i<len;i++)
    //输出顺序表中的所有元素
    printf("%3d",Sqlist[i]);
    printf(" 表中剩余空间为: %d ",MaxSize-len);
    return 0;

    }
    */

    //【动态顺序表的练习】
    /*
    需求:编写一个程序,动态的创建一个顺序表。要求:顺序表的初始长度为10,向顺序表中输入15个整数
    并打印出来;再删除顺序表中的第5个元素,打印出删除后的结果.
    */

    /*
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #define MaxSize 10
    typedef int ElemType; //将int定义为ElemType
    typedef struct
    {
    int *elem;
    int length;
    int listsize;
    }Sqlist;

    //初始化一个顺序表
    void initSqlist(Sqlist &L)
    {
    L.elem = (int *)malloc(MaxSize*sizeof(ElemType));
    if(!L.elem)
    exit(0);
    L.length = 0;
    L.listsize = MaxSize;
    }

    //向顺序表中插入元素
    void InsertElem(Sqlist &L,int i,ElemType item)
    {//向顺序表L中第i个位置上插入元素item
    ElemType *base,*insertPtr,*p;
    if(i<1 || i>L.length+1)
    exit(0);
    if(L.length>=L.listsize)
    {
    base = (ElemType *)realloc(L.elem,(L.listsize+10)*sizeof(ElemType));
    L.elem = base;
    L.listsize+=100;
    }
    insertPtr = &(L.elem[i-1]); //记下要插入元素位置的地址
    for(p = &(L.elem[L.length-1]);p>=insertPtr;p--)
    *(p+1) = *p;
    *insertPtr = item;
    L.length++;
    }

    //从顺序表中删除元素
    void DelElem(Sqlist &L,int i)
    {
    ElemType *delItem,*q;
    if(i<1 || i>L.length)
    exit(0);
    delItem = &(L.elem[i-1]);
    q = L.elem+L.length-1;
    for(++delItem;delItem<=q;++delItem)
    *(delItem-1) = *delItem;
    L.length--;
    }

    //主函数
    int main()
    {
    Sqlist l;
    int i;
    //调用initSqlist(Sqlist &L)函数,初始化一个顺序表
    initSqlist(l);
    printf("顺序表已创建完毕...");
    printf(" ");
    printf("向顺序表中插入1~15个整数(数字之间用空格分开) ");
    for(i=0;i<15;i++)
    InsertElem(l,i+1,i+1);
    printf("这个顺序表中的元素是:");
    for(i=0;i<l.length;i++)
    printf("%3d",l.elem[i]);
    printf(" ");

    //调用DelElem(Sqlist &L,int i)函数,删除第5个元素
    DelElem(l,5);
    printf("第5个元素已被删除...");
    printf(" ");
    printf("元素删除后,顺序表中的元素入下:");
    for(i=0;i<l.length;i++)
    printf("%3d",l.elem[i]);
    printf(" ");
    return 0;
    }

    */


    //【数据结构版---线性表-线性表的顺序表示和实现(静态)】
    //实现插入元素和删除元素的功能
    /*
    #include<stdio.h>
    #include<stdlib.h>
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    #define INFEASIBLE -1
    #define OVERFLOW -2
    #define MaxSize 10

    typedef int Status; //函数结果状态类型
    typedef int ElemType; //元素类型

    //向静态顺序表中插入元素
    Status InsertElem(int Sqlist[],int *len,int i,ElemType x)
    {
    int t;
    if(*len==MaxSize || i<1 || i>*len+1)
    {
    printf("非法插入...");
    return OVERFLOW;
    }
    for(t=*len-1;t>=i-1;t--)
    Sqlist[t+1] = Sqlist[t];
    Sqlist[i-1] = x;
    *len=*len+1;
    return OK;
    }

    //向静态顺序表中删除元素
    Status DelElem(int Sqlist[],int *len,int i)
    {
    int j;
    if(i<1 || i>*len)
    {
    printf("非法删除...");
    exit(0);
    }
    for(j=i;j<*len-1;j++)
    Sqlist[j-1] = Sqlist[j];
    *len = *len - 1;
    return OK;
    }

    //主函数(测试)
    int main()
    {
    int Sqlist[MaxSize]; //定义一个静态顺序表
    int len,i;
    int e1,e2,x;

    printf("请从键盘输入6个整数(数字之间以空格分开):");
    for(i=0;i<6;i++)
    scanf("%d",&Sqlist[i]);
    len = 6;
    printf("初始静态顺序表中的元素:");
    for(i=0;i<len;i++)
    printf("%3d",Sqlist[i]);
    printf(" 静态顺序表的剩余空间是:%d",MaxSize - len);
    printf(" ");

    //调用InsertElem(int Sqlist[],int *len,int i,int x)函数,插入元素
    printf("输入你要插入的位置:");
    scanf("%d",&e1);
    printf(" ");
    printf("输入你要插入的元素:");
    scanf("%d",&x);
    InsertElem(Sqlist,&len,e1,x);
    //输出当前静态顺序表中的元素,验证是否正确插入
    printf("当前顺序表中的元素:");
    for(i=0;i<len;i++)
    printf("%3d",Sqlist[i]);
    printf(" ");
    printf("静态顺序表的剩余空间是:%d",MaxSize-len);
    printf(" ");

    //调用DelElem(int Sqlist[],int *len,int i)函数,删除指定元素
    printf("输入你要删除的元素序号:");
    scanf("%d",&e2);
    DelElem(Sqlist,&len,e2);
    //输出当前静态顺序表中的元素,验证是否正确删除
    printf("当前顺序表中的元素:");
    for(i=0;i<len;i++)
    printf("%3d",Sqlist[i]);
    printf(" ");
    printf("静态顺序表的剩余空间是:%d",MaxSize-len);
    printf(" ");

    return 0;
    }
    */

    //【数据结构版---线性表-线性表的顺序表示和实现(动态)】
    /*
    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    #define INFEASIBLE -1
    #define OVERFLOW -2
    #define LIST_INIT_SIZE 100 //动态顺序表存储空间的初始分配量
    #define LISTINCREMENT 10 //动态顺序表存储空间的分配增量

    typedef int Status; //函数结果状态
    typedef int ElemType; //元素类型
    typedef struct
    {
    ElemType *elem;
    int length;
    int listsize;
    }Sqlist;

    //初始化一个顺序表
    Status InitList_Sq(Sqlist &L)
    {
    L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(!L.elem)
    exit(OVERFLOW); //存储分配失败
    L.length = 0; //动态线性表的初始长度为0
    L.listsize = LIST_INIT_SIZE; //动态线性表的初始容量
    return OK;
    }

    //向动态线性表中插入元素
    Status InsertElem(Sqlist &L,int i,ElemType e)
    {
    ElemType *newbase,*q,*p;
    if(i<1 || i>L.length+1)
    return ERROR;
    if(L.length >= L.listsize)
    {//当前存储空间已满,增加分配
    newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
    if(!newbase)
    exit(OVERFLOW); //分配失败
    L.elem = newbase;
    L.listsize+=LISTINCREMENT;
    }
    q = &(L.elem[i-1]);
    for(p=&(L.elem[L.length-1]);p>=q;--p)
    *(p+1) = *p;
    *q = e;
    ++L.length;
    return OK;
    }

    //顺序表的创建

    //(老师的作业结果用这个代码)
    //Status Creat_Sq(Sqlist &L)
    //{
    // ElemType temp;
    // printf("请输入你要插入到动态顺序表中的元素(ending 9999):");
    // scanf("%d",&temp);
    // while(temp!=9999)
    // {
    // InsertElem(L,L.length+1,temp);
    // printf("请输入你要插入到动态顺序表中的元素(ending 9999):");
    // scanf("%d",&temp);
    // }
    // return OK;
    //}


    Status Creat_Sq(Sqlist &L)
    {
    ElemType temp,n,i;
    printf("请输入你要插入元素的个数:");
    scanf("%d",&n);
    printf(" 请输入你要插入的元素(以空格分开):");
    for(i=0;i<n;i++)
    {
    scanf("%d",&temp);
    InsertElem(L,L.length+1,temp);
    }
    return OK;
    }

    //顺序表的遍历
    Status Print_Sq(Sqlist L)
    {
    int i;
    for(i=0;i<L.length;i++)
    printf("%4d",L.elem[i]);
    printf(" ");
    return OK;
    }

    //向动态顺序表中删除元素
    Status DelElem(Sqlist &L,int i,ElemType &e)
    {
    ElemType *p,*q;
    if(i<1 || i>L.length)
    return ERROR;
    p = &(L.elem[i-1]);
    e = *p; //把要删除的元素的值赋给e
    q = L.elem+L.length-1;
    for(++p;p<=q;++p)
    *(p-1) = *p;
    --L.length;
    return OK;
    }

    //顺序表的查找
    Status Locate_Sq(Sqlist L,ElemType e)
    {
    int i,n;
    char change;
    ElemType *p;
    p = L.elem;
    for(i=0;i<L.length;i++)
    {
    if(*p++ == e)
    n = i;
    }
    printf("你要找的%d是第%d个元素 ",L.elem[n],n+1);
    return OK;
    }

    //顺序表的排序
    void Sort_Sq(Sqlist &L)
    {
    int i,j;
    char change;
    ElemType temp;
    i = L.elem[L.length-1];
    for(change = TRUE;i>=1;i--)
    {
    change = FALSE;
    for(j=0;j<i-1;j++)
    {
    if(L.elem[j]>L.elem[j+1])
    {
    temp = L.elem[j];
    L.elem[j] = L.elem[j+1];
    L.elem[j+1] = temp;
    change = TRUE;
    }
    }
    }
    }


    //主函数
    int main()
    {
    ElemType e,e1,e2,e3,e4;
    Sqlist sq;

    InitList_Sq(sq);
    printf("动态顺序表已创建好... ");
    Creat_Sq(sq);
    printf(" ");
    printf("顺序表中的元素有: ");
    Print_Sq(sq);
    printf(" ");

    printf("请输入要插入的位置:");
    scanf("%d",&e1);
    printf(" 请输入你要插入的元素:");
    scanf("%d",&e2);
    InsertElem(sq,e1,e2);
    printf("插入元素后,顺序表中的元素如下: ");
    Print_Sq(sq);
    printf(" ");

    printf("请输入你要删除的元素的位置:");
    scanf("%d",&e3);
    DelElem(sq,e3,e);
    printf("删除指定元素后,顺序表中的元素如下: ");
    Print_Sq(sq);
    printf(" ");

    printf("请输入你要查找的元素:");
    scanf("%d",&e4);
    Locate_Sq(sq,e4);

    Sort_Sq(sq);
    printf("排序后的结果是: ");
    Print_Sq(sq);
    return 0;
    }
    */

    //【数据结构版--线性表的链式表示和实现】
    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    #define INFEASIBLE -1 //infeasible-->不可行的
    #define NULL 0

    typedef int Status;
    typedef int ElemType;

    //定义结构体
    typedef struct LNode
    {
    ElemType data;
    struct LNode *next;
    }LNode,*LinkList;


    //带表头结点的单链表的插入
    Status Listinsert_L(LinkList &L,int i,ElemType e)
    {
    LinkList p,s;
    int j;
    p = L;
    j = 0;
    while(p && j<i-1)
    {
    p = p->next;
    ++j;
    }
    if(!p || j>i-1)
    return ERROR;
    s=(LinkList)malloc(sizeof(LNode)); //生产新结点
    s->data=e;
    s->next=p->next;
    p->next=s;
    L->data++;
    return OK;
    }

    //【头插法】逆序输入n个元素的值,创建一个带表头节点的单链表
    /*
    void CreatList_L(LinkList &L,int n)
    {
    int i;
    LNode *p;

    L=(LinkList)malloc(sizeof(LNode));
    L->data=0; //令表头中的数据域内的值为0(其值为表中元素的个数)
    L->next=NULL; //建立带表头节点的单链表
    printf("Please input data:(输入8个整数,由大到小输入) ");
    for(i=n;i>0;--i)
    {
    p=(LinkList)malloc(sizeof(LNode));
    scanf("%d",&p->data);
    p->next = L->next;
    L->next=p;
    L->data++; //递增表中元素的个数
    }
    // printf("%d",L->data); //此处L->data的功能是输出表中元素的个数
    }
    */
    //尾插法
    Status CreatList_L(LinkList &L)
    {
    ElemType temp;
    L=(LinkList)malloc(sizeof(LNode));
    if(!L) return ERROR;
    L->data=0;
    L->next=NULL;
    printf("Please Input data (9999) ending ");
    scanf("%d",&temp);
    while(temp!=9999)
    {
    Listinsert_L(L,L->data+1,temp);
    scanf("%d",&temp);
    }
    return OK;
    }

    //查找单链表中第i个元素,若存在,其值赋给e并返回OK,否则返回ERROR
    Status GetElem_L(LinkList L,int i,ElemType &e)
    {
    //L为带头结点的单链表的头指针
    LNode *p1;
    p1=L->next;
    int j=1; //初始化,p指向第一个结点,j为计数器
    while(p1 && j<i)
    {
    p1 = p1->next;
    ++j;
    }
    if(!p1 || j>i)
    return ERROR; //第i个元素不存在
    e=p1->data;
    return OK;
    }

    //带头结点单链表的删除
    Status ListDelete_L(LinkList &L,int i,ElemType &e)
    {
    LNode *p,*q;
    int j;
    p = L;
    j=0;
    while(p->next && j<i-1) //注意不能写成(p && j<i-1)
    {
    p=p->next;
    ++j;
    }
    if(!(p->next) || j>i-1)
    return ERROR;
    q = p->next;
    p->next = q->next;
    e = q->data;
    //printf("%d",e);
    free(q);
    L->data--; //使链表中的元素个数减一
    return OK;
    }
    //求单链表的长度的函数
    void Length_L(LinkList L)
    {
    int num=0;
    LinkList p;
    p=L->next;
    while(p)
    {

    printf("%3d",p->data);
    p=p->next;
    num++;
    }
    printf(" 这个单链表的长度为:%d",num);
    }

    //定义输出链表函数
    Status Print_L(LinkList L)
    {
    LinkList p;
    p=L->next;
    printf("this list contains %d elements ",L->data);
    while(p)
    {
    printf("%4d->",p->data);
    p=p->next;
    }
    printf("NULL ");
    return OK;
    }

    /*已知线性表中的元素以值递增有序排列,并以单链表作存储结构。
    写一高效算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素)
    同时释放被删节点空间,并分析算法时间复杂度。

    (考虑当这个线性表不是有序排列该怎么办,那就写一个单链表的排序算法,
    若单链表的元素无序,则先调用排序算法进行排序,再调用此算法进行删除)*/

    Status Delete_Between(LinkList &L,int mink,int maxk)
    {
    LNode *p,*q;
    p = L;
    while(p->next->data<=mink)
    p=p->next; //p是最后一个不大于mink的元素
    if(p->next) //如果还有比mink更大的元素
    {
    q=p->next;
    while(q->data<maxk)
    q=q->next; //q是第一个不小于maxk的元素
    p->next=q;
    }
    return OK;

    }
    //建立主函数
    int main()
    {
    LinkList L;
    int n=8,i,i_1,i_2,e,e_1,e_2,e_3,e_4;

    //调用CreatList_L函数,创建一个单链表
    //printf("Please input the number in the list: ");
    //CreatList_L(L,n); //调用头插法时用
    CreatList_L(L);
    printf(" ");

    //调用GetElem_L函数,查找单链表中的第i个元素,调用Length_L函数,求表长
    printf("单链表中的数据为: ");
    Print_L(L);
    printf(" ");
    printf(" 请输入你要获取的元素序号:");
    scanf("%d",&i);
    GetElem_L(L,i,e);
    printf("the %dth number is:%d",i,e);
    printf(" ");

    //调用Listinsert_L函数,实现元素插入功能,然后调用输出链表函数,输出插入后的链表
    printf("清输入插入元素的位置: ");
    scanf("%d",&i_1);
    printf(" 请输入要插入的元素: ");
    scanf("%d",&e_1);
    Listinsert_L(L,i_1,e_1);
    Print_L(L);
    printf(" ");

    //调用Delete函数,用来删除指定的元素,然后再调用Print_L函数输出删除元素后的链表
    printf("请输入要删除的位置是: ");
    scanf("%d",&i_2);
    ListDelete_L(L,i_2,e_2);
    Print_L(L);
    printf(" ");

    //调用Delete_Between函数,用来删除指定两个元素之间的元素,然后调用Print函数,输出操作后的链表
    printf(" 删除a和b之间的元素,请输入:");
    scanf("%d%d",&e_3,&e_4);
    Delete_Between(L,e_3,e_4);
    Length_L(L);
    Print_L(L);
    printf(" ");

    return 0;
    }

  • 相关阅读:
    AJAX请求MVC控制器跨域头问题
    HTTP 错误500.19 -Internal Server Error 错误代码 0x80070021
    C# 同一时间批量生成订单号不重复
    Unity书籍下载地址
    几种常见的设计模式
    C# web api 对象与JSON互转
    自动按参数首字母排序参数
    C# 3DES加密 解密
    C#大量数据导出Excel
    判断对象是数组
  • 原文地址:https://www.cnblogs.com/sun-/p/4866706.html
Copyright © 2011-2022 走看看