顺序表应用——纯C语言版本

顺序表的一些操作

在这里插入图片描述
今天整理了一下顺序表的题目,一共是十道题,有一些题目用的是相同的算法,但是也是能AC的,先献上代码,后序再补上其他算法的代码。

A - 顺序表应用1:多余元素删除之移位算法

#include <stdio.h>
#include <stdlib.h>
int a[10010];
void creat(int n)
{
    for(int i=0; i<n; i++)
    {
        scanf("%d",&a[i]);
    }
}
int  moved(int a[],int n)
{
    for(int i=0; i<n; i++)
    {
        for(int j=i+1; j<n; j++)
        {
            if(a[i]==a[j])
            {
                for(int k=j; k<n; k++)
                {
                    a[k]=a[k+1];
                }
                n--;
                j--;
            }
        }
    }
    return n;
}
int main()
{
    int t,n;
   scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        creat(n);
        int m=moved(a,n);
        printf("%d",a[0]);
        for(int i=1; i<m; i++)
        {
           printf(" %d",a[i]);
        }
       printf("\n");
    }
    return 0;
}


B - 顺序表应用2:多余元素删除之建表算法

#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
    int data;
    struct node* next;
} chain;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        chain* head,*p,*tail;
        head = (chain*)malloc(sizeof(chain));
        head->next = NULL;
        tail = head;
        int n;
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
        {
            p = (chain*)malloc(sizeof(chain));
            scanf("%d", &p->data);
            p->next = tail->next;
            tail->next = p;
            tail = p;
        }
        p = head->next;
        while (p)
        {
            chain* q = p;
            chain* r = p->next;
            while (r)
            {
                if (r->data == p->data)
                {
                    q->next = r->next;
                    free(r);
                    r = q->next;
                }
                else
                {
                    q = r;
                    r = r->next;
                }

            }
            p = p->next;
        }
        chain  *q = head->next;
        while (q)
        {
            printf("%d%c", q->data, q->next == NULL ? '\n' :' ');
            q = q->next;
        }
    }
    return 0;
}

C - 顺序表应用4-2:元素位置互换之逆置算法(数据改进)

#include<stdio.h>
#include<stdlib.h>
int a[1000010];
void reverser(int n,int m)
{
    int t;
    while(n<m)
    {
        t=a[n];
        a[n]=a[m];
        a[m]=t;
        n++;
        m--;
    }
}
int main()
{
    int i,n,t,m;
    scanf("%d",&n);
    for(i=0; i<n; i++)
        scanf("%d",&a[i]);
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&m);
        reverser(0,n-1);
        reverser(0,n-m-1);
        reverser(n-m,n-1);
        for(i=0; i<n; i++)
            printf("%d%c",a[i],i==n-1?'\n':' ');
    }
    return 0;
}

D - 顺序表应用5:有序顺序表归并

#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
    int data;
    struct node* next;
} chain;
chain *set(int n)
{
    chain* head, * p,*tail;
    head = (chain*)malloc(sizeof(chain));
    head->next = NULL;
    tail = head;
    for (int i = 0; i < n; i++)
    {
        p = (chain*)malloc(sizeof(chain));
        scanf("%d", &p->data);
        p->next = tail->next;
        tail->next = p;
        tail = p;
    }
    return head;
}
int main()
{
    int n, m;
    scanf("%d %d", &n, &m);
    chain* head1, * head2,*tail,*p1,*p2;
    head1 = set(n);
    head2 = set(m);
    p1 = head1->next;
    p2 = head2->next;
    chain* head;
    head = (chain*)malloc(sizeof(chain));
    tail = head;
    while (p1 && p2)
    {
        if (p1->data <= p2->data)
        {
            tail->next = p1;
            tail = p1;
            p1 = p1->next;
        }
        else
        {
            tail->next = p2;
            tail = p2;
            p2 = p2->next;
        }
        if (p1 == NULL)
        {
            tail->next = p2;
        }
        if (p2 == NULL)
        {
            tail->next = p1;
        }
    }
    chain* q;
    q = head->next;
    while (q)
    {
        printf("%d ", q->data);
        q = q->next;
    }
    return 0;

}

E - 顺序表应用6:有序顺序表查询

#include <stdio.h>
#include <stdlib.h>
int a[100001];
int n, m;
int find(int x,int s,int e)
{
	int mid = (s + e) / 2;
	if (s <= e)
	{
		if (a[mid] == x)return mid + 1;
		else if (x < a[mid])return find(x, s, mid - 1);
		else if (x > a[mid])return find(x, mid + 1, e);
	}
	else
        return 0;
}
int main()
{
	scanf("%d",&n);
	for (int i = 0; i < n; i++)
		scanf("%d",&a[i]);
	scanf("%d",&m);
	for (int i = 0; i < m; i++)
	{
		int x;
		scanf("%d",&x);
		if (find(x, 0, n))
			printf("%d\n",find(x,0,n));
		else printf("No Found!\n");
	}

}

F - 顺序表应用7:最大子段和之分治递归法

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[50005];
int count = 0;
int MAX(int a, int b, int c)
{
	int max;
	max = (a > b) ? a : b;
	return (max > c) ? max:c;
}
int recursion(int a[], int n, int m)
{
	int mid,left,right;
	int i, j;
	count++;
	mid = (n + m) / 2;
	if (n == m)
	{
		if (a[n] < 0)return 0;
		else return a[n];
	}
	left = recursion(a, n, mid);
	right = recursion(a, mid+1, m);
	int lmax, rmax,mmax, lcount, rcount;
	lmax=rmax=lcount=rcount=0;
	for (i = mid; i >= n; i--)
	{
		lcount = lcount + a[i];
		if (lcount > lmax)lmax = lcount;
	}
	for (i = mid+1; i <= m; i++)
	{
		rcount = rcount + a[i];
		if (rcount > rmax)rmax = rcount;
	}
	mmax = lmax + rmax;
	int max = MAX(left, right, mmax);
	return max;
}
int main()
{
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
		scanf("%d", &a[i]);
	int x = recursion(a, 0, n - 1);
	printf("%d %d\n",x,count);
	return 0;
}

G - 顺序表应用8:最大子段和之动态规划法

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[50005];
int main()
{
	int n,i,j;
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &a[i]);
	int max = 0;
	int sum = 0;
	for (i = 0; i < n; i++)
	{
		sum = sum + a[i];
		if (sum < 0)sum = 0;
		if (sum > max)max = sum;
	}
	if (max >= 0)printf("%d\n", max);
	else printf("0\n");
	return 0;
}

H - 数据结构上机测试1:顺序表的应用

#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
	int data;
	struct node* next;
}chain;
int main()
{
	chain* head,*p,*tail;
	head = (chain*)malloc(sizeof(chain));
	head->next = NULL;
	tail = head;
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		p = (chain*)malloc(sizeof(chain));
		scanf("%d", &p->data);
		p->next = tail->next;
		tail->next = p;
		tail = p;
	}
	p = head->next;
	while (p)
	{
		chain* q = p;
		chain* r = p->next;
		while (r)
		{
			if (r->data == p->data)
			{
				q->next = r->next;
				free(r);
				r = q->next;
			}
			else
			{
				q = r;
				r = r->next;
			}
			
		}
		p = p->next;
	}
	chain* x = head->next;
	int sum = 0;
	while (x)
	{
		sum++;
		x = x->next;
	}
	printf("%d\n", sum);
	chain  *q = head->next;
	while (q)
	{
		printf("%d%c", q->data, q->next == NULL ? '\n' :' ');
		q = q->next;
	}
	return 0;
}

I - 顺序表应用3:元素位置互换之移位算法

#include<stdio.h>
#include<stdlib.h>
int a[1000010];
void reverser(int n,int m)
{
    int t;
    while(n<m)
    {
        t=a[n];
        a[n]=a[m];
        a[m]=t;
        n++;
        m--;
    }
}
int main()
{
    int i,n,t,m;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        scanf("%d",&m);
        for(i=0; i<n; i++)
            scanf("%d",&a[i]);
        reverser(0,n-1);
        reverser(0,n-m-1);
        reverser(n-m,n-1);
        for(i=0; i<n; i++)
            printf("%d%c",a[i],i==n-1?'\n':' ');
    }
    return 0;
}

J - 顺序表应用4:元素位置互换之逆置算法

#include<stdio.h>
#include<stdlib.h>
int a[1000010];
void reverser(int n,int m)
{
    int t;
    while(n<m)
    {
        t=a[n];
        a[n]=a[m];
        a[m]=t;
        n++;
        m--;
    }
}
int main()
{
    int i,n,t,m;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        scanf("%d",&m);
        for(i=0; i<n; i++)
            scanf("%d",&a[i]);
        reverser(0,n-1);
        reverser(0,n-m-1);
        reverser(n-m,n-1);
        for(i=0; i<n; i++)
            printf("%d%c",a[i],i==n-1?'\n':' ');
    }
    return 0;
}

说明

有一些移位算法也是用逆置做的,以后会补上,这些应该是都可以在OJ上AC的纯C语言写的代码,能用数组的我都用数组了,有一些用数组会MLE,欢迎大佬批评指正。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值