数据结构中数组的操作
/*
线性表的操作
*/
#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