一、实验目的
系统地掌握线性表的顺序存储、链式存储的差异,实现顺序表和链表的建立、插入和删除操作。
二、实验内容
1、建立顺序表A,并在顺序表A上插入、删除1个元素。
2、已知单链表B中的元素以值递增有序排列,试写一算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素)同时释放被删除结点空间。
三、实验结果
1、顺序表A
步骤1:输入顺序表A的元素个数
步骤2:输入顺序表A中的n个元素
步骤3:输入要插入元素的位置和数值
步骤4:显示顺序表A的内容
#include <stdio.h>
#include <stdlib.h>
int *p , *new_p;
int n ,i;
int result_in(){
printf("你想要输入多少个数据:\n");
scanf("%d",&n);
p=(int *)malloc(n*sizeof(int));
for(i=0 ; i<n ; i++){
printf("请输入第%d个数据:",i+1);
scanf("%d",&p[i]);
}
return 0;
}
int result_out(){
for(i=0 ; i<n ;i++){
printf("%d ",p[i]);
}
printf("\n");
return 0;
}
int add(int pos, int ad){
new_p=(int *)realloc(p,(n+1)*sizeof(int));
for(i=n-1 ; i>=pos-1 ;i--){
new_p[i+1]=new_p[i];
}
new_p[pos-1]=ad;
n=n+1;
return 0;
}
int det(int de_pos){
for(i=de_pos-1 ; i<n ; i++){
new_p[i]=new_p[i+1];
}
n=n-1;
return 0;
}
int main(){
int pos ,ad;
int de_pos;
result_in();
printf("你想要在什么位置加入数据: ");
scanf("%d",&pos);
printf("你要加入的数据是:");
scanf("%d",&ad);
add(pos,ad);
result_out();
printf("你想要删除什么位置的数据:");
scanf("%d",&de_pos);
det(de_pos);
result_out();
}
2、单链表B
步骤1:输入单链表B的元素个数
步骤2:输入单链表B中的n个元素
步骤3:输入要删除元素的范围
步骤4:显示单链表B的内容
#include <stdio.h>
#include <stdlib.h>
#define NULL 0
struct node{
int data ;
struct node *next ;
};
struct node *head , *P ;
int n ,i;
int result_out(){
printf("output data:\n");
P=head->next;
while(P!=NULL)
{
printf("%d\n",P->data);
P=P->next;
}
return 0;
}
int del(int max ,int min){
struct node *q;
P=head->next;
for(i=0 ; i<n ;i++){
q=P->next;
if(q->data<min || q->data>max){
P->next=q->next;
free(q);
}
P=P->next;
}
return 0;
}
int main(){
int max , min;
printf("This is a linklist B:\n\n ");
head=(struct node *)malloc(1*sizeof(struct node));
head->data=0;
P=head;
printf("Input the number of the B:");
scanf("%d",&n);
printf("\n");
for(i=0 ; i<n ;i++){
P->next=(struct node *)malloc(1*sizeof(struct node));
P=P->next;
scanf("%d",&P->data);
}
P->next=NULL;
result_out();
printf("input max min:");
scanf("%d,%d",&max,&min);
del(max , min);
result_out();
}
一、实验目的
熟练掌握常用的查找、排序算法,深入理解各种查找、排序算法的结构特点及各算法之间的区别,并分别实现无序表的查找和有序表的查找。练习顺序查找、折半查找的实现。
二、实验内容
从键盘输入一个由n个数据,实现以下操作,并且使整个程序能够循环进行。
(1)进行顺序查找。
(2)进行直接插入排序、冒泡排序、简单选择排序、快速排序(选做其中2个)。
(3)在第2步排序结果的基础上进行递归和非递归的折半查找。
三、实现步骤:
步骤1:输入元素个数n
步骤2:输入n个数据元素
步骤3:选择菜单第1项
步骤4:输入要查找的数据
步骤5:显示线性查找结果
步骤6:选择菜单第2项
步骤7:显示直接插入排序每趟结果
步骤8:选择菜单第3项
步骤9:显示冒泡排序每趟结果
步骤10:选择菜单第4项
步骤11:显示直接选择排序每趟结果
步骤12:选择菜单第5项
步骤13:输入要查找的数据
步骤14:显示折半查找结果
步骤15:选择菜单第6项
步骤16:输入要查找的数据
步骤17:显示递归折半查找结果
#include <stdio.h>
#include <stdlib.h>
int i , n ;
int *p;
int shuchu(){
for(i=1 ; i<=n ; i++){
printf("%d\t",p[i]);
}
printf("\n");
return 0;
}
int Linear_search(int key){
for(i=n ; key!=p[i] ; i--);
return i;
}
int jiandanxuanze_sort(){
int t , j , k ,temp;
for(t=1 ; t<n ; t++){
k=t;
for(j=t+1 ; j<=n ; j++)
if(p[j]<p[k]) k=j;
if(k!=t){
temp=p[t];
p[t]=p[k];
p[k]=temp;
}
printf("The NO.%d sort data is\t",t);
shuchu();
}
return 0;
}
int bubblesort(){
int temp , a , b ;
int flag;
for(a=1 ; a<=n-1 ; a++){ //标记趟数,最多找n-1趟
flag=0;
for(b=1 ; b<=n-a ; b++) { //标记一趟里要找几次,每趟比上一趟少一次 ,也有pi的作用
if(p[b]>p[b+1]){
temp=p[b];
p[b]=p[b+1];
p[b+1]=temp;
flag=1;
}
}
printf("The NO.%d sort data is\t",a);
shuchu();
if(flag==0)break;
}
return 0;
}
int zheban_search(int key){
int high , low , mid;
low=1;
high=n;
while(low<=high){
mid=(low+high)/2;
if(p[mid]==key){
return mid;
}
else{
if(p[mid]<key){
low=mid+1;
}
else
high=mid-1;
}
}
return 0;
}
int digui_dearch(int key , int low , int high){
int mid;
if(low>high)
return -1;
mid=(high+low)/2;
if(p[mid]==key)
return mid;
else if(key < p[mid])
digui_dearch( key , low , mid-1);
else
digui_dearch( key , mid+1 , high);
}
int main(){
int c=0;
int key_num;
printf("Please input number of data:");
scanf("%d",&n);
p=(int *)malloc((n+1)*sizeof(int));
for(i=1 ; i<=n ; i++){
printf("Please input NO.%d data:",i);
scanf("%d",&p[i]);
}
printf("Display the data\n");
for(i=1 ; i<=n ; i++ ){
printf("%d\t",p[i]);
}
while(c!=6){
printf("\n");
printf("\t\t—————————\n");
printf("\t\t|*1. 顺序查找 |\n");
printf("\t\t|*2. 冒泡排序 |\n");
printf("\t\t|*3. 简单选择排序|\n");
printf("\t\t|*4. 非递归折半 |\n");
printf("\t\t|*5.递归折半查找 |\n");
printf("\t\t|*6. exit |\n");
printf("\t\t—————————\n");
printf("Please choose :");
scanf("%d",&c);
switch (c){
case 1:{
printf("Please input what you want to search:");
scanf("%d",&key_num);
i=Linear_search(key_num);
if(i>=0)
printf("The data's postition is %i" ,i);
else
printf("\nNot found!");
break;
}
case 2:{
bubblesort();
break;
}
case 3:{
jiandanxuanze_sort();
break;
}case 4:{
printf("Please input what you want to search:");
scanf("%d",&key_num);
i=zheban_search(key_num);
if(i!=0)
printf("The data's postition is %i" ,i);
else
printf("\nNot found!");
break;
}
case 5:{
int high , low ,mid;
low=1;
high=n;
printf("Please input what you want to search:");
scanf("%d",&key_num);
i=digui_dearch(key_num ,low , high);
if(i>=0)
printf("The data's postition is %i" ,i);
else
printf("\nNot found!");
break;
}
}
printf("\n\n\n");
}
return 0;
}