线性表学习代码实现

- 顺序结构

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define MAXSIZE 20
#define OK 1
#define ERROR 0
using namespace std;
typedef int Status;
typedef int Elemtype;
typedef struct
{
    Elemtype *elem;
    int length;
}Sqlist;
Status Initlist(Sqlist* L)
{
    L->elem=(Elemtype *)malloc(MAXSIZE*sizeof(Elemtype));
    if(!L->elem)
        return ERROR;
    L->length=0;
    return OK;
}
/*
插入操作
初始条件:顺序表L已存在
操作结果:在L中的第i个位置之前插入新的数据元素e,L的长度加1
*/
Status ListInsert(Sqlist *L,int i,Elemtype e)
{

    if(L->length==MAXSIZE||i<1||i>L->length+1)//三种情况特判,线性表已满或者i不在此范围内
        return ERROR;
    if(i<=L->length)//插入位置在表尾之前
    {
        for(int k=L->length-1;k>=i-1;k--)
        {
            L->elem[k+1]=L->elem[k];
        }
    }
    L->elem[i-1]=e;//这种情况囊括了i在表尾,即i=L->length+1;
    L->length++;
    return OK;
}
Status Listdelete(Sqlist *L,int i,Elemtype *e)
{
    if(L->length==0||i<1||i>L->length)
        return ERROR;
    *e=L->elem[i-1];
    if(i<L->length)//删除位置不在最后一个
    {
        for(int k=i-1;k<L->length-1;k++)
        {
            L->elem[k]=L->elem[k+1];
        }
    }
    L->length--;
    return OK;
}
Status GetElem(Sqlist L,int i,Elemtype *e)
{
     if(L.length==0||i<1||i>L.length)
        return 0;
    *e=L.elem[i-1];
    return OK;
}
void output(Sqlist L)
{
    cout<<"当前线性表长度"<<L.length;
    for(int i=0;i<L.length;i++)
        cout<<L.elem[i]<<" ";
}
int main()
{
    Sqlist L;
    printf("------构造一个空的线性表L------\n");
    Initlist(&L);
    output(L);  //打印结果
    printf("------测试插入10个数------\n");
    for(int i = 1;i <= 10; i++){
        ListInsert(&L,i,i);
    }
    output(L);  //打印结果
    printf("------在第三位之前插入0------\n");
    ListInsert(&L,3,0);
    output(L);  //打印结果
    printf("------删除第6位的数据------\n");
    Elemtype e;
    Listdelete(&L,6,&e);
    printf("删除的数据为:%d\n", e);
    output(L);  //打印结果
    printf("------获取元素操作------\n");
    GetElem(L,5,&e);
    printf("得到第5个元素:%d", e);
}

- 链式结构

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define OK 1
#define ERROR 0
using namespace std;
typedef int status;
typedef int elemtype;
typedef struct node
{
    elemtype data;
    struct node *next;
}node;
typedef struct node* linklist;
/*typedef struct
{
    int lenght;
    node* next;
}*linklist;
//构造空链表
把头结点和普通节点分开后的一种初始化方法
status initlist(linklist *L)
{
    linklist p=(linklist)malloc(sizeof(linklist));
    node *q=(node *)malloc(sizeof(node));
    q->next=NULL;//q是头结点,p是指向头结点的头指针
    p->next=q;
    p->lenght=0;
    (*L)=p;//头结点在p的位置
    return OK;
}
*/
//头插法(随机赋值)
status createlisthead(linklist *L,int n)
{
    linklist p;
    int i;
    srand(time(0));//初始化随机数种子
    *L= (linklist)malloc(sizeof(node));
    (*L)->next=NULL;
    for(int i=0;i<n;i++)
    {
        p=(linklist)malloc(sizeof(node));
        p->data=rand()%100+1;
        p->next=(*L)->next;//先接后再续前
        (*L)->next=p;
    }
}
//尾插法
status createlisttail(linklist *L,int n)
{
    linklist p,r;
    srand(time(0));
    *L=(linklist)malloc(sizeof(linklist));
    (*L)->next=NULL;
    r=*L;
    for(int i=0;i<n;i++)
    {
        p=(linklist)malloc(sizeof(linklist));
        p->data=rand()%100+1;
        r->next=p;
        r=p;
    }
    r->next=NULL;//区别:头插法中在最开始就确定了最后一位是null;
    return OK;
}
//读取
status getelem(linklist L,int i,elemtype *e)
{
    int j=1;
    linklist p=L->next;
    while(p&&j<i)//i从第二个开始
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i)//即p为空,或者i<1时不行
        return ERROR;
    *e=p->data;
    return OK;
}
//插入,,与上面读取的一个区别是在赋初值是上面令p为L->NEXT
//即第一个节点,这样while一下后p在i的位置,j=i+1
//而插入的位置是第i个元素之前,所以把p放到头结点的位置
status listinsert(linklist *L,int i,elemtype e)
{
    linklist p,s;
    int j=1;
    p=*L;
     while(p&&j<i)//i从第二个开始
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i)
        return ERROR;
    s=(linklist)malloc(sizeof(node));
    s->data=e;//给s新建节点然后把数据放进去
    s->next=p->next;
    p->next=s;
    return OK;
}
status listdelete(linklist *L,int i,elemtype *e)
{
    linklist p,q;
    int j=1;
    p=(*L);
    while(p&&j<i)//i从第二个开始
    {
        p=p->next;
        ++j;
    }
    q=p->next;
    p->next=q->next;
    *e=q->data;
    free(q);
    return 0;
}
//整表删除
status clearlist(linklist *L)
{
    linklist p,q;
    p=(*L)->next;
    while(p)
    {
        q=p;
        p=p->next;
        free(q);
    }
    (*L)->next=NULL;
    return OK;
}
int main()
{
    linklist L;
    createlisthead(&L,10);
    for(int i=1;i<=10;i++)
    {
       elemtype a;
       getelem(L,i,&a);
       cout<<a<<endl;
    }
        listinsert(&L,5,10);
     for(int i=1;i<12;i++)
    {
       elemtype a;
       getelem(L,i,&a);
       cout<<a<<endl;
    }
    int c;
    listdelete(&L,5,&c);
    for(int i=1;i<11;i++)
    {
       elemtype a;
       getelem(L,i,&a);
       cout<<a<<endl;
    }
    clearlist(&L);
    for(int i=1;i<11;i++)
    {
       elemtype a;
       getelem(L,i,&a);
       cout<<a<<endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值