数据结构之线性表(参考wd2025版数据结构书页数)【持续更新】

#include <stdio.h>
#include <stdbool.h>
#include <iostream>
#include <stdbool.h>
#include <algorithm>
#include <math.h>
using namespace std;
#define MaxSize 100
#pragma warning (disable :4996)
typedef struct {
    int data[MaxSize];
    int length;
}SqList;
int GetElem(SqList L, int i) {
    if (i<1 || i>L.length)
    {
        printf("查找位置不正确\n");
        return 0;
    }
    return L.data[i - 1];  //o(1)
}
int LocateElem(SqList L, int e) {
    if (L.length == 0)
    {
        printf("顺序表为空\n");
        return 0;
    }
    for (int i = 0;i < L.length;i++)
    {
        if (L.data[i] == e) //时间复杂度分析处:  最好(表头)  o(1)   最坏(表尾)  o(n)
            return i + 1;
    }    //平均 n+1/2
    return 0;
}
int secLocateElem(SqList& L, int& e) {  //p19-01
    if (L.length == 0)
        return -1;
    e = L.data[0];
    int pos = 0;
    for (int i = 0;i < L.length;i++)
    {
        if (L.data[i] > e)
        {
            e = L.data[i];
            pos = i;
        }

    }
    L.data[pos] = L.data[L.length - 1];
    L.length--;
    return e;
}


void Listcontracy(SqList& L) {  //p19-02
    if (L.length == 0)
        return;
    int* head = &L.data[0];
    int* tail = &L.data[L.length - 1];
    while (head < tail)
    {
        int temp;
        temp = *head;
        *head = *tail;
        *tail = temp;
        head++;
        tail--;
    }
    return;


}
void selectEmelentDelection(SqList& L, int x) {  //p19-03
    if (L.length == 0)
        return;
    int k = 0;
    for (int i = 0;i < L.length;i++)
    {
        if (L.data[i] != x)
        {
            L.data[k] = L.data[i];
            k++;

        }

    }
    L.length = k;
    return;

}

void deleteformscale(SqList& L, int s, int t)//p19-04
{
    if (s < t)
    {
        printf("不正确\n");
        return;
    }
    if (L.length == 0)
        return;
    int k = 0;
    for (int i = 0;i < L.length;i++)
    {
        if (!(L.data[i] >= s && L.data[i] <=t))
        {
            L.data[k] = L.data[i];
            k++;


        }

    }
    L.length = k;
    return;
}
void  deleterepeatE(SqList& L)//p19-05
{
    if (L.length == 0)
        return;
    int k = 0;
    int i = 0;
    for (k = 1;k < L.length;k++) {
        if (L.data[k] == L.data[i]) continue;//找到重复的不做动作,而是将正常的向前移把重复挤掉
        L.data[++i] = L.data[k];
    }
    L.length = i+1;
}

void twolist_to_one(SqList& m, SqList& n,SqList& result)//p19-06
{
    if (m.length == 0 || n.length == 0||m.length+n.length>MaxSize)
        return ;
  
    int i = 0, j = 0;int temp = 0;
    for (i,j;i < m.length&&j<n.length;)
    {
        if (m.data[i] <= n.data[j])
            result.data[temp++] = m.data[i++];
        else result.data[temp++] = n.data[j++];


        
    }
    while(i<m.length)
        result.data[temp++] = m.data[i++];
    while(j<n.length)
        result.data[temp++] = n.data[j++];

    result.length = temp;

    



}

void reverse(int a[], int left, int right, int arraySize)//逆转函数,前后对调,p19-07
{
    if (left >= right || right >= arraySize)
        return;
    int mid = (left + right) / 2;
    for (int i = 0;i < mid - i;i++)
    {
        int temp = a[left + i];
        a[left + i] = a[right - i];
        a[right - i] = temp;


    }



}
void  exchange_array(int a[], int m, int n, int arraySize)//p19-07
{
    reverse(a, 0, m + n - 1, arraySize);
    reverse(a, 0, n - 1, arraySize);
    reverse(a, n, m + n - 1, arraySize);



}


void search_and_insert(SqList& l, int x)//p19-08
{
   
    int pos = 0;
    for (int i = 0;i < l.length;i++)
    {
        if (l.data[i] < x) continue;
        if (l.data[i] >= x)
        {
         
            
           if (l.data[i]==x)

           {     int temp = l.data[i];
                  l.data[i] = l.data[i + 1];
                 l.data[i + 1] = temp;
                 break;
     
           }
            
           if (l.data[i] > x)
           {
               int temp =i;
               
               
               while (i < l.length)
               {  
                   l.data[i+1] = l.data[i];
                   l.data[i] = x;
                   i++;

               }
               l.length++;
               break;
           }



        }
        


    }
   




}
void samekey(int a[],int b[],int c[], int n)//p19-09
{
    int i = 0, j = 0,k = 0;
    while (i <n && j<n &&k <n)
    {
        if (a[i] == b[j] && b[j] == c[k])
        {

            printf("%d", a[i]);
            i++;
            j++;
            k++;
         }
        else {
            int maxnum = max(a[i], max(b[i], c[i]));
            if (a[i] < maxnum)i++;
            if (b[j] < maxnum)j++;
            if (c[k] < maxnum)k++;  

        }

        //时间为o(n),空间为o(1)

        
    }





  }
void reverse2(int R[], int h, int e)//p19-10
{
    int i, temp;
    for (i = 0;i < (h + e) / 2;i++)
    {
        temp = R[h + i];
        R[h + i] = R[e - i];
        R[e - i] = temp;
        
    }



}
void cycleleftshift(int* R, int n, int p)//p19-10
{//ab到ba  ab->a^-1* b -> a^-1* b^-1 -> ba
    reverse2(R, 0, p - 1);
    reverse2(R, p, n - 1);
    reverse2(R, 0, n - 1);



   }
int M_search(int A[], int B[], int n) {
    int s1 = 0, d1 = n - 1, s2 = 0, d2 = n - 1, m1, m2;   //起点 终点 中间点 
    while (s1 != d1 || s2 != d2) {
        m1 = (s1 + d2) / 2;
        m2 = (s2 + d2) / 2;
        if (A[m1] == B[m2]) return A[m1];  //若相等 
        if (A[m1] < B[m2]) {                //若a<b 
            if ((s1 + d1) % 2 == 0) {           //若长度是奇数 
                s1 = m1;                  //删除a前边的并保留a 
                d1 = m2;                  //删除b后边的并保留b 
            }
            else {                       //若长度是偶数 
                s1 = m1 + 1;                //删除a以及a前边的 
                d2 = m2;                  //删除b后边的并保留b 
            }
        }
        else {                           //a>b 与上边同理 互换操作即可 
            if ((s2 + d2) % 2 == 0) {
                d1 = m1;
                s2 = m2;
            }
            else {
                d1 = m1;
                s2 = m2 + 1;
            }
        }
    }
    return A[s1] < B[s2] ? A[s1] : B[s2];

}
//p19-11


int  find_centerElement(int a[], int n)//p19-12   时间o(n)  空间o(n)
{
    int* b = new int[n]();
    
    for (int i = 0;i < n;i++)
    {
        b[a[i]]++;
        if (b[a[i]] > (n / 2))
        {
            printf("%d", a[i]);
            return a[i];
        }

    }

    return -1;



}
int findmid_positiveint(int a[], int n)//p19-13
{
    int* b = new int[n+1]();
    for (int i = 0;i < n;i++)
    {   if(a[i]>=0)
        b[a[i]]++;


    }
    for (int i = 1;i < n+1;i++)
    {
        if (b[i] == 0)
            return i;
    }

}

int Minimum_distance_of_triples(int a[],int b[],int c[],int n1,int n2,int n3)//p19-14
{
    int min_val = INT_MAX;
    int p1, p2, p3;
    p1 = p2 = p3 = 0;
    while (p1 != n1 && p2 != n2 && p3 != n3) {
        if (a[p1] <= min(b[p2], c[p3])) {
            min_val = min(min_val, 2 * (max(b[p2], c[p3]) - a[p1]));
            p1++;
        }
        else if (b[p2] <= min(a[p1],c[p3])) {
            min_val = min(min_val, 2 * (max( a[p1], c[p3]) -b[p2]));
            p2++;
        }
        else if ( c[p3]<= min(b[p2],a[p1] )) {
            min_val = min(min_val, 2 * (max(b[p2],a[p1] ) -c[p3] ));
            p3++;
        }
    }
    return min_val;


}

void ListInsert(SqList& L, int i, int e) {

    if (i<1 || i>L.length + 1)
    {
        printf("插入位置不正确\n");
        return;
    }
    if (L.length >= MaxSize)
    {
        printf("顺序表已满,无法插入\n");
        return;
    }
    for (int j = L.length;j >= i;j--)//时间复杂度分析处:  最好(插到表尾) i=n+1; o(1)   最坏(表头) i=1  o(n)
        L.data[j] = L.data[j - 1];//平均 (0+1+2+...+n) *1/(n+1)  =n/2
    L.data[i - 1] = e;
    L.length++;

}
bool ListDelete(SqList& L, int i, int& e) {
    if (i<1 || i>L.length)
    {
        printf("删除位置不正确\n");
        return false;
    }
    e = L.data[i - 1];
    for (int j = i;j <= L.length;j++)//时间复杂度分析处:  最好(删表尾) i=n; o(1)   最坏(表头) i=1  o(n)
        L.data[j - 1] = L.data[j];//平均 (0+1+2+...+n-1) *1/n =  n-1/2
    L.length--;
    return true;
}
void InitList(SqList& L) {
    L.length = 0;
    for (int i = 0;i < MaxSize;i++)
        L.data[i] = 0;
}
int main() {
    SqList L,Q,result;
    InitList(L);
    InitList(Q);
    InitList(result);
    int R[5] = { 1,2,3,4,5 };
    int A[8] = { 0,5,5,3,5,1,5,7 };
    int B[4] = { -5,3,2,3 };
    int C[3] = { 1,2,3 };
    int s1[] = { -1,0,9 };
    int s2[] = { -25,-10,10,11 };
    int s3[] = { 2,9,17,30,41 };
    //int e;
    ListInsert(L, 1, 1);
    ListInsert(L, 2, 2);
    ListInsert(L, 3, 3);
    ListInsert(L, 4, 4);
    ListInsert(Q, 1, 3);
    ListInsert(Q, 2, 4);
    ListInsert(Q, 3, 5);
    ListInsert(Q, 4, 7);
    cout << Minimum_distance_of_triples(s1, s2, s3, 3, 4, 5);

  //  int resultsum = find_centerElement(A, 8);
    //int resultsum2 = findmid_positiveint(B, 4);
    //int resultsum3 = findmid_positiveint(C, 3);
    //printf("%d\n", resultsum2);
    //printf("%d", resultsum3);
     
    
    //for (int i = 0;i < L.length;i++)
    //{
    //    printf("%d", L.data[i]);
    //  

    //}
    //printf("\n");
    //for (int i = 0;i < Q.length;i++)
    //{
    //    printf("%d", Q.data[i]);


    //}
    //printf("\n");
     deleterepeatE(L);
    twolist_to_one(L, Q, result);
    //search_and_insert(L, 3);
    //for (int i = 0;i < L.length;i++)
    //{
    //    printf("%d", L.data[i]);


    //}
    //printf("\n");
    //search_and_insert(Q, 6);
    //for (int i = 0;i < Q.length;i++)
    //{
    //    printf("%d", Q.data[i]);


    //}
   /* for (int i = 0;i < 5;i++)
    printf("%d", R[i]);
    printf("\n");
    cycleleftshift(R, 5, 2);
    for (int i = 0;i < 5;i++)
    printf("%d", R[i]);
    printf("\n");*/
    /*for (int i = 0;i < result.length;i++)
    {
        printf("%d", result.data[i]);


    }*/
        return 0;
    }

 书上示例前面没试,后面试了,在注释处可以调试。

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值