顺序表(C++实现)

一、实现要求

(1)求顺序表中第i个元素(函数),若不存在,报错。

(2)在第i个结点前插入值为x的结点。

(3)删除顺序表中第i个元素结点。

(4)在一个递增有序的顺序表L中插入一个值为x的元素,并保持其递增有序特性。

(5)将顺序表L中的奇数项和偶数项结点分解开(元素值为奇数、偶数),分别放入新的顺序表中,然后原表和新表元素同时输出到屏幕上,以便对照求解结果。

(6)求两个递增有序顺序表L1和L2中的公共元素,放入新的顺序表L3中。

(7)删除递增有序顺序表中的重复元素,并统计移动元素次数,要求时间性能最好。

二、数据结构设计

定义顺序表:

typedef struct sList

{

    elementType data[MAXLEN];

    int len;           //有效长度

} seqList;

三、代码实现

#ifndef _SEQLIST_h_
#define _SEQLIST_h_

#include <stdio.h>
#define MAXLEN 100
typedef  int elementType ;

typedef struct sList
{
    elementType data[MAXLEN];
    int len;           //有效长度
} seqList;
//初始化顺序表
void initList( seqList * L)
{
    L->len =0;
}
//1.求顺序表中第i个元素,存在返回1,否则返回0
int  getElement(seqList L,int i,elementType * x)
{
    if(i<1 || i>L.len)
    {
        printf("元素位置越界!\n");
        return 0;
    }
    else{
        *x=L.data[i-1];
        return 1;
    }
}
//2.在第i个结点前插入值为x的结点。
int listInsert(seqList * L, int i,elementType x)
{
    int j;
    if(i==MAXLEN)
    {
        printf("溢出\n");
        return 0;
    }
    else if(i<1 || i>L->len+1)
    {
        printf("序号超出范围,请重新输入\n");
        return 0;
    }
    else{
        for(j=L->len-1;j>=i-1;j--)
        {
            L->data[j+1]=L->data[j];
        }
        L->data[i-1]=x;
        L->len++;    //修改表的长度
        return 1;
    }
}
//3.删除顺序表中第i个元素结点。
int deleteKnot(seqList * L,int i)
{
    int j;
    if(L->len<=0)
    {
        printf("原表为空\n");
        return 0;
    }
    else if(i<1 || i>L->len)
    {
        printf("删除位置不在有效范围!\n");
        return 0;
    }
    else{
        for(j=i;j<L->len;j++)
        {
            L->data[i-1]=L->data[i];
        }
        L->len--;    //修改表的长度
        return 1;
    }
}
//4.在一个递增有序的顺序表L中插入一个值为x的元素,并保持其递增有序特性。
void insertOrderList(seqList * L,int x)
{
    int i=0;
    if(L->len==MAXLEN)
    {
        printf("链表已满,不能插入!\n");
        return;
    }
    while(L->data[i]<=x)
    {
        if(i==L->len)
        {
            break;
        }
        else{
            i++;
        }
    }
    listInsert(L,i+1,x);
}
//遍历顺序表
void print(seqList * L)
{
    int i;
    for (i=0;i<L->len;++i)
    {
        printf("%d  ",L->data[i]);
    }
    printf("\n");
}
//5.将顺序表L中的奇数项和偶数项结点分解开(元素值为奇数、偶数),分别放入新的顺序表中,然后原表和新表元素同时输出到屏幕上,以便对照求解结果。
void analyzeList(seqList * L,seqList * L1,seqList * L2)
{
    int k=0,i=0,j=0;
    for(i=0;i<L->len;++i)
    {
        if(L->data[i]%2==0)
        {
            while(j!=L->len)
            {
                 L1->data[j]=L->data[i];
                 L1->len++;
                 j++;
                 break;
            }

        }
        else{
            while(k!=L->len)
            {
                 L2->data[k]=L->data[i];
                 L2->len++;
                 k++;
                 break;
            }

        }
    }

}
//6.求两个递增有序顺序表L1和L2中的公共元素,放入新的顺序表L3中。
void commonList(seqList * L1,seqList * L2,seqList * L3)
{
    int i=0,p=0,q=0;     //p,q指针分别指向L1,L2
    while(p!=L1->len&&q!=L2->len)
    {
        if(L1->data[p]==L2->data[q])
        {

             while(i!=L1->len)
             {
                 L3->data[i]=L1->data[p];
                 L3->len++;
                 break;
            }
            i++;
            p++;
            q++;
        }
        else if(L1->data[p]<L2->data[q])
        {
            p++;
        }
        else{
            q++;
        }
    }
}
//7.删除递增有序顺序表中的重复元素,并统计移动元素次数
void deleteReaptElement(seqList * L)
{
    int cou=0,i=0,j=1;
    while(j!=L->len)
    {
        if(L->data[i]==L->data[j])
        {
            j++;
        }
        else{
            L->data[i+1]=L->data[j];
            i+=1;
            cou++;
        }

    }
    L->len=i+1;      //修改顺序表L的长度
    printf("移动元素次数为:%d  ",cou);
}
void scan(seqList * L)
{
	int i=1;
	scanf("%d",&i);
	while(i!=-1)
	{
		L->data[L->len]=i;
		L->len++;
		scanf("%d",&i);
	}
}
#endif // _SEQLIST_h_
#include <stdio.h>
#include <stdlib.h>
#include "seqList.h"

int main()
{
    int j,i=100;
    int x;
    seqList L,L1,L2,L3;
    initList(&L);
    initList(& L1);
    initList(& L2);
    initList(& L3);
    while(i!=-1)
    {
        printf("******************************************************************************\n");
        printf("按0退出程序\n");
        printf("按1插入元素\n");
        printf("按2获取第i个元素\n");
        printf("按3删除第i个位置元素\n");
        printf("按4在一个递增有序的顺序表L中插入一个值为x的元素,并保持其递增有序特性。\n");
        printf("按5将顺序表L中的奇数项和偶数项结点分解开\n");
        printf("按6求两个递增有序顺序表L1和L2中的公共元素,放入新的顺序表L3中\n");
        printf("按7删除递增有序顺序表中的重复元素,并统计移动元素次数\n");
        printf("按8创建链表\n");
        printf("*******************************************************************************\n");
        scanf("%d",&i);
        switch(i)
        {
            case 0:
                exit(1) ;
            case 1:
                printf("请输入插入位置:");
                scanf("%d",&j);
                printf("请输入插入元素:");
                scanf("%d",&x);
                if(!listInsert(&L, j,x))
                {
                }
                else{
                    printf("插入元素元素后的链表L为:");
                    print(&L);
                }
                break;
            case 2:
                printf("请输入元素位置:");
                scanf("%d",&j);
                if(!getElement(L,j,&x))
                {
                }
                else{
                    printf("第%d个位置元素为:%d\n",j,x);
                }
                break;
            case 3:
                printf("请输入删除元素位置:");
                scanf("%d",&j);
                if(!deleteKnot(&L,j))
                {
                }
                else{
                    printf("删除元素元素后的链表L为:");
                    print(&L);
                }
                break;
            case 4:
                initList(& L);
                printf("输入-1结束,");
				printf("请输入顺序表L数据:\n");
				scan(& L);
				printf("表L为:");
				print(&L);
                printf("请输入插入的元素:");
                scanf("%d",&x);
                insertOrderList(&L,x);
                printf("插入元素后顺序表为:");
                print(&L);
				initList( & L);
                break;
            case 5:
                initList(& L);
                initList(& L1);
                initList(& L2);
            	printf("输入-1结束\n");
				printf("请输入顺序表L数据:\n");
				scan(& L);
				printf("表L为:");
				print(&L);
				analyzeList(&L,&L1,&L2);
				printf("表L1为:");
				print(&L1);
				printf("表L2为:");
				print(&L2);
				initList( & L);
                break;
            case 6:
                initList(& L1);
                initList(& L2);
                initList(& L3);
				printf("输入-1结束,");
				printf("请输入顺序表L1数据\n");
				scan(& L1);
				printf("表L1为:");
				print(&L1);
				printf("输入-1结束,");
				printf("请输入顺序表L2数据\n");
				scan(& L2);
				printf("表L2为:");
				print(&L2);
                commonList(&L1,&L2,&L3);
                printf("表L3为:");
				print(&L3);
                break;
            case 7:
                printf("输入-1结束,");
				printf("请输入递增有序顺序表L数据\n");
				scan(& L);
				printf("表L为:");
				print(&L);
				deleteReaptElement(&L);
				printf("删除重复元素后顺序表L数据为:");
				print(&L);
				initList( & L);
                break;
			case 8:
				printf("输入-1结束,");
				printf("请输入顺序表L数据\n");
				scan( &L);
				printf("表L为:");
				print(&L);
				break;
        }
              system("PAUSE");
              system("CLS");
    }
    return 0;
}

四、运行截图

发布了46 篇原创文章 · 获赞 48 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_39559641/article/details/89068946