首先要先确定主体,及菜单要包含的内容,有数据的输入,线性表的创建,元素的插入,元素的删 除,元素的查找和退出功能。清楚了流程之后便开始写代码。
以下都是顺序存储的分步代码解析,总代码在最后:
1.主函数的设计
设计主函数首先要包括菜单栏,通过printf函数来实现,菜单栏做完之后,用户需要根据自己的选择来进入相应的功能,即通过switch函数来实现,case中所包含的函数功能与创建的菜单要相一致,同时为了执行完一种功能之后能直接继续选择下一种功能而不是退出重新运行重新选择,需要在菜单和选择前后加循环,当用户选择退出后再退出。代码如下:
int main()
{ int i,k,loc;ElemType e,x;char ch;
do {printf("\n 1创建顺序表");//创建菜单
printf("\n 2在顺序表中插入元素");
printf("\n 3删除顺序表中的元素");
printf("\n 4在顺序表中查找元素");
printf("\n 6退出");
printf("======================================");
printf("\n 请输入你的选择(1,2,3,4,6)");
scanf("%d",&k);
switch(k)
{case 1:{creat_list(&a);out_list(a);}break;
case 2:{printf("\n i,e=?");scanf("%d,%d",&i,&e);insert_sq(&a,i,e);out_list(a);}break;
case 3:{printf("\n i=?");scanf("%d",&i);x=delete_sq(&a,i);out_list(a);printf("\n x=%d",x);}break;
case 4:{printf("\n e=?");scanf("%d",&e);loc=locat_sq(a,e);
if(loc==-1) printf("\n 未找到%d",loc);
else printf("\n已找到,元素位置是%d",loc);}break;
}
}while(k!=6);
printf("\n再见!");
printf("\n按Enter键,返回。");ch=getchar();
}
2.单链表
在单链表中,每个结点类型用SqList表示,它应包括存储元素的数据域,这里用数组a[MAXSIZE]表示;其类型用通用类型标识符ElemType表示,为了简单,假设ElemType为int 类型;还包括存储后继结点位置的指针域,用length表示。SqList类型的声明如下:
#define MAXSIZE 20
typedef int ElemType;
typedef struct
{ElemType a[MAXSIZE];
int length;
}SqList;
SqList a,b,c;
3.结构链表和函数的声明
typedef int ElemType;
typedef struct
{ElemType a[MAXSIZE];
int length;
}SqList;
SqList a,b,c;
void creat_list(SqList *L);//函数的声明
void out_list(SqList L);
void insert_sq(SqList *l,int i,ElemType e);
ElemType delete_sq(SqList *L,int i);
int locat_sq(SqList L,ElemType e);
4.输入创建线性表函数设计
第一步,输入创建线性表的元素长度,即要输入几个元素个数,用L->length;
第二步,输入元素,通过for 循环,输入元素。
void creat_list(SqList *L)
{int i;
printf("\n n=?");scanf("%d",&L->length);
for(i=0;i<L->length;i++) {printf("\n data %d=?",i);scanf("%d",&(L->a[i]));}
}
5.输出所创建的线性表函数设计
通过For循环和数组,将数据输出。
void out_list(SqList L)
{ int i;char ch;
printf("\n");
for(i=0;i<=L.length-1;i++) printf("%10d",L.a[i]);
printf("\n\n按enter键,继续。");ch=getchar();}
6.在已创建的线性表中插入元素函数设计
*L指向的是原来第一步创建的线性表,i表示需要插入元素的位置,e表示需要插入元素的值。
如果L->length==MAXSIZE,说明超出了范围,错误;
如果i比1小或比length+1大,说明插入数据的位置错误;
如果i的位置输入正确,那么将最后一个位置给 j ,通过for循环,将要插入元素位置的元素及之后地址往后移,然后将插入的元素的值赋给该位置,同时长度加1.
void insert_sq(SqList *L,int i,ElemType e)
{int j;
if(L->length==MAXSIZE) printf("\n overflow !");
else if(i<1||i>L->length+1) printf("\n error i !");
else{for(j=L->length-1;j>=i-1;j--) L->a[j+1]=L->a[j];
L->a[i-1]=e;
L->length++;}
}
7.在已创建的线性表中删除元素函数设计
如果长度为0,则为空表;
如果要删除的元素位置小于一或者大于长度,则说明输入错误,将x赋值为-1;
如果位置输入正确,将要删除元素的值赋给x,然后通过for循环,将要删除元素位置后面的元素往前移,得到新的线性表,最后返回x.
ElemType delete_sq(SqList *L,int i)
{ElemType x;int j;
if(L->length==0) printf("\n是空表。underflow !");
else if(i<1||i>L->length){printf("\nerror i!");x=-1;}
else {x=L->a[i-1];
for(j=i;j<=L->length-1;j++) L->a[j-1]=L->a[j];
L->length--;}
return(x);
}
8.在已创建的线性表中查找元素函数设计
e是需要查找的元素, 通过while找到元素,并返回元素的位置,如果没找到,就返回-1.
int locat_sq(SqList L,ElemType e)
{int i=0;
while(i<=L.length-1 && L.a[i]!=e) i++;
if(i<=L.length-1) return(i+1);
else return(-1);
}
9.完整代码
(1)顺序存储完整代码
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
typedef int ElemType;
typedef struct
{ElemType a[MAXSIZE];
int length;
}SqList;
SqList a,b,c;
void creat_list(SqList *L);//函数的声明
void out_list(SqList L);
void insert_sq(SqList *l,int i,ElemType e);
ElemType delete_sq(SqList *L,int i);
int locat_sq(SqList L,ElemType e);
int main()
{ int i,k,loc;ElemType e,x;char ch;
do {printf("\n 1创建顺序表");//创建菜单
printf("\n 2在顺序表中插入元素");
printf("\n 3删除顺序表中的元素");
printf("\n 4在顺序表中查找元素");
printf("\n 6退出");
printf("======================================");
printf("\n 请输入你的选择(1,2,3,4,6)");
scanf("%d",&k);
switch(k)
{case 1:{creat_list(&a);out_list(a);}break;
case 2:{printf("\n i,e=?");scanf("%d,%d",&i,&e);insert_sq(&a,i,e);out_list(a);}break;
case 3:{printf("\n i=?");scanf("%d",&i);x=delete_sq(&a,i);out_list(a);printf("\n x=%d",x);}break;
case 4:{printf("\n e=?");scanf("%d",&e);loc=locat_sq(a,e);
if(loc==-1) printf("\n 未找到%d",loc);
else printf("\n已找到,元素位置是%d",loc);}break;
}
}while(k!=6);
printf("\n再见!");
printf("\n按Enter键,返回。");ch=getchar();
}
void creat_list(SqList *L)
{int i;
printf("\n n=?");scanf("%d",&L->length);
for(i=0;i<L->length;i++) {printf("\n data %d=?",i);scanf("%d",&(L->a[i]));}
}
void out_list(SqList L)
{ int i;char ch;
printf("\n");
for(i=0;i<=L.length-1;i++) printf("%10d",L.a[i]);
printf("\n\n按enter键,继续。");ch=getchar();}
void insert_sq(SqList *L,int i,ElemType e)
{int j;
if(L->length==MAXSIZE) printf("\n overflow !");
else if(i<1||i>L->length+1) printf("\n error i !");
else{for(j=L->length-1;j>=i-1;j--) L->a[j+1]=L->a[j];
L->a[i-1]=e;
L->length++;}
}
ElemType delete_sq(SqList *L,int i)
{ElemType x;int j;
if(L->length==0) printf("\n是空表。underflow !");
else if(i<1||i>L->length){printf("\nerror i!");x=-1;}
else {x=L->a[i-1];
for(j=i;j<=L->length-1;j++) L->a[j-1]=L->a[j];
L->length--;}
return(x);
}
int locat_sq(SqList L,ElemType e)
{int i=0;
while(i<=L.length-1 && L.a[i]!=e) i++;
if(i<=L.length-1) return(i+1);
else return(-1);
}
(2)链式存储完整代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNo; /*定义结构类型struct LNode为新名称LNo*/
LNo *L;
LNo *creat_L();
void out_L(LNo *L);
void insert_L(LNo *L,int i,ElemType e);
ElemType delete_L(LNo *L,int i);
int locat_L(LNo *L,ElemType e);
int main()
{
int i,k,loc;
ElemType e,x;
char ch;
do
{
printf("\n\n\n");
printf("\n\n 1.建立线性链表 ");
printf("\n\n 2.在i位置插入元素e");
printf("\n\n 3.删除第i个元素,返回其值");
printf("\n\n 4.查找值为e的元素");
printf("\n\n 5.结束程序运行");
printf("\n======================================");
printf("\n 请输入您的选择(1,2,3,4,5)");
scanf("%d",&k);
switch(k)
{
case 1:{L=creat_L();out_L(L);
}break;
case 2:{printf("\n i,e=?");scanf("%d,%d",&i,&e);
insert_L(L,i,e);out_L(L);
}break;
case 3:{printf("\n i=?");scanf("%d",&i);
x=delete_L(L,i);out_L(L);
if(x!=-1) printf("\n x=%d\n",x);
}break;
case 4:{printf("\n e=?");scanf("%d",&e);
loc=locat_L(L,e);
if(loc==-1)printf("\n未找到%d",loc);
else printf("\n已找到,元素位置是%d",loc);
}break;
}
printf("\n ----------------");
}while(k>=1&&k<5);
printf("\n再见!");
printf("\n按Enter键,返回。");ch=getchar();
}
LNo *creat_L() /*建立线性链表,返回链表头指针*/
{
LNo *h,*p,*s;ElemType x;
h=(LNo *)malloc(sizeof(LNo));/*头结点*/
h->next=NULL;
p=h;
printf("\n data=?");scanf("%d",&x);
while(x!=-111)
{
s=(LNo *)malloc(sizeof(LNo));
s->data=x;s->next=NULL;
p->next=s;p=s;
printf("data=?(-111 end)");scanf("%d",&x);
}
return(h);
}
void out_L(LNo *L) /*输出L指向的链表中所有元素*/
{
LNo *p;char ch;
p=L->next;printf("\n\n");
while(p!=NULL){printf("%5d",p->data);p=p->next;}
printf("\n\n按Enter键,继续。");ch=getchar();
}
void insert_L(LNo *L,int i,ElemType e) /* 在i位置插入元素e */
{
LNo *s,*p;
int j;
p=L;
j=0;
while(p->next!=NULL && j<i-1)
{
p=p->next;
j++;
}
if(p==NULL || j>i-1) printf("\n i ERROR !");
else
{
s=(LNo *)malloc(sizeof(LNo));
s->data=e;
s->next=p->next;
p->next=s;
}
}
ElemType delete_L(LNo *L,int i) /*删除第i个元素,返回其值*/
{
LNo *p,*q;
int j;
ElemType x;
p=L;j=0;
while(p->next!=NULL && j<i-1){p=p->next;j++;}
if(p->next==NULL){printf("\n i ERROR !"); return(-1);}
else
{
q=p->next;x=q->data;
p->next=q->next;free(q);
return(x);
}
}
int locat_L(LNo *L,ElemType e) /*查找值为e的元素,返回找到位置*/
{
LNo *p;int j=1;
p=L->next;
while(p!=NULL && p->data!=e){p=p->next;j++;}
if(p!=NULL) return(j);
else return(-1);
}