考研之数据结构常见代码题01

一、线性表

1.在一个递增有序的顺序表中插入元素Y,得到的顺序表仍然有序。
该算法的思想主要分有三步:找到插入位置、插入、整个顺序表的长度加一。

//find方法是用来寻找所插入元素的合适位置
    int find(Sqlist L,int Y){
        for(int i=0;i<L.length;i++){
            //如果Y
            if(Y<L.data[i]){
                break;
            }
        }
        return i;
    }
    //insert方法用来插入元素Y
    void insert(Sqlist &L,int Y){
        int j,q;
        q=find(L,Y);
        for(j=L.length-1;j>=q;j--){
            //插入Y后,之后的元素都要后移一位
            L.data[j+1]=L.data[j];
            //把顺序表的第q个位置赋值为Y
            L.data[q]=Y;
            //成功插入元素Y后,顺序表的长度加一
            ++(L.length);
        }

2.线性表的删除操作
删除顺序表L中第i个元素,用变量e返回。若i的输入不合法则返回false;否则,将被删元素赋值给引用变量e,并将第i+1个元素及其后的所有元素依次向前移动一个位置,返回true。

bool ListDelete(Sqliist &L,int i,Elemtype &e){
    //判断i值是否有效
    if(i<1||i>L.length)
        return false;
    //把被删的元素赋值给e
    e=L.data[i-1];
    for(int j=i;j<L.length;j++) 
        //将第i个位置后的元素前移
        L.data[j - 1] = L.data[j];
        //由于删除了一个元素,故线性表的长度减一
        L.length--;
        return true;
}

3.单链表上的基本操作
①头插法建立单链表
考研之数据结构常见代码题01_第1张图片

    //建立单链表
    LinkList List_HeadInsert(LinkList &l){
    LNode *s; int x;
    //创建头结点
    L=(LinkList)malloc(sizeof(LNode));
    //初始为空链表
    L->next==null;
    //输入结点的值
    scanf("%d",&x);
    //当输入9999时表示程序结束
    while(x!=9999){
        //创建一个新的结点
        s=(LNode*)malloc(sizeof(LNode));
        //头插法中的关键代码!!!
        s->data=x;
        s->next=L->next;
        L->next=s;
        scanf("%d",&x);
    }
    return L;
    }

②尾插法建立单链表
考研之数据结构常见代码题01_第2张图片

    //建立单链表
    LinkList List_HeadInsert(LinkList &l){
    int x;
    //创建头结点
    L=(LinkList)malloc(sizeof(LNode));
    //r为表尾指针
    LNode *s,*r=L;
    scanf("%d",&x);
    while(x!=9999){
        //创建一个新的结点
        s=(LNode*)malloc(sizeof(LNode));
        //尾插法中的关键代码!!!
        s->data=x;
        r->next=s;
        r=s;
        scanf("%d",&x);
    }
    //尾指针置为空
    r->next=NULL;
    return L;
    }

4.删除顺序表中所有值为Y的数据元素。
算法思想是当顺序表中出现和Y值相等的数时,该数据元素需要向左移动k个位置,以便达到删除顺序表中所有值为Y的数据元素。

void delete(Sqlist &L,int Y){
    //k用来表示顺序表中数据的移动位次
    int k=0;
    for(int i=0;i<L.length;i++)
        if (L.data[i]!=Y){
            //当顺序表中的数据和Y相等时,向左移动k个位置,从而把等于x的那个数据消掉
            L.data[k]=L.data[i];
            ++k;
        }
    L.length=k;
}

5.把两个递增的有序表A、B合并成一个。
算法思想:建立一个空链表C,通过比较链表A和链表B中的数据元素的大小,逐个把较小的元素放入链表C中,这样就保证了链表C中的元素是链表A和链表B的集合且有序。

bool Demo(Sqlist A,Sqlist B,Sqist &C){
    //判断链表C的长度是否合法
    if(A.length+B.length>C.maxsize)
        return false;
    int i=j=k=0;
    while(i<A.length&&j<B.length){
        //当链表A中的数值小时,链表A中的数据放到链表C中
        if(A.data[i]<B.data[j])
            C.data[k++]=A.data[i++];
        //否则,把链表B中的数据放到链表C中
        else
            C.data[k++]=A.data[j++];
    }
    while(i<A.length)
        //把A中的所有元素放到C中
        C.data[k++]=A.data[i++];
    while(j<B.length)
        //把B中的所有元素放到C中
        C.data[k++]=B.data[j++];
    return true;
}

非常感谢看完本篇的小伙伴们。本人现在是大四应届毕业生,刚刚经历过考研,希望能够把我认为重要的代码题分享给大家,让大家在复习备考期间能够少走一些弯路。同时经历过考研才让我知道自己原来有那么多的不足,希望借助这个平台来给大家分享一些考研经验,同时提升自己的学习能力。共勉,加油!

代码题会一直持续更新,希望和大家一起进步!!!

你可能感兴趣的:(数据结构,c语言)