实验内容
任务一
根据给定的整型数组,以尾插法建立一个单链表,并实现以下操作:
① 查找:输入一个欲查找的整数,找到则显示第一个相匹配的整数在单链表中所处的位置,若不存在,则显示提示信息。
② 删除:输入一个欲删除的整数e ,若存在则在单链表中删除第一个值为e 的元素。
③ 插入:输入一个欲插入位置i 和欲插入元素e,将e 插入到第i 个整数之前(注意i 的合法性)。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct _node
{
int data; //data field
struct _node* next; //pointer field
}node,*link_node;
/*
l-next
l->data
l->next->data
*/
//尾插法创建的单链表
void create_list(link_node &head,int a[],int n)
{
node *p,*tail; //p用来指向新的结点,tail用来指向终端结点
head=(link_node)malloc(sizeof(node)); //链表分配空间
tail=head; //tail始终指向结点的尾部
for(int i=0;i<n;i++)
{
p=(link_node)malloc(sizeof(node)); //为p结点分配空间
p->data=a[i]; //赋值新结点
tail->next=p;
tail=p; //tail始终指向结点的尾部
}
tail->next=NULL;
}
//find elements
int find(link_node l,int i,int &position,int n)
{
link_node p=l;
int j=0;
while(p->data!=i) //目前的前一位
{
j++;
p=p->next;
}
}
//delete elements
void det(link_node l,int i,int &E)
{
link_node p=l;
if(p->next->data!=i)
{
p=p->next;
}
link_node q=p->next;
p->next=q->next;
E=q->data;
free(q); //free elements space
}
//insert elements
int insert(link_node &l)
{
int i=0,e=0,j=1;
printf("please enter the location that you want to insert:");
scanf("%d",&i);
printf("please enter the inserted elements:");
scanf("%d",&e);
link_node q=l; //q points to head
while(j<i)
{
++j;
q=q->next;
}
link_node p=(link_node)malloc(sizeof(node));
p->data=e;
p->next=q->next;
q->next=p;
return true;
}
//output elements
void print(link_node l)
{
node *temp=l;
printf("the elements of the single linked list:");
while(temp->next)
{
temp=temp->next;
printf("%d\t",temp->data);
}
printf("\n");
}
int main()
{
link_node l;
//创建列表
int n,a[n],i,e=0,position=0,p=0; //不知道为啥,不加这几个就会出错
printf("please enter the number of elements:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
create_list(l,a,n);
print(l); //print the single linked list
//find elements
int j=0;
printf("please enter which elements you want to find:");
scanf("%d",&j);
find(l,j,position,n);
printf("the location of elements that you want to find is %d\n",position);
//delete elements
int k=0;
printf("please enter which elements you want to delete:");
scanf("%d",&k);
det(l,k,e);
print(l);
//insert elements
insert(l);
print(l);
return 0;
}
任务二
顺序表的创建、插入、查找、删除
#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
#define increment 10 //Additional memory
typedef struct
{
int *elem; //the first address of memory
int length;
int size;
}sqlist;
/*
l.elem first address
l.length
l.elem[0]
l.elem[l.length-1]
l.size
*/
//initialization
int init_l(sqlist &l)
{
int len;
l.elem=(int *)malloc(maxsize*sizeof(int));
if(!l.elem) //内存不足
{
return false;
}
printf("please enter the length of teble:");
scanf("%d",&len);
l.length=len;
l.size=maxsize;
for(int i=0;i<l.length;i++)
{
scanf("%d",&l.elem[i]);
}
//冒泡排序法进行排序
//冒泡排序法
for(int i=0;i<l.length-1;i++)
{
for(int j=0;j<l.length-1-i;j++)
{
if(l.elem[j]>l.elem[j+1]) //如果遇到大于自己的数
{
int temp=l.elem[j];
l.elem[j]=l.elem[j+1];
l.elem[j+1]=temp;
}
}
}
}
//insert elements
int insert(sqlist &l)
{
int i,e;
printf("please enter the location you want to insert:");
scanf("%d",&i);
printf("please enter the elements you want to insert:");
scanf("%d",&e);
if(i<1 || i>l.length) //judge whether it is legal
{
printf("illegal location");
return false;
}
if(l.length==l.size) //memory full
{
int *base=(int *)realloc(l.elem,(l.size+increment)*sizeof(int)); //Allocate a new space
l.elem=base;
}
for(int j=l.length-1;j>=i-1;--j)
{
l.elem[j+1]=l.elem[j];
}
l.elem[i-1]=e;
l.length++;
}
//delete
int det(sqlist &l)
{
int e,i=0,E;
printf("please enter the elements you want to delete:");
scanf("%d",&e);
while(l.elem[i]!=e)
{
i++;
}
E=l.elem[i];
//printf("%d\n",E);
for(i;i<l.length-1;i++)
{
l.elem[i]=l.elem[i+1];
}
l.length--;
return true;
}
//find
int find(sqlist l)
{
int i=0,e;
printf("please enter the elements you want to find:");
scanf("%d",&e);
while(i<=l.length-1)
{
if(l.elem[i]==e) //find the target elements
{
printf("the location of found elements is:%d\n",i+1);
return false;
}
i++;
}
if(i>=l.length)
{
printf("there is no target elements in the table\n");
return false;
}
}
//print
int print(sqlist l)
{
printf("the elements of table:");
for(int i=0;i<l.length;i++)
{
printf("%3d",l.elem[i]);
}
printf("\n");
return true;
}
//main fuction
int main()
{
sqlist l,a,b;
init_l(l);
print(l);
//insert elements
insert(l);
print(l);
//delete
det(l);
print(l);
//find
find(l);
print(l);
}
任务三
首先创建L顺序表和A顺序表,然后通过冒泡排序法,将两个顺序表进行排序,
再创建B空顺序表,然后将L和A顺序表合并至B顺序表,再通过冒泡排序法将B顺序表进行派排序。最后遍历输出排序后的顺序表。
#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
#define increment 10 //Additional memory
typedef struct
{
int *elem; //the first address of memory
int length;
int size;
}sqlist;
/*
l.elem first address
l.length
l.elem[0]
l.elem[l.length-1]
l.size
*/
//initialization
int init(sqlist &l)
{
int len;
l.elem=(int *)malloc(maxsize*sizeof(int));
if(!l.elem) //内存不足
{
return false;
}
printf("please enter the length of teble:");
scanf("%d",&len);
l.length=len;
l.size=maxsize;
for(int i=0;i<l.length;i++)
{
scanf("%d",&l.elem[i]);
}
//冒泡排序法进行排序
//冒泡排序法
for(int i=0;i<l.length-1;i++)
{
for(int j=0;j<l.length-1-i;j++)
{
if(l.elem[j]>l.elem[j+1]) //如果遇到大于自己的数
{
int temp=l.elem[j];
l.elem[j]=l.elem[j+1];
l.elem[j+1]=temp;
}
}
}
}
//conbine table
int conbine(sqlist l,sqlist a,sqlist &b)
{
int k=0,m=0,j=0;
b.elem=(int *)malloc(maxsize*sizeof(int)); //Allocate new space
b.length=l.length+a.length;
b.size=l.size+a.size;
while(m<=l.length-1)
{
b.elem[k]=l.elem[m];
m++;
k++;
}
while(j<=a.length-1)
{
b.elem[k]=a.elem[j];
j++;
k++;
}
//排序
for(int i=0;i<b.length-1;i++)
{
for(int j=0;j<b.length-1-i;j++)
{
if(b.elem[j]>b.elem[j+1]) //如果遇到大于自己的数
{
int temp=b.elem[j];
b.elem[j]=b.elem[j+1];
b.elem[j+1]=temp;
}
}
}
}
//insert elements
int insert(sqlist &l)
{
int i,e;
printf("please enter the location you want to insert:");
scanf("%d",&i);
printf("please enter the elements you want to insert:");
scanf("%d",&e);
if(i<1 || i>l.length) //judge whether it is legal
{
printf("illegal location");
return false;
}
if(l.length==l.size) //memory full
{
int *base=(int *)realloc(l.elem,(l.size+increment)*sizeof(int)); //Allocate a new space
l.elem=base;
}
for(int j=l.length-1;j>=i-1;--j)
{
l.elem[j+1]=l.elem[j];
}
l.elem[i-1]=e;
l.length++;
}
//delete
int det(sqlist &l)
{
int e,i=0,E;
printf("please enter the elements you want to delete:");
scanf("%d",&e);
while(l.elem[i]!=e)
{
i++;
}
E=l.elem[i];
//printf("%d\n",E);
for(i;i<l.length-1;i++)
{
l.elem[i]=l.elem[i+1];
}
l.length--;
return true;
}
//find
int find(sqlist l)
{
int i=0,e;
printf("please enter the elements you want to find:");
scanf("%d",&e);
while(i<=l.length-1)
{
if(l.elem[i]==e) //find the target elements
{
printf("the location of found elements is:%d\n",i+1);
return false;
}
i++;
}
if(i>=l.length)
{
printf("there is no target elements in the table\n");
return false;
}
}
//print
int print(sqlist l,char str[])
{
printf("the elements of table %s:",str);
for(int i=0;i<l.length;i++)
{
printf("%3d",l.elem[i]);
}
printf("\n");
return true;
}
//main fuction
int main()
{
sqlist l,a,b;
char L[]="l",A[]="a",B[]="b";
int grade,j=0;
init(l);
print(l,L);
init(a);
print(a,A);
conbine(l,a,b);
print(b,B);
printf("1.insert elements\n2.delete elements\n3.find elements\n4.exit\n");
printf("please enter the fuction that you want:");
scanf("%d",&grade);
while(j<4)
{
switch (grade)
{
case 1:
//insert elements
insert(b);
print(b,B);
break;
case 2:
//delete
det(b);
print(b,B);
case 3:
//find
find(b);
print(b,B);
case 4:
printf("exit!");
break;
default:
printf("input error!!!");
break;
}
j++;
}
}