【所有相关函数代码】
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100
typedef struct {
char id[20];
char name[9];
} student;
typedef struct {
student *s;
int length;
} sqList;
//初始化
void init(sqList* L)
{
L->s=(student *)malloc(sizeof(student)*MAXSIZE);//分配最大空间
L->length = 0;//将长度置为0
}
//销毁
void destroy(sqList* L)
{
if (L->s) free(L->s);//释放所有空间
}
//往顺序表填充内容
void input(sqList* L)
{
int i;
student* s = L->s;
printf("Please enter some messages(quit for putting the 'q' in the next one):\n");
for (i = 0; i < MAXSIZE; i++, s++)
{
printf("The No.%d's id:\n",i+1);
scanf("%s",s->id);
if (s->id[0]=='q') break;
printf("The No.%d's name:\n",i+1);
scanf("%s",s->name);
L->length ++;
}
}
//清空顺序表
void ClearList(sqList* L)
{
L->length = 0;//顺序表占用的空间仍然存在,单把元素个数置为0
}
//求线性表长度
int getlength(sqList* L)
{
return (L->length);
}
//判断线性表是否为空
int IsEmpty(sqList* L)
{
if (L->length == 0) return 1;//判断线性表元素的长度是否为0
else return 0;
}
//获取第i个元素的值,把它用变量s传递
int getelem(sqList* L, int i, student* s)
{
if (i<1 || i>L->length) return 0;
else {
*s = L->s[i - 1];
return 1;
}
}
//屏幕输出顺序表的所有值
void print(sqList* L)
{
int i;
student* s = L->s;
for (i = 0; i < L->length; i++,s++)
{
printf("id=%-12s", s->id);
printf("name=%-12s\n", s->name);
}
printf("length=%d\n", L->length);
}
//顺序表插入
void append(sqList *L,student *s,int pos)
{
int i;
// printf("L->length=%d",L->length);
if (L->length==MAXSIZE)
{
printf("It's already full!\n");
exit(1);
}
if (pos<0||pos>L->length)
{
printf("The position is not valid!\n");
exit(1);
}
for (i=L->length;i>pos;i--) L->s[i]=L->s[i-1];
L->s[pos]=*s;
L->length++;
}
void dele(sqList *L,char *del_id)
{
int i,pos,flag=0;
if (L->length==0) {printf("\nThere is nothing in your sequence list.\n");exit(1);}
for (i=0;i<L->length;i++)
{
if (L->s[i].id[0]==*del_id)
{
pos=i;
flag=1;
}
}
if (flag=1)
{
for (i=pos;i<L->length-1;i++) L->s[i]=L->s[i+1];
L->length--;
}
}
int search(sqList *L,char *name,int *pos)
{
int i,flag=0;
for (i=0;i<(L->length);i++)
{
if (strcmp(L->s[i].name,name)==0)
{
flag=1;
*pos=i;
printf("pos=%d\n",*pos);
}
}
if (flag==1) return *pos;
if (flag==0) return -1;
}
int main()
{
sqList L;
student s1,s2;
int num,pos,search_pos,result;//想要获取的第num个元素,想要插入的pos位置,寻找到的pos位置,查找结果
char del_id[20],search_name[9];
init(&L);//顺序表初始化
input(&L);//输入初值
print(&L);//打印所有值
printf("Which one would you wanna search?(type the id)\n");
scanf("%d",&num);
getelem(&L,num,&s1);//获取第num个元素
printf("id=%-12s,name=%-12s\n",s1.id,s1.name);//把第num个元素打印出来
/*插入部分*/
printf("Please type the student and the pos you wanna append in:\n");
printf("id=");
scanf("%s",&s2.id);
printf("\nname=");
scanf("%s",&s2.name);
printf("\npos=");
scanf("%d",&pos);
append(&L,&s2,pos);
print(&L);
/*删除部分*/
printf("Please type the student's id which you wanna delete:\n");
scanf("%s",&del_id);
dele(&L,&del_id);
print(&L);
/*查找姓名相同的第一个元素,并打印*/
printf("Please type the student's name you wanna search:\n");
scanf("%s",search_name);
result=search(&L,search_name,&search_pos);
if (result==-1) printf("There is no such person.\n");
else printf("id=%-12s,name=%-12s",L.s[search_pos].id,L.s[search_pos].name);
return 0;
}
【另一种实现方式】
#include <stdio.h>
#define MAXSIZE 100
//顺序表的实现
typedef int datatype;
typedef struct {
datatype a[MAXSIZE];//数组
int size;//当前长度,表示下标为最后一个元素的后一个下标
}sequence_list;
//顺序表的初始化
void init (sequence_list *slt)//要改变结构体sequence_list,因此参数要传它的指针类型
{
slt->size=0;
}
//顺序表的后部插入
void append(sequence_list *slt,datatype x)//要改变结构体sequence_list,因此参数要传它的指针类型
{
if (slt->size==MAXSIZE) {printf("顺序表是满的!");exit(1);}
slt->a[slt->size]=x;//因size代表的位置是后一个元素的后面一个位置,因此刚好在size处插入
slt->size=slt->size+1;//长度+1
}
//打印顺序表的各结点值
void display(sequence_list slt)
{
int i;
if (!slt.size) printf("\n顺序表是空的!");
else
printf("size=%d",slt.size);
for (i=0;i<slt.size;i++)
{
printf("%5d",slt.a[i]);//从第一个打印到最后一个
}
}
//判断顺序表是否为空
int empty(sequence_list slt)
{
return (slt.size==0?1:0);//是空表返回1,否则返回0
}
//查找顺序表中值为x的结点位置
int find (sequence_list slt,datatype x)
{
int i=0;
while (i<slt.size&&slt.a[i]!=x) i++;//找到元素x的下标
return (i<slt.size?i:-1);//在顺序表范围内没找到返回-1
}
//取得顺序表中第i个结点的值
datatype get(sequence_list slt,int i)
{
if (i<0||i>=slt.size) {printf("\n指定位置的结点不存在!");exit(1);}
else
return slt.a[i];//返回这个下标的值
}
//顺序表的插入操作
void insert (sequence_list *slt,datatype x,int position)//要改变结构体sequence_list,因此参数要传它的指针
{
int i;
if (slt->size==MAXSIZE)
{printf("\n顺序表是满的,无法插入!");exit(1);}
if (position<0||position>slt->size)//只能在下标0~n的位置上插入元素
{printf("\n指定的插入位置不存在!");exit(1);}
for (i=slt->size;i>position;i--) slt->a[i]=slt->a[i-1];//从下标n+1的位置到要插入位置的后一个位置,值都变成前一个元素的值
slt->a[position]=x;
slt->size++;//长度+1
}
//顺序表的删除操作
void dele(sequence_list *slt,int position)//要改变结构体sequence_list,因此参数要传它的指针
{
int i;
if (slt->size==0) {printf("\n顺序表是空的!");exit(1);}
if (position<0||position>=slt->size)//只能在下标0~n-1位置上删除元素
{printf("\n指定删除的位置不存在!");exit(1);}
for (i=position;i<slt->size-1;i++) slt->a[i]=slt->a[i+1];//从要删除元素的位置到下标n-2的元素的位置,值都被后一个元素所覆盖
slt->size--;//长度减1
}
//顺序表实际输入值
void input(sequence_list *slt)
{
int i=0,num;
if (slt->size==MAXSIZE) {printf("\n顺序表已满!");exit(1);}
printf("Please type some messages...");
printf("\nsize=%d",slt->size);
while (slt->a[slt->size-1]!=-88)//选择一个安全词退出
{
scanf("%d",&slt->a[slt->size]);
slt->size++;
}
slt->size--;
}
int main()
{
sequence_list slt;
init(&slt);
input(&slt);
display(slt);
return 0;
}
【建议】用Code::Block运行,结构体中的name输入最好为英文。
本文介绍了如何使用C语言实现顺序表的基本操作,包括初始化、销毁、清空、求长度、判断是否为空、增加元素、删除元素以及查找元素。建议使用Code::Blocks进行编译运行,注意结构体中的name字段最好使用英文输入。

8214

被折叠的 条评论
为什么被折叠?



