分别附代码和运行结果
顺序表
实验代码:
#define size 10
#define insize 10
#define TRUE 1
#define FLASE 0
#define OK 1
#define ERROR 0
#include <stdio.h>
#include<stdlib.h>
typedef struct{
int *elem;
int length;
int listsize;
}*Sqlist;
int Initlist_Sq(Sqlist s);//构造一个新的线性表s
int ListInsert_Sq(Sqlist s,int i,int e);//在线性表s的第i个元素之前插入新的元素e
int ListDelete_Sq(Sqlist s,int i,int *e);//删除线性表s的第i个元素并用e返回
int GetElem_Sq(Sqlist s,int i,int *e);//获取线性表s的第i个元素并用e返回
int ListEmpty(Sqlist s);//判断表是否为空表 返回true或者false
int DestroyList_Sq(Sqlist s);//销毁线性表
int ClearList_Sq(Sqlist s);//将线性表重置为空表
int Listlength(Sqlist s);//返回表的长度
int OperateMenu();//建立菜单,提示操作代码
Sqlist scanfs();//向线性表赋值并返回基地址到调用处
void printfs(Sqlist s);//将线性表s中的元素依次打印
void main(){
Sqlist s=NULL;
char ch;
int a,b,c,d,f,g;
printf("是否要进行操作?(继续输入Y或者y,否则结束)\n");
scanf("%c",&ch);
while(ch=='Y'||ch=='y'){
switch(OperateMenu()){
case 1:
s=scanfs();
if(!ListEmpty(s))printf("创建成功!");break;
case 2:{
if(s==NULL){printf("请先建表!");break;}
printf("请输入插入位置和插入元素:");
scanf("%d %d",&a,&b);
if(!ListInsert_Sq(s,a,b))printf("插入位置有误!!!\n");
else printf("插入成功!");break;
}
case 3:{
if(s==NULL){printf("请先建表!");break;}
printf("请输入删除位置:");
scanf("%d",&c);
if(ListDelete_Sq(s,c,&d))printf("删除元素为%d\n",d);
else printf("没有该位置!!!\n");break;
}
case 4:{
if(s==NULL){printf("请先建表!");break;}
printf("请输入获取元素位置:");
scanf("%d",&f);
if(GetElem_Sq(s,f,&g))printf("该位置元素为%d\n",g);
else printf("该位置没有元素!!!\n");break;
}
case 5:{
if(s==NULL){printf("请先建表!");break;}
if(ClearList_Sq(s))printf("重置空表成功!!!\n");break;
}
case 6:{
if(s==NULL){printf("请先建表!");break;}
DestroyList_Sq(s);
if(s->elem==NULL)printf("销毁成功!!!\n");break;
}
case 7:{
if(s==NULL){printf("请先建表!");break;}
printf("表长为%d\n",Listlength(s));break;
}
case 8:{if(s==NULL){
printf("请先建表!");break;}
printf("最终数据如下:\n");
printfs(s);break;
}
}
printf("\n是否还要继续操作?(继续输入Y或者y,否则结束)\n");
ch=getchar();
scanf("%c",&ch);
}
}
int Initlist_Sq(Sqlist s){//构造一个新的线性表s
s->elem=(int*)malloc(size*sizeof(int));//为s开辟一个大小为int型的空间
if(!s->elem)return ERROR;//若建表不成功返回error
s->length=0;//表长度初始为0
s->listsize=size;//表空间初始大小为size
return OK;
}
int ListInsert_Sq(Sqlist s,int i,int e){//在线性表s的第i个元素之前插入新的元素e
if(i<1||i>s->length)return ERROR;//若需要插入的位置错误返回error
if(s->length>=s->listsize){//若表的空间不够,在原有地址上增加insize大小的空间
s->elem=(int*)realloc(s->elem,(s->listsize+insize)*sizeof(int));
if(s->elem==NULL)return ERROR;
s->listsize+=insize;//表的空间增加
}
int *q,*p;
q=&s->elem[i-1];
for(p=&s->elem[s->length-1];p>=q;--p)*(p+1)=*p;//从最后一个位置开始所有元素向后移动一位
*q=e;//修改第i个元素为目标元素
s->length++;//表的长度增加
return OK;
}
int ListDelete_Sq(Sqlist s,int i,int *e){//删除线性表s的第i个元素并用e返回
if(i<1||i>s->length)return ERROR;//若需要删除的位置错误返回error
int *q,*p;
p=&s->elem[i-1];
*e=s->elem[i-1];
q=s->elem+s->length-1;
for(++p;p<=q;p++)*(p-1)=*p;//从第i个位置开始所有元素向前移动一位
s->length--;//表的长度减少
return OK;
}
int GetElem_Sq(Sqlist s,int i,int *e){//获取线性表s的第i个元素并用e返回
if(i<1||i>s->length)return ERROR;//若需要获取的位置错误返回error
*e=s->elem[i-1];
}
int ListEmpty(Sqlist s){//判断表是否为空表 返回true或者false
if(s->length==0)return TRUE;
else return FLASE;
}
int DestroyList_Sq(Sqlist s){//销毁线性表
if(!ListEmpty(s)){
free(s->elem);
s->elem=NULL;
s->length=0;
s->listsize;
}
}
int ClearList_Sq(Sqlist s){//将线性表重置为空表
if(!ListEmpty(s)){
for(int i=0;i<s->length;i++){
s->elem[i]=0;
}
s->length=0;
}
if(ListEmpty(s))return OK;
}
int Listlength(Sqlist s){//返回表的长度
return s->length;
}
int OperateMenu(){//建立菜单,提示操作代码
int num;
printf("1:建立线性表并输入数据!\n2:插入元素!\n3:删除元素!\n4:获取元素!\n5:重置空表!\n6:销毁线性表!\n7:得到表长!\n8:打印表中内容!\n");//提供菜单选项
scanf("%d",&num);
for(int i=0;;i++){
if(num<1||num>8){printf("选择错误!");return -1;}
else if(num==1){return num;break;}
else if(num==2){return num;break;}
else if(num==3){return num;break;}
else if(num==4){return num;break;}
else if(num==5){return num;break;}
else if(num==6){return num;break;}
else if(num==7){return num;break;}
else if(num==8){return num;break;}
}
}
Sqlist scanfs(){//向线性表赋值并返回基地址到调用处
printf("请输入需要存放的数据:(输入-1结束)");
Sqlist L;
Initlist_Sq(L);//建立新表
int e;
for(int i=0;;i++){
scanf("%d",&e);
if(e==-1)break;
L->elem[i]=e;
L->length++;
if(L->length>=L->listsize){//若表的空间不够,在原有地址上增加insize大小的空间
L->elem=(int*)realloc(L->elem,(L->listsize+insize)*sizeof(int));
if(L->elem==NULL)return ERROR;
L->listsize+=insize;//表的空间增加
}
}//逐个输入元素
return L;//返回表头
}
void printfs(Sqlist s){//将线性表s中的元素依次打印
for(int j=0;j<s->length;j++){
printf("%d\t",s->elem[j]);
}//逐个打印元素
}
实验结果:
- 选择建立顺序表并输入数据:1 2 3 4 5 6 7 8 9 10 11 -1(输入-1结束输入)
- 选择插入操作 在3位置前插入333,并选择打印操作展示效果
- 选择删除操作 删除第三个位置的元素并返回删除的值
- 获取第七个位置的元素
- 获得线性表的长度
其余操作不再演示
链表
实验代码:
#define OK 1
#define ERROR 0
#include <stdio.h>
#include<stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}Lnode,*LinkList;
LinkList Initlist_L();//建立一个空表,并将表头返回
LinkList Create(LinkList L);//将空表传入,为表中输入元素,在返回表头
int ListInsert_L(LinkList L,int i,int e);//在线性表L的第i个元素之前插入新的元素e
int ListDelete_L(LinkList L,int i,int *e);//删除线性表L的第i个元素并用e返回
int GetElem_Sq(LinkList L,int i,int *e);//获取线性表L的第i个元素并用e返回
int ListLength(LinkList L);//返回元素个数
LinkList ClearList(LinkList L);//清空链表
LinkList DestroyList(LinkList L);//销毁链表
int OperateMenu();//建立菜单,提示操作代码
void printfs(LinkList L);//将线性表L中的元素依次打印
void main(){
LinkList L=NULL;
int a,b,c,d,e,f,g;
char ch;
printf("是否要进行操作?(继续输入Y或者y,否则结束)\n");
scanf("%c",&ch);
while(ch=='Y'||ch=='y'){
switch(OperateMenu()){
case 1:L=Create(L);if(L->next!=NULL)printf("创建成功!");break;
case 2:{
if(L==NULL){printf("请先建表!");break;}
printf("请输入插入位置和插入元素:");
scanf("%d %d",&a,&b);
if(!ListInsert_L(L,a,b))printf("插入位置有误!\n");
else printf("插入成功!\n");break;
}
case 3:{
if(L==NULL){printf("请先建表!");break;}
printf("请输入删除位置:");
scanf("%d",&c);
if(ListDelete_L(L,c,&d))printf("删除元素为%d\n",d);
else printf("没有该位置!\n");break;
}
case 4:{
if(L==NULL){printf("请先建表!");break;}
printf("请输入获取元素位置:");
scanf("%d",&f);
if(GetElem_Sq(L,f,&g))printf("获取元素为%d\n",g);
else printf("该位置没有元素!\n");break;
}
case 5:{
if(L==NULL){printf("请先建表!");break;}
printf("最终数据如下:\n");
printfs(L);break;
}
case 6:{
if(L==NULL){printf("请先建表!");break;}
printf("该链表元素个数为:%d\n",ListLength(L));break;
}
case 7:{
if(L==NULL){printf("请先建表!");break;}
L=DestroyList(L);
if(L==NULL){printf("销毁成功!");break;}
}
case 8:{
if(L==NULL){printf("请先建表!");break;}
L=ClearList(L);
if(L->next==NULL){printf("清空成功!");break;}
}
}
printf("\n是否还要继续操作?(继续输入Y或者y,否则结束)\n");
ch=getchar();
scanf("%c",&ch);
}
}
LinkList Initlist_L(){//建立一个空表,并将表头返回
LinkList L;
L=(LinkList)malloc(sizeof(Lnode));
L->data=0;
L->next=NULL;
return L;
}
LinkList Create(LinkList L){//将空表传入,为表中输入元素,在返回表头
L=Initlist_L();//先建立一个带头节点的链表
LinkList p,s;
int e;
p=L;
printf("请输入初始数据:(输入-1结束)");
scanf("%d",&e);
while(e!=-1)
{
s = (LinkList)malloc(sizeof(Lnode));
s->data=e;
p->next=s;
p=s;//插入到表尾
L->data++;
scanf("%d",&e);
}
p->next=NULL;
return L;
}
int ListInsert_L(LinkList L,int i,int e){//在线性表L的第i个元素之前插入新的元素e
LinkList p=L;
int j=0;
while(p&&j<i-1){//判断所找元素是否越界
p=p->next;
j++;
}
if(!p||j>i-1)return ERROR;
LinkList s=(LinkList)malloc(sizeof(Lnode));//生成新节点
s->data=e;
s->next=p->next;//插入L中
p->next=s;
return OK;
}
int ListDelete_L(LinkList L,int i,int *e){//删除线性表L的第i个元素并用e返回
LinkList p=L;
int j=0;
while(p&&j<i-1){//判断所找元素是否越界
p=p->next;
j++;
}
if(!p||j>i-1)return ERROR;//删除位置不合理
LinkList s=p->next;
p->next=s->next;
*e=s->data;
free(s);//释放结点
return OK;
}
int GetElem_Sq(LinkList L,int i,int *e){//获取线性表L的第i个元素并用e返回
LinkList p=L;
int j=0;
while(p&&j<i){//判断所找元素是否越界
p=p->next;
j++;
}
if(!p)return ERROR;//第i个元素不存在
else OK;
*e=p->data;//返回i值
}
int ListLength(LinkList L){//返回元素个数
return L->data;
}
LinkList DestroyList(LinkList L){//销毁链表
LinkList p;
while(L!=NULL){
p=L;
L=L->next;
free(p);
}
return L;
}
LinkList ClearList(LinkList L){//清空链表
L->next=NULL;
L->data=0;
return L;
}
int OperateMenu(){//建立菜单,提示操作代码
int num;
printf("1:建立线性表并输入数据!\n2:插入元素!\n3:删除元素!\n4:获取元素!\n5:打印表中内容!\n6:输出元素个数!\n7:销毁链表!\n8:清空链表!\n");
scanf("%d",&num);
for(int i=0;;i++){
if(num<1||num>8){printf("选择错误!");return -1;}
else if(num==1){return num;break;}
else if(num==2){return num;break;}
else if(num==3){return num;break;}
else if(num==4){return num;break;}
else if(num==5){return num;break;}
else if(num==6){return num;break;}
else if(num==7){return num;break;}
else if(num==8){return num;break;}
}
}
void printfs(LinkList L){//将线性表L中的元素依次打印
LinkList p=L->next;
if(p!=NULL){
for(int j=0;;j++){
printf("%d\t",p->data);
p=p->next;
if(p==NULL)break;
}
}
else printf("该链表为空!\n");
}
实验结果:
- 选择建立顺序表并输入数据:10 20 30 40 50 60 70 80 90 -1(输入-1结束输入
- 选择插入元素 输入插入位置3和插入元素300,并打印结果
- 删除第三位元素并返回删除元素
- 获取第七位的元素
- 输出元素个数
其余操作不再演示