数据结构——顺序表的C语言实现


郫县电子专科学院的在读大二,再次保存代码供参考及批评指正

ex1_1——基本题:

1)首先创建一个顺序表:从键盘读入一组整数(长度小于等于20),按输入顺序放入顺序表,输入以-1结束(注意-1不放到顺序表内);将创建好的顺序表元素依次输出到屏幕上。

2)在已创建好的顺序表中插入一个元素:从键盘读入需插入的元素值和插入位置,调用插入函数完成插入操作;然后将顺序表元素依次输出到屏幕上。

3)在已创建好的顺序表中删除一个元素:从键盘读入欲删除的元素位置(序号),调用删除函数完成删除操作;然后将顺序表元素依次输出到屏幕上。

ex1_2——扩展题:

(1)教材第9题(用顺序表实现):插入一个元素保持顺序表有序性     

注意该题中没有提供插入元素的具体位置,要根据元素值大小寻找合适的位置。

(2)(输入一组数建立顺序表),顺序表中包括多个负数,编写算法删除其中所有的负数        

本题的特点是优化:怎样在一轮循环中删除,而不是每删除一个,都把后续元素搬移一次

ex1_3——扩展题:    

输入一组数,建立顺序表,编写算法将整个表的元素全部反序存放——即第一个元素放到最后……。 本题的特点在优化,怎样在原表上,直接实现反序——即不额外使用一张新表

 

#include<stdio.h>
#define MAX 20
typedef struct list
{
    int data[MAX];
    int length;
}list;

void list_Init(list &l)
{
    for(int i=0;i<MAX;i++)
        l.data[i]=-1;
    l.length=0;
}

void list_insert(list &l,int e,int i)
{
    int j=l.length;
    if(i>MAX) return;
    if(i>l.length) 
    {
        l.data[i-1]=e;
        l.length++;
    }
    else
    {
        for(j=l.length;j>i-1;j--)
        {
            l.data[j]=l.data[j-1];
        }
        l.data[i-1]=e;
        l.length++;
    }
}


int list_show(list l)
{
    for(int i=0;i<l.length;i++)
        printf("%d  ",l.data[i]);
    printf("\n");
    return 0;

}

void list_delete(list &l,int position)
{
    if(position>20||position<=0)
    {
        printf("error");
        return;
    }
    for(int i=position;i<l.length;i++)
    {
        l.data[i-1]=l.data[i];
    }
    l.length--;
}

void list_orderinsert(list &l,int e)
{
    int i=0;
    for(i=0;i<l.length;i++)
        if(l.data[i]==-1||l.data[i]>=e)
            break;
    list_insert(l,e,i+1);
}

void list_deletenegative(list &l)
{
    
    int position[20];
    int i,n=0,j=0;
    for(i=0;i<20;i++)
    {    position[i]=-1;
}
    for(i=0;i<l.length;i++)
        if(l.data[i]<0)
        {
            position[j]=i;
            j++;
            n++;    
        }
    i=0;
    while(position[i]!=-1)
    {
        if(position[i+1]!=-1)
        {
            for(j=position[i];j<position[i+1];j++)
                l.data[j-i]=l.data[j+1];
            i++;
        }
        else
        {    
            for(j=position[i];j<l.length-1;j++)
                l.data[j-i]=l.data[j+1];
            i++;
        }
    }
    l.length=l.length-n;
}

void list_reverse(list &l)
{
    int i=0;
    int t;
    for(i=0;i<(l.length/2);i++)
    {
        t=l.data[i];
        l.data[i]=l.data[l.length-i-1];
        l.data[l.length-i-1]=t;
    }
}
void main()
{
    list l;
    int i=1,e=0;
    int position;
    list_Init(l);
    printf("以下为创建顺序表操作,请输入20个以内整数,以输入-1结束\n");//ex1_1
    while(e!=-1)
    {
        scanf("%d",&e);
        if(e!=-1)
        {    
            if(i>20) 
            {
                printf("读入过多");
                break;
            }
            list_insert(l,e,i);
            i++;
        }
    }
    list_show(l);
    printf("以下为插入元素操作,请输入以' '分隔的两个整数,第一个为数据值,第二个为位置\n");//ex1_2
    scanf("%d %d",&e,&position);
    list_insert(l,e,position);
    list_show(l);

    printf("以下为删除元素操作,请输入一个整数表示删除元素的序号\n");//ex1_3
    scanf("%d",&position);
    list_delete(l,position);
    list_show(l);

    printf("以下请输入一个数据值,将会保持原顺序插入(要求线性表为升序)\n");//ex1_3
    scanf("%d",&e);
    list_orderinsert(l,e);
    list_show(l);
    
    printf("以下会删除顺序表中所有的负数\n");
    list_deletenegative(l);
    list_show(l);
    
    printf("以下会把顺序表反转\n");
    list_reverse(l);
    list_show(l);


 

  • 15
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值