提起数据结构这门学科,相信绝大多数学计算机的同学对此门课程并不陌生,很多人对程序的定义是:程序 = 构数据结 + 算法,可见数据结构的重要性,想要写出好的程序,数据结构是一门必须要掌握的学科。

然而,很多人却把数据结构这门课学成了“离散数学”,只是初步的掌握了其中的手动模拟过程,真正要上手写代码的时候,往往感觉无从下手,这不是个例,而是一种通病。

数据结构在考研中同样占据着举足轻重的地位,无论是国家统一命题的计算机专业基础综合(408),还是各大高校的自命题中都会经常浮现出数据结构的身影。

因此,可见数据结构的重要性。考研中,大多数的学校让写的是伪码,这也就意味着你不需要写完整的程序,只需要把相应的接口留出来就行了。但是大家最好还是把代码实际敲出来运行一下,才会发现自己程序的bug,不断地踩坑,才能更好的避坑。接下来我们来看一道例题,来自王道书的第一个代码题。

 题目1:从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若表空则显示出错信息并退出程序。

程序如下:

#include<stdio.h>
#define MaxSize 10
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名
void InitSqList(SqList &l);//初始化线性表的函数声明明,因为线性表的数据长度会变化,所以形参设置成引用型
int DelMin(SqList &l);//删除最小值的函数声明
void Output(SqList l);//输出线性表的函数声明
int main()
{SqList l;InitSqList(l);printf("初始化的线性表:");Output(l);printf("\n被删元素:");int del_num = DelMin(l);printf("%d\n",del_num);printf("输出结果:");Output(l);return 0;}
void InitSqList(SqList &l)//这个函数对线性表进行初始化,我用的是直接对每个元素进行赋值,只是为了测试,当然可以用scanf用来输入
{l.data[0] = 3;l.data[1] = 2;l.data[2] = 5;l.data[3] = 8;l.data[4] = 4;l.length = 5;}
int DelMin(SqList &l)
{int min = l.data[0];//默认第零个元素最小 int minindex = 0;//用来记录最小值下表 if(l.length == 0){printf("null sqlist");} for(int i = 0;i<l.length;i++)//遍历线性表,找到最小值 {if (l.data[i]<min)//如果数组的第i个元素比最小值小 {/* code */min = l.data[i];//赋值给最小值 minindex = i;//记录下标 }}l.data[minindex] = l.data[l.length - 1];//根据题目意思用最后一个元素替换最小值 l.length--;//长度-1 return min; //返回最小值
}
void Output(SqList l)//对线性表进行输出
{for (int i = 0;i<l.length;i++){printf("%d ",l.data[i]);}}

运行结果如下:

当然在考研中,如果这样答题固然是对的,但是代码太冗余,数据结构在考研中考察的是思想,因此我们只需要给出相应的接口就行了,如果觉得不放心,可以把结构体写出来,此题的参考答案如下:

typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名 int DelMin(SqList &l)
{int min = l.data[0];//默认第零个元素最小 int minindex = 0;//用来记录最小值下表 if(l.length == 0){printf("null sqlist");} for(int i = 0;i<l.length;i++)//遍历线性表,找到最小值 {if (l.data[i]<min)//如果数组的第i个元素比最小值小 {/* code */min = l.data[i];//赋值给最小值 minindex = i;//记录下标 }}l.data[minindex] = l.data[l.length - 1];//根据题目意思用最后一个元素替换最小值 l.length--;//长度-1 return min; //返回最小值
}

 题目2:设计一个高效的算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。

程序如下:

#include<stdio.h>
#define MaxSize 10
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名
void InitSqList(SqList &l);//初始化线性表的函数声明明,因为线性表的数据长度会变化,所以形参设置成引用型
void ReserveSqList(SqList &l);//逆置元素的函数声明
void Output(SqList l);//输出线性表的函数声明
int main()
{SqList l;InitSqList(l);printf("初始化的线性表:");Output(l);ReserveSqList(l);printf("\n输出逆置结果:");Output(l);return 0;}
void InitSqList(SqList &l)//这个函数对线性表进行初始化,我用的是直接对每个元素进行赋值,只是为了测试,当然可以用scanf用来输入
{l.data[0] = 3;l.data[1] = 2;l.data[2] = 5;l.data[3] = 8;l.data[4] = 4;l.length = 5;}
void ReserveSqList(SqList &l)//题目指出空间复杂度为O(1),因此不能开辟新的内存空间,只能在数组内部进行操作
{int temp;//用于交换的中间变量 for(int i = 0;i<l.length/2;i++)//找到数组的中间位置 {temp = l.data[i];//将对称的元素进行交换 l.data[i] = l.data[l.length-1-i];l.data[l.length-1-i] = temp;}
}
void Output(SqList l)//对线性表进行输出
{for (int i = 0;i<l.length;i++){printf("%d ",l.data[i]);}}

运行结果如下:

此题的参考答案如下:

#define MaxSize 10
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名 void ReserveSqList(SqList &l)//题目指出空间复杂度为O(1),因此不能开辟新的内存空间,只能在数组内部进行操作
{int temp;//用于交换的中间变量 for(int i = 0;i<l.length/2;i++)//找到数组的中间位置 {temp = l.data[i];//将对称的元素进行交换 l.data[i] = l.data[l.length-1-i];l.data[l.length-1-i] = temp;}
} 

 题目3:对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的元素。

程序如下:

#include<stdio.h>
#define MaxSize 10
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名
void InitSqList(SqList &l);//初始化线性表的函数声明明,因为线性表的数据长度会变化,所以形参设置成引用型
int DelAllx1(SqList &l,int x,int n);//删除最小值的函数声明
int  DelAllx2(SqList &l,int x,int n);
void Output(SqList l);//输出线性表的函数声明
int main()
{SqList l;InitSqList(l);printf("初始化的线性表:");Output(l);DelAllx2(l,2,5);printf("\n输出结果:");Output(l);return 0;}
void InitSqList(SqList &l)//这个函数对线性表进行初始化,我用的是直接对每个元素进行赋值,只是为了测试,当然可以用scanf用来输入
{l.data[0] = 3;l.data[1] = 2;l.data[2] = 2;l.data[3] = 8;l.data[4] = 4;l.length = 5;}
int  DelAllx1(SqList &l,int x,int n)
{/*用这种算法的时候,很明显时间复杂度是O(x^2)不过在408统考中,只要能够实现功能,即使采用暴力求解的算法,也能拿到大部分分数,所以这种算法适合大部分人采用 */int count = 0;//coun用来记录x的个数 for(int i = 0;i<n-count;i++)//先遍历整个数组 {if(l.data[i] == x){for(int j = i+1;j<n-count;j++){l.data[j-1] = l.data[j];//做前移操作 }count++;l.length = n-count;i--;//防止有两个连续的x,因此每次操作完需要进行减一操作 }}}
int  DelAllx2(SqList &l,int x,int n)
{/*这种算法是符合题目要求的答案,时间复杂度O(n) */int count = 0;//count用来记录元素值不是x的个数 for(int i = 0;i<n;i++){if (l.data[i] != x)//当不是x的时候,让赋值给数组 {l.data[count] = l.data[i];count ++;} } l.length = count;}
void Output(SqList l)//对线性表进行输出
{for (int i = 0;i<l.length;i++){printf("%d ",l.data[i]);}}

运行结果如下:

此题的参考答案如下:

#define MaxSize 10
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名 int  DelAllx1(SqList &l,int x,int n)
{/*用这种算法的时候,很明显时间复杂度是O(x^2)不过在408统考中,只要能够实现功能,即使采用暴力求解的算法,也能拿到大部分分数,所以这种算法适合大部分人采用 */int count = 0;//coun用来记录x的个数 for(int i = 0;i<n-count;i++)//先遍历整个数组 {if(l.data[i] == x){for(int j = i+1;j<n-count;j++){l.data[j-1] = l.data[j];//做前移操作 }count++;l.length = n-count;i--;//防止有两个连续的x,因此每次操作完需要进行减一操作 }}}int  DelAllx2(SqList &l,int x,int n)
{/*这种算法是符合题目要求的答案,时间复杂度O(n) */int count = 0;//count用来记录元素值不是x的个数 for(int i = 0;i<n;i++){if (l.data[i] != x)//当不是x的时候,让赋值给数组 {l.data[count] = l.data[i];count ++;} } l.length = count;}

 题目4:设从有序顺序表中删除其值在给定值s和t之间(包含s和t,要求是s<t)的所有元素,如果s或t不合理或顺序表为空,则显示出错信息并退出运行。

程序如下:

#include<stdio.h>
#define MaxSize 10
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名
void InitSqList(SqList &l);//初始化线性表的函数声明明,因为线性表的数据长度会变化,所以形参设置成引用型
int DelElem1(SqList &l,int s,int t);//删除的函数声明
int DelElem2(SqList &l,int s,int t);//删除的函数声明
void Output(SqList l);//输出线性表的函数声明
int main()
{SqList l;InitSqList(l);printf("初始化的线性表:");Output(l);DelElem2(l,1,4);  printf("\n输出结果:");Output(l);return 0;}
void InitSqList(SqList &l)//这个函数对线性表进行初始化,我用的是直接对每个元素进行赋值,只是为了测试,当然可以用scanf用来输入
{l.data[0] = 1;l.data[1] = 2;l.data[2] = 3;l.data[3] = 4;l.data[4] = 5;l.length = 5;}
int DelElem1(SqList &l,int s,int t)
{/*可以遍历整个数组,对s和t之间的元素进行删除,并依此移动后面的元素*/if(l.length == 0){printf("null sqlist");return 0;}if(s >= t){printf("error range");return 0;}int count = 0;//count用来记录s和t之间的元素 for(int i = 0;i<l.length-count;i++){if(l.data[i]>s && l.data[i]<t){for(int j = i+1;j<l.length-count;j++){l.data[j-1] = l.data[j];}count++;i--;//防止下一个元素也是属于s和t之间 }}l.length = l.length - count;
}
int DelElem2(SqList &l,int s,int t)
{/*找到不是s和t之间的元素,依此存放到数组,这个效率更高*/if(l.length == 0){printf("null sqlist");return 0;}if(s >= t){printf("error range");return 0;}int count = 0;for (int i = 0;i<l.length;i++){if(l.data[i]<=s||l.data[i]>=t){l.data[count] = l.data[i];count++;}  }l.length = count;}
void Output(SqList l)//对线性表进行输出
{for (int i = 0;i<l.length;i++){printf("%d ",l.data[i]);}}

运行结果如下:

此题的参考答案如下:

#define MaxSize 10
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名 int DelElem1(SqList &l,int s,int t)
{/*可以遍历整个数组,对s和t之间的元素进行删除,并依此移动后面的元素*/if(l.length == 0){printf("null sqlist");return 0;}if(s >= t){printf("error range");return 0;}int count = 0;//count用来记录s和t之间的元素 for(int i = 0;i<l.length-count;i++){if(l.data[i]>s && l.data[i]<t){for(int j = i+1;j<l.length-count;j++){l.data[j-1] = l.data[j];}count++;i--;//防止下一个元素也是属于s和t之间 }}l.length = l.length - count;
}int DelElem2(SqList &l,int s,int t)
{/*找到不是s和t之间的元素,依此存放到数组,这个效率更高*/if(l.length == 0){printf("null sqlist");return 0;}if(s >= t){printf("error range");return 0;}int count = 0;for (int i = 0;i<l.length;i++){if(l.data[i]<=s||l.data[i]>=t){l.data[count] = l.data[i];count++;}  }l.length = count;}

 题目5:从有序的顺序表中删除所有其值重复的元素,使得表中所有元素不重复。

程序如下:

#include<stdio.h>
#define MaxSize 10
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名
void InitSqList(SqList &l);//初始化线性表的函数声明明,因为线性表的数据长度会变化,所以形参设置成引用型
int DelSam(SqList &l);//删除相同元素的函数声明
void Output(SqList l);//输出线性表的函数声明
int main()
{SqList l;InitSqList(l);printf("初始化的线性表:");Output(l);DelSam(l);printf("\n输出结果:");Output(l);return 0;}
void InitSqList(SqList &l)//这个函数对线性表进行初始化,我用的是直接对每个元素进行赋值,只是为了测试,当然可以用scanf用来输入
{l.data[0] = 3;l.data[1] = 5;l.data[2] = 5;l.data[3] = 5;l.data[4] = 5;l.length = 5;}
int DelSam(SqList &l)
{int count = 0;//count用来记录不是重复元素的下标 for(int i = 0;i<l.length-1;i++)//遍历整个数组 {if(l.data[i] != l.data[i+1])//当i和i+1元素值不重复的时候 {count++;//把i+1放进数组 l.data[count] = l.data[i+1];}}l.length = count+1;//更新数组的有效长度
}
void Output(SqList l)//对线性表进行输出
{for (int i = 0;i<l.length;i++){printf("%d ",l.data[i]);}}

运行结果如下:

此题的参考答案如下 :

#define MaxSize 10
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名 int DelSam(SqList &l)
{int count = 0;//count用来记录不是重复元素的下标 for(int i = 0;i<l.length-1;i++)//遍历整个数组 {if(l.data[i] != l.data[i+1])//当i和i+1元素值不重复的时候 {count++;//把i+1放进数组 l.data[count] = l.data[i+1];}}l.length = count+1;//更新数组的有效长度
}

题目6:将两个有序顺序表合并成一个新的有序顺序表,并由函数返回结果顺序表。

程序如下:

#include<stdio.h>
#define MaxSize 16//注意数组的长度,超出长度会输出错误的结果
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名
void InitSqList(SqList &l1,SqList &l2);//初始化线性表的函数声明明,因为线性表的数据长度会变化,所以形参设置成引用型
SqList MergeSqList(SqList &l1,SqList &l2,SqList &l);//合并有序表的函数声明
void Output(SqList l);//输出线性表的函数声明
int main()
{SqList l1,l2;SqList l;InitSqList(l1,l2);printf("初始化的线性表l1:");Output(l1);printf("\n");printf("初始化的线性表l2:");Output(l2);l = MergeSqList(l1,l2,l);printf("\n输出结果:");Output(l);return 0;}
void InitSqList(SqList &l1,SqList &l2)//这个函数对线性表进行初始化,我用的是直接对每个元素进行赋值,只是为了测试,当然可以用scanf用来输入
{l1.data[0] = 1;l1.data[1] = 2;l1.data[2] = 4;l1.data[3] = 7;l1.data[4] = 9;l1.length = 5;l2.data[0] = 0;l2.data[1] = 3;l2.data[2] = 6;l2.data[3] = 8;l2.data[4] = 13;l2.data[5] = 14;l2.data[6] = 18;l2.length = 7;}
SqList MergeSqList(SqList &l1,SqList &l2,SqList &l)
{int length = l1.length < l2.length ? l1.length:l2.length;//得到两个顺序表的最小长度 int i = 0,j = 0;int count = 0;while(i<length && j<length)//当l1和l2都没合并结束的时候,循环 {if(l1.data[i] < l2.data[j])//把每次比较的最小值插入新的顺序表 {l.data[count] = l1.data[i];i++;count++;//用于给新的顺序表进行计数 }else{l.data[count] = l2.data[j];j++;count++;}}if(i==length)//l1合并结束 {for(int m = j;m<l2.length;m++)//继续排列剩下的元素 {l.data[count] = l2.data[m];count++;}}else//l2合并结束 {for(int n = i;n<l1.length;n++){l.data[count] = l1.data[n];count++;}}l.length = count;//更新新顺序表l的长度 return l;}
void Output(SqList l)//对线性表进行输出
{for (int i = 0;i<l.length;i++){printf("%d ",l.data[i]);}}

运行结果如下:

此题的参考答案如下 :

#define MaxSize 16//注意数组的长度,超出长度会输出错误的结果
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名 SqList MergeSqList(SqList &l1,SqList &l2,SqList &l)
{int length = l1.length < l2.length ? l1.length:l2.length;//得到两个顺序表的最小长度 int i = 0,j = 0;int count = 0;while(i<length && j<length)//当l1和l2都没合并结束的时候,循环 {if(l1.data[i] < l2.data[j])//把每次比较的最小值插入新的顺序表 {l.data[count] = l1.data[i];i++;count++;//用于给新的顺序表进行计数 }else{l.data[count] = l2.data[j];j++;count++;}}if(i==length)//l1合并结束 {for(int m = j;m<l2.length;m++)//继续排列剩下的元素 {l.data[count] = l2.data[m];count++;}}else//l2合并结束 {for(int n = i;n<l1.length;n++){l.data[count] = l1.data[n];count++;}}l.length = count;//更新新顺序表l的长度 return l;}

题目7:从已知在一维数组A[m+n]中依此存放两个线性表(a1,a2,a3……am)和(b1,b2,b3……bn)试编写一个函数,将数组中两个顺序表的位置交换,即将(b1,b2,b3……bn)放在(a1,a2,a3……am)的前面。

程序如下:

#include<stdio.h>
#define MaxSize 10
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名
void InitSqList(SqList &l);//初始化线性表的函数声明明,因为线性表的数据长度会变化,所以形参设置成引用型
void ReserveSqList(SqList &l,int m,int n);//逆置元素的函数声明
void Output(SqList l);//输出线性表的函数声明
int main()
{SqList l;InitSqList(l);printf("初始化的线性表:");Output(l);ReserveSqList(l,3,5);printf("\n输出结果:");Output(l);return 0;}
void InitSqList(SqList &l)//这个函数对线性表进行初始化,我用的是直接对每个元素进行赋值,只是为了测试,当然可以用scanf用来输入
{l.data[0] = 0;l.data[1] = 1;l.data[2] = 2;l.data[3] = 3;l.data[4] = 4;l.data[5] = 5;l.data[6] = 6;l.data[7] = 7;l.length = 8;}
void ReserveSqList(SqList &l,int m,int n)
{int temp;//用于交换的中间变量 for(int i = 0;i<m/2;i++)//找到数组的中间位置 {temp = l.data[i];//将对称的元素进行交换 l.data[i] = l.data[m-1-i];l.data[m-1-i] = temp;}for(int i = m;i<(n+m+m-1)/2+1;i++)//找到数组的中间位置 {temp = l.data[i];//将对称的元素进行交换 l.data[i] = l.data[n+m+m-1-i];l.data[n+m+m-1-i] = temp;}for(int i = 0;i<l.length/2;i++)//找到数组的中间位置 {temp = l.data[i];//将对称的元素进行交换 l.data[i] = l.data[l.length-1-i];l.data[l.length-1-i] = temp;}
}
void Output(SqList l)//对线性表进行输出
{for (int i = 0;i<l.length;i++){printf("%d ",l.data[i]);}}

运行结果如下:

此题的参考答案如下 :

#define MaxSize 10
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名 void ReserveSqList(SqList &l,int m,int n)
{int temp;//用于交换的中间变量 for(int i = 0;i<m/2;i++)//找到数组的中间位置 {temp = l.data[i];//将对称的元素进行交换 l.data[i] = l.data[m-1-i];l.data[m-1-i] = temp;}for(int i = m;i<(n+m+m-1)/2+1;i++)//找到数组的中间位置 {temp = l.data[i];//将对称的元素进行交换 l.data[i] = l.data[n+m+m-1-i];l.data[n+m+m-1-i] = temp;}for(int i = 0;i<l.length/2;i++)//找到数组的中间位置 {temp = l.data[i];//将对称的元素进行交换 l.data[i] = l.data[l.length-1-i];l.data[l.length-1-i] = temp;}
}

题目8:从线性表(a1,a2,a3……an)中的元素递增有序且按顺序存储于计算机内。要求设计一个算法,完成用最少时间在表中查找值为x的元素,若找到则将其与后继元素位置相交换,若找不到则将其插入到表中并使表中元素扔递增有序。

程序如下:

#include<stdio.h>
#define MaxSize 16
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名
void InitSqList(SqList &l);//初始化线性表的函数声明明,因为线性表的数据长度会变化,所以形参设置成引用型
void InsertElem(SqList &l,int x);
void Output(SqList l);//输出线性表的函数声明
int main()
{SqList l;InitSqList(l);printf("初始化的线性表:");Output(l);InsertElem(l,4);printf("\n输出结果:");Output(l);return 0;}
void InitSqList(SqList &l)//这个函数对线性表进行初始化,我用的是直接对每个元素进行赋值,只是为了测试,当然可以用scanf用来输入
{l.data[0] = 0;l.data[1] = 1;l.data[2] = 2;l.data[3] = 3;l.data[4] = 5;l.data[5] = 6;l.data[6] = 7;l.data[7] = 8;l.length = 8;}
void InsertElem(SqList &l,int x)
{int flag = 1;//1表示 找到了,0表示没找到 int temp;int i;for(i = 0;i<l.length;i++){if(l.data[i]==x){temp = l.data[i];l.data[i] = l.data[i+1];l.data[i+1] = temp;break;        }if(l.data[i] > x)//没找到x {flag = 0;break;//跳出,记录i }}if(flag == 0){for(int j = l.length-1;j>=i;j--){l.data[j+1] = l.data[j];}l.data[i] = x;l.length++;}}
void Output(SqList l)//对线性表进行输出
{for (int i = 0;i<l.length;i++){printf("%d ",l.data[i]);}}

运行结果如下:

此题的参考答案如下 :

#define MaxSize 16
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名 void InsertElem(SqList &l,int x)
{int flag = 1;//1表示 找到了,0表示没找到 int temp;int i;for(i = 0;i<l.length;i++){if(l.data[i]==x){temp = l.data[i];l.data[i] = l.data[i+1];l.data[i+1] = temp;break;        }if(l.data[i] > x)//没找到x {flag = 0;break;//跳出,记录i }}if(flag == 0){for(int j = l.length-1;j>=i;j--){l.data[j+1] = l.data[j];}l.data[i] = x;l.length++;}}

题目9:【2010统考真题】设将n(n>1)个整数存放到一维数组R中。设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移P(0<p<n)个位置,即将数据由(X0,X1……,Xn-1)变换成(Xp,Xp+1,……,Xn-1,X0,X1,……,Xp-1)。要求:

1)给出算法的基本设计思想。

答:这一题跟前面的第七题几乎是一样的,可以先将0-p-1的元素进行逆置,然后将p-1-n-1元素进行逆置,然后将整个数组进行逆置。

2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。

(这里虽然说可以用java语言,但是后面的真题已经把java给删除了,只让用c和c++)

#define MaxSize 10
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名 void ReserveSqList(SqList &l,int m)
{int temp;//用于交换的中间变量 int n = l.length-m; for(int i = 0;i<m/2;i++)//找到数组的中间位置 {temp = l.data[i];//将对称的元素进行交换 l.data[i] = l.data[m-1-i];l.data[m-1-i] = temp;}for(int i = m;i<(n+m+m-1)/2+1;i++)//找到数组的中间位置 {temp = l.data[i];//将对称的元素进行交换 l.data[i] = l.data[n+m+m-1-i];l.data[n+m+m-1-i] = temp;}for(int i = 0;i<l.length/2;i++)//找到数组的中间位置 {temp = l.data[i];//将对称的元素进行交换 l.data[i] = l.data[l.length-1-i];l.data[l.length-1-i] = temp;}
} 

3)说明你所设计的算法的时间和空间复杂度。

时间复杂度O(n),空间复杂度O(1)

运行结果如下:

题目10:【2011统考真题】从一个长度为L(L>=1)的升序序列S,处在第个位置的数称为S的中位数。例如,若序列S1=(11,13,15,17,19)则S1的中位数是15,两个序列的中位数是含他们所有元素的升序序列的中位数。例如,若S2=(2,4,6,8,20),则S1和S2的中位数是11。现在有两个升序序列A和B,试设计一个在时间和空间上都尽可能高效的算法,找出A和B的中位数。要求:

1)给出算法的基本设计思想。

答:这一题跟前面的第六题也是基本一样的,首先找到s1和s2长度的最小值,遍历到长度最小值为止,当s1的data【i】比较小的时候则插入到新的数组中,直到其中一个序列插入结束,然后另一个序列剩下的全部插入到新的数组中。

2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。

#define MaxSize 16//注意数组的长度,超出长度会输出错误的结果
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名 void MergeSqList(SqList &l1,SqList &l2,SqList &l)
{int length = l1.length < l2.length ? l1.length:l2.length;//得到两个顺序表的最小长度 int i = 0,j = 0;int count = 0;while(i<length && j<length)//当l1和l2都没合并结束的时候,循环 {if(l1.data[i] < l2.data[j])//把每次比较的最小值插入新的顺序表 {l.data[count] = l1.data[i];i++;count++;//用于给新的顺序表进行计数 }else{l.data[count] = l2.data[j];j++;count++;}}if(i==length)//l1合并结束 {for(int m = j;m<l2.length;m++)//继续排列剩下的元素 {l.data[count] = l2.data[m];count++;}}else//l2合并结束 {for(int n = i;n<l1.length;n++){l.data[count] = l1.data[n];count++;}}l.length = count;//更新新顺序表l的长度 printf("\n中位数是:%d\n",l.data[l.length/2]);}

3)说明你所设计的算法的时间和空间复杂度。

时间复杂度O(min(n,m)),空间复杂度O(m+n)

程序如下:

#include<stdio.h>
#define MaxSize 16//注意数组的长度,超出长度会输出错误的结果
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名
void InitSqList(SqList &l1,SqList &l2);//初始化线性表的函数声明明,因为线性表的数据长度会变化,所以形参设置成引用型
void MergeSqList(SqList &l1,SqList &l2,SqList &l);//合并有序表的函数声明
void Output(SqList l);//输出线性表的函数声明
int main()
{SqList l1,l2;SqList l;InitSqList(l1,l2);printf("初始化的线性表l1:");Output(l1);printf("\n");printf("初始化的线性表l2:");Output(l2);MergeSqList(l1,l2,l);return 0;}
void InitSqList(SqList &l1,SqList &l2)//这个函数对线性表进行初始化,我用的是直接对每个元素进行赋值,只是为了测试,当然可以用scanf用来输入
{l1.data[0] = 1;l1.data[1] = 2;l1.data[2] = 4;l1.data[3] = 7;l1.data[4] = 9;l1.length = 5;l2.data[0] = 0;l2.data[1] = 3;l2.data[2] = 6;l2.data[3] = 8;l2.data[4] = 13;l2.data[5] = 14;l2.data[6] = 18;l2.length = 7;}
void MergeSqList(SqList &l1,SqList &l2,SqList &l)
{int length = l1.length < l2.length ? l1.length:l2.length;//得到两个顺序表的最小长度 int i = 0,j = 0;int count = 0;while(i<length && j<length)//当l1和l2都没合并结束的时候,循环 {if(l1.data[i] < l2.data[j])//把每次比较的最小值插入新的顺序表 {l.data[count] = l1.data[i];i++;count++;//用于给新的顺序表进行计数 }else{l.data[count] = l2.data[j];j++;count++;}}if(i==length)//l1合并结束 {for(int m = j;m<l2.length;m++)//继续排列剩下的元素 {l.data[count] = l2.data[m];count++;}}else//l2合并结束 {for(int n = i;n<l1.length;n++){l.data[count] = l1.data[n];count++;}}l.length = count;//更新新顺序表l的长度 printf("\n中位数是:%d\n",l.data[l.length/2]);}
void Output(SqList l)//对线性表进行输出
{for (int i = 0;i<l.length;i++){printf("%d ",l.data[i]);}}

运行结果如下:

题目11:【2013统考真题】从已知一个整数序列A=(a0,a1,……,an-1)其中0<=ai<n(0<=i<n)。若存在ap1=ap2=……=apm=x且m>n/2(0<=pk<n,1<=k<=m),则称x为A的主元素。例如A=(0,5,5,3,5,7,5,5),则5为主元素:又如A=(0,5,5,3,5,1,5,7),则A中没有主元素。假设A中的n个主元素保存在一维数组中,请设计一个尽可能高效的算法,找出A的主元素。若主元素存在,则输出主元素;否则输出-1.要求:

1)给出算法的基本设计思想。

用两个for循环,外层循环用来遍历数组的每个下标,内层元素用来遍历下标后到结束的元素值,得到每个下标元素的长度,并更新每次的遍历结果,得到候选主元素的lengthmax、和value。

2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。

#define MaxSize 16
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名 void FindNumberMax(SqList &l)
{int lengthmax = 0,length=0,value=0;//lengthmax 用来记录最大的元素长度,length用来保存每次查找到的元素长度,value用来保存候选主元素值 for(int i = 0;i<l.length-1;i++){for(int j = i+1;j<l.length;j++){if(l.data[i]==l.data[j])//查找到与l.data[i]相同的值, {length++;//候选主元素的长度加 1}}if(length>lengthmax){lengthmax =  length+1;//自身还没有算,因此要加一 value = l.data[i];}length = 0;}
//  printf("\n%d  %d\n",value,lengthmax);printf("\n");if(lengthmax > 2/l.length)//判断是不是主元素 {printf("main elem is :%d",value);}else{printf("no main elem ");}}

3)说明你所设计的算法的时间和空间复杂度。

时间复杂度O(),空间复杂度O(1).

程序如下:

#include<stdio.h>
#define MaxSize 16
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名
void InitSqList(SqList &l);//初始化线性表的函数声明明,因为线性表的数据长度会变化,所以形参设置成引用型
void FindNumberMax(SqList &l);
void Output(SqList l);//输出线性表的函数声明
int main()
{SqList l;InitSqList(l);printf("初始化的线性表:");Output(l);FindNumberMax(l);return 0;}
void InitSqList(SqList &l)//这个函数对线性表进行初始化,我用的是直接对每个元素进行赋值,只是为了测试,当然可以用scanf用来输入
{l.data[0] = 1;l.data[1] = 0;l.data[2] = 2;l.data[3] = 2;l.data[4] = 2;l.data[5] = 2;l.data[6] = 2;l.data[7] = 8;l.length = 8;}
void FindNumberMax(SqList &l)
{int lengthmax = 0,length=0,value=0;//lengthmax 用来记录最大的元素长度,length用来保存每次查找到的元素长度,value用来保存候选主元素值 for(int i = 0;i<l.length-1;i++){for(int j = i+1;j<l.length;j++){if(l.data[i]==l.data[j])//查找到与l.data[i]相同的值, {length++;//候选主元素的长度加 1}}if(length>lengthmax){lengthmax =  length+1;//自身还没有算,因此要加一 value = l.data[i];}length = 0;}
//  printf("\n%d  %d\n",value,lengthmax);printf("\n");if(lengthmax > 2/l.length)//判断是不是主元素 {printf("main elem is :%d",value);}else{printf("no main elem ");}}
void Output(SqList l)//对线性表进行输出
{for (int i = 0;i<l.length;i++){printf("%d ",l.data[i]);}}

运行结果如下:

题目12:【2018统考真题】从给定一个含n(n>=1)个整数的数组,请设计一个在时间和空间上尽可能高效的算法,找出数组中未出现的最小正整数。例如,数组{-5,3,2,3}中未出现的最小正整数是1;数组{1,2,3}中未出现的最小正整数是4。要求:

1)给出算法的基本设计思想。

遍历数组,找到负数直接退出循环,用第一个元素当做最大值,当有大于max的时候,更新max;如果有负数,返回1,没有负数返回max+1.

2)根据设计思想,采用C或C++语言描述算法,关键之处给出注释。

#define MaxSize 10
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名 int FindMinZheng(SqList &l)
{int flag = 0;//0表示没有负数,1表示有负数 int max = l.data[0];for(int i = 0;i<l.length;i++)//遍历数组 {if(l.data[i]<0)//存在负数 {flag = 1;break;}else if(l.data[i]>max){max = l.data[i];}} if(flag == 1){return 1;}else{return max+1;}
}

3)说明你所设计的算法的时间和空间复杂度。

时间复杂度O(n),空间复杂度O(1)

程序如下:

#include<stdio.h>
#define MaxSize 10
typedef struct //定义一个结构体变量
{int data[MaxSize]; //定义结构体变量的属性,data数组用来存放数据 int length; //length用来记录data数组的长度
}SqList;//给结构体取一个别名
void InitSqList(SqList &l);//初始化线性表的函数声明明,因为线性表的数据长度会变化,所以形参设置成引用型
int FindMinZheng(SqList &l);
void Output(SqList l);//输出线性表的函数声明
int main()
{SqList l;InitSqList(l);printf("初始化的线性表:");Output(l);int num = FindMinZheng(l);printf("\n输出结果:%d",num);return 0;}
void InitSqList(SqList &l)//这个函数对线性表进行初始化,我用的是直接对每个元素进行赋值,只是为了测试,当然可以用scanf用来输入
{l.data[0] = 4;l.data[1] = -1;l.data[2] = 2;l.data[3] = 3;l.data[4] = 3;l.length = 5;}
int FindMinZheng(SqList &l)
{int flag = 0;//0表示没有负数,1表示有负数 int max = l.data[0];for(int i = 0;i<l.length;i++)//遍历数组 {if(l.data[i]<0)//存在负数 {flag = 1;break;}else if(l.data[i]>max){max = l.data[i];}} if(flag == 1){return 1;}else{return max+1;}
}
void Output(SqList l)//对线性表进行输出
{for (int i = 0;i<l.length;i++){printf("%d ",l.data[i]);}}

运行结果如下:

写道这里,王道书上的线性表的顺序存储部分的代码应该是完成了,代码题其实重要的是思路,有思路才能动手写,还是得多练习,多思考,多模仿,形成自己的代码,在套路中学习。才能得到成长。下一个专题,我会更新线性表的链式存储部分的代码。

(如有错误,恳请各位不吝赐教,有时间我会一直更新数据结构的代码)

考研数据结构中的代码如何写——线性表的顺序存储相关推荐

  1. 线性表的顺序存储结构

    一,什么是线性表 零个或多个数据元素的有限序列 说明: 它是一个序列,即,元素之间是有顺序的.(第一个元素无前驱,最后一个元素无后继,其他每个元素有且只有一个前驱和后继) 线性表强调有限. 二,数学语 ...

  2. 实验一 线性表的顺序存储与实现_【自考】数据结构中的线性表,期末不挂科指南,第2篇

    线性表 这篇博客写的是线性表相关的内容,包括如下部分,先看下有木有期待 啥是线性表 线性表的顺序存储 线性表的基本运算在顺序表上的实现 线性表的链式存储 线性表的基本运算在单链表上的实现 循环链表与双 ...

  3. 数据结构代码--线性表的顺序存储结构

    /*** 线性表的顺序存储结构*/ public class SqList {int[] data;int length;public SqList(int leng, int length) {th ...

  4. 实验一 线性表的顺序存储与实现_数据结构篇之单链表的创建以及实现

    上次咱们已经一起分享了线性表的顺序存储的基本创建以及一些运算方法的实现,那么这次咱们主要来研究线性表的链式存储,俗称单链表,咱们知道顺序表在建立的时候要注意需要建立一块连续的空间,所以需要使用数组在内 ...

  5. 《数据结构》c语言版学习笔记——线性表的顺序存储结构

    线性表的顺序存储结构 第一章 线性表的顺序存储结构 文章目录 线性表的顺序存储结构 前言 一.顺序存储结构的建立 1.条件 2.代码 二.顺序存储结构的获得元素 1.条件 2.代码 三.顺序存储结构的 ...

  6. 线性表:2.线性表的顺序存储结构--顺序表及C语言实现

    逻辑结构上呈线性分布的数据元素在实际的物理存储结构中也同样相互之间紧挨着,这种存储结构称为 线性表的顺序存储结构 . 也就是说,逻辑上具有线性关系的数据按照前后的次序全部存储在一整块连续的内存空间中, ...

  7. 顺序表(线性表的顺序存储)---C语言版

    目录 顺序表 一.顺序表的定义 二.顺序表上基本操作的具体实现 1.`InitList_Sq(*L)`:初始化表.构造一个空的顺序表. 分类一:主函数里声明的是一个指向顺序表的指针 分类二:主函数里声 ...

  8. 线性表的顺序存储结构及基本操作

    学习书籍<大话数据结构>,自学完后,总结一下,以后也好复习 ,欢迎互相交流. 线性表的基本操作功能如下: InitList(*L):          初始化操作,建立一个空的线性表L L ...

  9. 一、线性表的顺序存储和基本运算

    线性表的顺序存储: 线性表的顺序存储指的是将线性表的数据元素按其逻辑次序依次存入一组地址连续的单元里,用这种方法存储的线性表称为顺序表. 只要确定线性表存储的起始位置,线性表中任意一个元素都可以随机存 ...

  10. 【数据结构】之线性表(顺序存储结构)

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/ ...

最新文章

  1. 中国剩余定理与扑克游戏
  2. C语言输入一行整数(OJ输入格式)
  3. 数据挖掘原理与算法:Jupyter
  4. 【工作感悟】——聊聊面试那些事
  5. ubuntu10右键脚本中增加发送到命令
  6. 将tomcat添加到服务中
  7. [Java基础]抽象类基础
  8. php 文章读取_php实现获取文章内容第一张图片的方法
  9. 关于ajax请求400问题解决
  10. HTTP之Cookie和Session(C++ Qt框架实现)
  11. 七牛php连麦,七牛IOS连麦,主播端无法采集声音
  12. Nginx安装及配置文件解释
  13. vue-cli中的babel配置文件.babelrc详解
  14. 点对点信道互连以太网实验_轩辕实验室┃SOTIF:汽车以太网容错能力测试(1)...
  15. 更换tomcat 地址栏图标
  16. 批量生成条形码——《超级处理器》应用
  17. 容器CICD实践:基于Helm实现应用交付自动回滚
  18. HDFS物理块存储大小
  19. 公众号微信朋友圈分享提示签名失败 easywechat 微信朋友圈分享签名失败
  20. urlencode、unquote

热门文章

  1. java计算机毕业设计美发门店管理系统源码+系统+数据库+lw文档
  2. win10-linux双系统安装教程
  3. python工作流界面_python 版工作流设计
  4. python常用的颜色英文表达_python常用颜色
  5. php html 去空格 换行,实用的php清除html,php去除空格与换行,php清除空白行和换行,提取页面纯文本...
  6. XILINX FPGA数字信号处理——8、FIR滤波器和IIR滤波器原理及实现
  7. 单片机课程设计:基于STM32智能交通灯的设计
  8. python物理建模初学者指南 pdf 脚本之家_Blender权威指南 罗聪翼 著 中文 PDF 清晰扫描版 [114M]...
  9. IOS-40-测试环境与正式环境的代码通过标示符来区分
  10. Cisco dynamips模拟器安装指南