数据结构之数组

数据结构中数组的操作



/*

线性表的操作

*/

#include<stdio.h>

#include<stdlib.h>

#include"标头.h"

int main()

{

         int
a[]={1,1,1,2,2,2,5,5,5,7,7,7,99,99,99,66,66,6,33,55,555};

         int
a_length=sizeof(a)/sizeof(a[0]);

         Print_Array(a,a_length);

 

         //线性表的删除操作

         /*

         int
Key;

         printf("请输入你要删除的关键字Key:");

         scanf("%d",&Key);

         a_length=Del_Key_Node(a,a_length,Key);

         //输出数组

         Print_Array(a,a_length);

         */

 

         //线性表的查找操作

         /*

         int
Key;

         printf("请输入你要删除的关键字Key:");

         scanf("%d",&Key);

         Key=Find_Key_Node(a,a_length,Key);

         if(Key){

                   printf("数组中含有关键字Key\n");

         }

         else{

                   printf("数组中不含有关键字Key\n");

         }*/

 

         //线性表的插入操作

         /*

         int
New_Key,Place;

         printf("请输入你要插入的关键字Key和插入的位置Place:");

         scanf("%d%d",&New_Key,&Place);

         if(Place<=a_length+1&&Place>0){

         a_length=Insert_New_Node(a,a_length,New_Key,Place);

         Print_Array(a,a_length);

         }

         else{

                   printf("插入位置有错误\n");

         }*/

         

 

         //删除线性表的第i个节点

         /*

         int
i;

         printf("请输入你要删除的节点的位置i::");

         scanf("%d",&i);

         if(i>0&&i<=a_length){

                   a_length=Del_I(a,a_length,i);

                   Print_Array(a,a_length);

         }

         else{

                   printf("输入有错误\n");

         }

         */

 

 

         //统计线性表中节点的个数

         /*

         int
cnt;

         cnt=Count_Node_Num(a,a_length);

         printf("这个数组中含有:%d个节点\n",cnt);

         */

 

         //复制线性表

         /*

         int
*p;

         p=Copy_from_a_To_b(a,a_length);

         for(int
i=0;i<a_length;i++){

                   printf("%d
",p[i]);

         }

         printf("\n");
*/

 

         //对线性表进行排序

         /*

         采用冒泡排序法

         */

         /*

         Sort(a,a_length);

         Print_Array(a,a_length);*/

 

         //对线性表进行排序

         /*

         采用简单排序法

         */

         /*

         Sort_Array(a,a_length);

         Print_Array(a,a_length);

         */

 

         //将数据集合中奇数元素放在偶数元素之前

         /*

         Sort_odd_to_even(a,a_length);

         Print_Array(a,a_length);*/

 

 

         //利用一重循环将数组输出K圈

         /*

         int
K;

         printf("请输入你要输出数组的圈数K:");

         scanf("%d",&K);

         Print_K(a,a_length,K);*/

 

 

//查找数组中任意一对和值为K的一组元素

/*

         int
K;

         printf("请输入你要查找的和值K:");

         scanf("%d",&K);

         Find_Add_two(a,a_length,K); */

 

 

         //查找数组的最大值和次大值

         /*

         Find_Max_And_Max_Next(a,a_length);

         */

 

         //数组中含有重复值,要求输出数组中的最大值出现的次数

         /*

         Cnt_Max_Num(a,a_length);

         */

 

 

         //数组中含有不重复的连续值,要求删除数组中的重复值

         /*

         a_length=Del_2_Number(a,a_length);

         Print_Array(a,a_length);
*/

 

 

 

         //删除按照升序排列的含有重复值的数组中的重复元素

         

         a_length=_Del_2_Number(a,a_length);

         Print_Array(a,a_length);

 

 

 

}




/*

线性表的操作

*/

#include<stdio.h>

#include<stdlib.h>

#include"标头.h"

int main()

{

         int
a[]={1,1,1,2,2,2,5,5,5,7,7,7,99,99,99,66,66,6,33,55,555};

         int
a_length=sizeof(a)/sizeof(a[0]);

         Print_Array(a,a_length);

 

         //线性表的删除操作

         /*

         int
Key;

         printf("请输入你要删除的关键字Key:");

         scanf("%d",&Key);

         a_length=Del_Key_Node(a,a_length,Key);

         //输出数组

         Print_Array(a,a_length);

         */

 

         //线性表的查找操作

         /*

         int
Key;

         printf("请输入你要删除的关键字Key:");

         scanf("%d",&Key);

         Key=Find_Key_Node(a,a_length,Key);

         if(Key){

                   printf("数组中含有关键字Key\n");

         }

         else{

                   printf("数组中不含有关键字Key\n");

         }*/

 

         //线性表的插入操作

         /*

         int
New_Key,Place;

         printf("请输入你要插入的关键字Key和插入的位置Place:");

         scanf("%d%d",&New_Key,&Place);

         if(Place<=a_length+1&&Place>0){

         a_length=Insert_New_Node(a,a_length,New_Key,Place);

         Print_Array(a,a_length);

         }

         else{

                   printf("插入位置有错误\n");

         }*/

         

 

         //删除线性表的第i个节点

         /*

         int
i;

         printf("请输入你要删除的节点的位置i::");

         scanf("%d",&i);

         if(i>0&&i<=a_length){

                   a_length=Del_I(a,a_length,i);

                   Print_Array(a,a_length);

         }

         else{

                   printf("输入有错误\n");

         }

         */

 

 

         //统计线性表中节点的个数

         /*

         int
cnt;

         cnt=Count_Node_Num(a,a_length);

         printf("这个数组中含有:%d个节点\n",cnt);

         */

 

         //复制线性表

         /*

         int
*p;

         p=Copy_from_a_To_b(a,a_length);

         for(int
i=0;i<a_length;i++){

                   printf("%d
",p[i]);

         }

         printf("\n");
*/

 

         //对线性表进行排序

         /*

         采用冒泡排序法

         */

         /*

         Sort(a,a_length);

         Print_Array(a,a_length);*/

 

         //对线性表进行排序

         /*

         采用简单排序法

         */

         /*

         Sort_Array(a,a_length);

         Print_Array(a,a_length);

         */

 

         //将数据集合中奇数元素放在偶数元素之前

         /*

         Sort_odd_to_even(a,a_length);

         Print_Array(a,a_length);*/

 

 

         //利用一重循环将数组输出K圈

         /*

         int
K;

         printf("请输入你要输出数组的圈数K:");

         scanf("%d",&K);

         Print_K(a,a_length,K);*/

 

 

//查找数组中任意一对和值为K的一组元素

/*

         int
K;

         printf("请输入你要查找的和值K:");

         scanf("%d",&K);

         Find_Add_two(a,a_length,K); */

 

 

         //查找数组的最大值和次大值

         /*

         Find_Max_And_Max_Next(a,a_length);

         */

 

         //数组中含有重复值,要求输出数组中的最大值出现的次数

         /*

         Cnt_Max_Num(a,a_length);

         */

 

 

         //数组中含有不重复的连续值,要求删除数组中的重复值

         /*

         a_length=Del_2_Number(a,a_length);

         Print_Array(a,a_length);
*/

 

 

 

         //删除按照升序排列的含有重复值的数组中的重复元素

         

         a_length=_Del_2_Number(a,a_length);

         Print_Array(a,a_length);

 

 

 

}

 

 





 

#ifndef __LIANXIONE_H__

#define __LIANXIONE_H__

 

 

//删除线性表中的关键字(可以含有重复值)

/*

查找一个关键字删除一个关键字,然后线性表的长度自减

*/

int Del_Key_Node(int a[],int a_length,int
Key)

{

         int
i=0,j;

         while(i<a_length){

                   if(a[i]==Key){

                            a_length--;

                            for(j=i;j<a_length;a[j]=a[j+1],j++);

                   }

                   else{

                            i++;

                   }

         }

         return
a_length;

}

 

//输出数组

void Print_Array(int a[],int a_length)

{

         for(int
i=0;i<a_length;i++){

                   printf("%d
",a[i]);

         }

         printf("\n");

}

 

//查找线性表中是否出现了关键字Key

int Find_Key_Node(int a[],int a_length,int
Key)

{

         int
i;

         for(i=0;i<a_length&&a[i]!=Key;i++);

         i==a_length?i=0:i=1;

         return
i;

}

 

//在线性表中插入一个新节点 值为Key位置在Place

int Insert_New_Node(int a[],int
a_length,int New_Key,int Place)

{

         int
i;

         for(i=a_length;i>=Place;a[i]=a[i-1],i--);

         a[i]=New_Key;

         return
a_length+1;

}

 

//删除线性表中第i个元素

int Del_I(int a[],int a_length,int i)

{

         a_length--;

         for(int
j=i-1;j<a_length;a[j]=a[j+1],j++);

         return
a_length;

}

 

 

//统计数组中含有的节点个数

int Count_Node_Num(int a[],int a_length)

{

         int
cnt=0;

         for(int
i=0;i<a_length;cnt++,i++);

         return
cnt;

}

 

//复制线性表

int *Copy_from_a_To_b(int a[],int a_length)

{

         int
b[100];

         int
*p=b;

         for(int
i=0;i<a_length;b[i]=a[i],i++);

         return
p; 

}

 

 

//对线性表进行排序

/*

采用冒泡排序法

*/

void Sort(int a[],int a_length)

{

         int
max,i,t;

         while(a_length){

         max=0;

         for(i=0;i<a_length;i++){

                   if(a[i]>a[max]){

                            max=i;

                   }

         }

         t=a[max];

         a[max]=a[a_length-1];

         a[a_length-1]=t;

         a_length--;

         }

}

 

 

 

//对线性表进行排序

         /*

         采用简单排序法

         每次只排序一个,将那个元素插入到合适的位置

         */

void Sort_Array(int a[],int a_length)

{

         int
i,j,t;

         for(i=1;i<a_length;i++){

                   if(a[i]<a[i-1]){

                            t=a[i];

                            a[i]=a[i-1];

                            for(j=i-1;a[j-1]>t&&j>0;a[j]=a[j-1],j--);

                            a[j]=t;

                   }

         }

}

 

 

//将数据集合中奇数元素放在偶数元素之前

/*

这一段代码还有问题

*/

void Sort_odd_to_even(int a[],int a_length)

{

         int
Start=0,End,Flag,i=0,j,t;

         while(i<a_length){

                   if(a[i]%2!=0){

                            Flag=i;

                            t=a[i];

                            if(Flag!=0){

                                     for(j=i;j>Start;a[j]=a[j-1],j--);

                                     a[j]=t;

                                     Start=j+1;

                            }

                   }

                   i++;

         }

}

 

 

//将一个数组利用一重循环输出K圈

void Print_K(int a[],int a_length,int K)

{

         for(int
i=0;i<a_length*K;i++){

                   printf("%d
",a[i%a_length]);

                   if((i+1)%a_length==0){

                            printf("\n");

                   }

         }

}

 

//查找数值中任意一对和值为K的一对元素

void Find_Add_two(int a[],int a_length,int
K)

{

         int
flag=1;

         for(int
i=0;i<a_length-1&&flag;i++){

                   for(int
j=i+1;j<a_length&&flag;j++){

                            if(a[i]+a[j]==K){

                                     flag=0;

                                     printf("数据元素中存在两个数%d和%d的和值为%d",a[i],a[j],K);

                            }

                   }

}

}

 

 

//查找数组中的最大值和次大值

/*

注意在使用正则表达式的时候 

a[0]>a[1]?max_next=a[1],max=a[0]:max=a[1],max_next=a[0];

上边那句话是错误的,如果开头分别为最大值和次大值或者次大值和最大值,则结果次大值和最大值都是最大值

应为逗号表达式的原因,所以要给这两个逗号表达式加上逗号

*/

void Find_Max_And_Max_Next(int a[],int
a_length)

{

         int
max,max_next;

         a[0]>a[1]?(max_next=a[1],max=a[0]):(max=a[1],max_next=a[0]);

         for(int
i=2;i<a_length;i++){

                   if(a[i]>max){

                            max_next=max;

                            max=a[i];

                   }

                   else
if(a[i]>max_next){

                            max_next=a[i];

                   }

         }

         printf("这个数组的最大值和次大值分别为 %d,%d\n",max,max_next);

}

 

 

 

 

//求一个含有重复值数组中的最大值出现的次数

/*

一边跑数组,一边计数,如果a[i]大于max 的话

给最大值赋值a[i]  a[i]==max的话计数器自加

*/

int Cnt_Max_Num(int a[],int a_length)

{

         int
max=a[0],max_cnt=0;

         for(int
i=0;i<a_length;i++){

                   if(a[i]>max){

                            max=a[i];

                            max_cnt=1;

                   }

                   else
if(max==a[i]){

                            max_cnt++;

                   }

         }

         printf("这个数组中的最大值是%d,出现了%d次\n",max,max_cnt);

         return
max_cnt;

}

 

 

 

//数组中含有不重复的连续值,要求删除数组中的重复值

/*

利用两重循环来删除数组中的重复值

设置一个标志falg 如果后面找到了重复值先将重复值后面的值向前移动,

然后将标志flag 置为0 然后推出这个查找循环

,利用标志flag 来判断是否查找到了关键值还有一个作用就是没找到多的话

flag值为1  以此来作为自变量i  后移的条件

 

注意:不能直接来一个for循环直接将自变量i进行后移操作

这样做的bug是当遇到了两个连续的重复值的时候,

由于自变量i后移导致一个重复值被跳过去,从而没有被删除,从而产生错误

*/

int Del_2_Number(int a[],int a_length)

{

         int
flag,i=0;

         while(i<a_length){

                   flag=1;

                   for(int
j=i+1;j<a_length&&flag;j++){

                            if(a[j]==a[i]){

                                     flag=0;

                                     a_length--;

                                     for(int
k=j;k<a_length;k++){

                                               a[k]=a[k+1];

                                     }

                            }

                   }

                   if(flag==1){

                            i++;

                   }

         }

         return
a_length;

}

 

 

 

 

//删除按照升序排列的含有重复值的数组中的重复元素

/*

利用一个新数组来存放这个不含有重复值的元赋

值到原来的那个数组上,利用一个变量来记录它的长度

然后我们会发现新建一个新数组是完全没有必要的

我们直接可以将这个值

*/

int _Del_2_Number(int a[],int a_length)

{

         int
flag,i=0,j=0;

         while(i<a_length){

                   flag=a[i];

                   a[j++]=flag;

                   while(a[i]==flag){

                            i++;

                   }

         }

         return
j;

}

/*

实现这个功能的第二个方法是利用二重循环来实现

时间复杂度较第一种方法来说高

*/

int _Del_2_Number_(int a[],int a_length)

{

         int
i,j;

         for(i=0;i<a_length;i++){

                   for(j=i+1;a[j]==a[i]&&j<a_length;){

                            a_length--;

                            for(int
k=j;k<a_length;k++){

                                     a[k]=a[k+1];

                            }

                   }

         }

         return
a_length;

}

 

 

 

 

 

 

#endif


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值