【数据结构】顺序表的初始化、销毁、清空、求长度、判断是否为空、增加、删除、查找

本文介绍了如何使用C语言实现顺序表的基本操作,包括初始化、销毁、清空、求长度、判断是否为空、增加元素、删除元素以及查找元素。建议使用Code::Blocks进行编译运行,注意结构体中的name字段最好使用英文输入。

【所有相关函数代码】

#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输入最好为英文。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值