数据结构 - 顺序表

来源:互联网 发布:淘宝卖农产品赚钱吗 编辑:程序博客网 时间:2024/06/05 18:03

顺序表的特点(数组实现):

线性表:具有相同数据类型的数据元素的有限集合 包括顺序表,链表
顺序表:逻辑上相邻的元素存储在物理位置相邻的存储单元中,通常用数组实现。

//线性表:数组里面放任意数据类型 (包括结构体)typedef struct{    char name[10];    int  age;}datatype;typedef struct{     datatype data[10];     int len;}sqlist;

数组:相同数据类型的变量按一定次序排列的数据集合。

1> 物理存储位置上的临接关系来表示逻辑关系2>可通过数组下标随机访问任意元素 3>不用尾结点的逻辑关系开辟额外的开销 4>表的大小固定不可随意改变 5>插入删除需要移动大量元素(平均移动一半元素)

/*返回线性表第i个元素的值 *在线性表第i个元素之前插入元素 *删除线性表第i个元素 *打印线性表所有的元素*/#include <stdio.h>#include <stdlib.h>#define MAXLINE 100//结构体为数组申请好大小为MAXLINE的空间typedef struct{    int array[MAXLINE];    int length;}sqlist;//创建顺序表//main 函数中定义了指向顺序表的指针变量sqlist *//修改指针变量内容传指针变量的地址,确 //保在此子函数中生成的顺序表返回到主函数中仍能找到它 //子函数传入地址才能成功改变地址对应的的值void creatlist(sqlist **s)      {    int i=0,n=0;    printf("input the length of list\n");    scanf("%d",&n);    printf("input the elements of the list\n");    for(i=0;i<n;++i)    {        scanf("%d",&(*s)->array[i]);    }    (*s)->length = n;}//初始化数据表 1,2,3,4,5void sq_init(sqlist *s){   int i = 0;   for(i = 0;i < 15;++i)   {       s->array[i] = i;       s->length++;   }}//传线性表的地址效率高 第i个元素之前插入void sq_insert(sqlist *s,int i,int a){   if(s->length > MAXLINE)   {       return;   }   int j=s->length;   for(j = s->length;j > i-2; --j)   {       s->array[j+1] = s->array[j];   }   s->array[++j] = a;   s->length++;}void sq_print(sqlist *s){    int i = 0;    for(i = 0;i < s->length;++i)    {        printf("%d ",s->array[i]);        if((i+1) % 10 == 0)        {            printf("\n");        }    }    printf("\n");}//a存放待删除元素的值void sq_delect(sqlist *s,int i,int *a){   int j=0;   *a = s->array[i-1];   for(j = i;j < s->length;++j)   {      s->array[j-1] = s->array[j];   }   s->length--;}//a存放查找到的第i个元素的值void sq_search(sqlist *s,int i,int *a){    if(i > s->length)    {        return;    }    *a = s->array[i-1];}int main(){    int a,i = 0;    //sqlist test ;    sqlist *s = NULL;   // test.length = 0;    //*s = test   此句意思为S为空指针,S指向的内容与test内容相同    //s = &test;    creatlist(&s);    //sq_init(s);    sq_print(s);    sq_insert(s,4,10);    sq_print(s);    sq_delect(s,4,&a);    sq_print(s);    printf("%d\n",a);    sq_search(s,4,&a);    sq_print(s);    printf("%d\n",a);    return 0;}

顺序表应用:

/*线性表应用:图书馆借书管理系统相关功能*///单本书-图书信息结构体#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXLINE 100#if 1typedef struct{    char no[8],name[10];    //书号,书名    int newnum,sumnum;      //书的现存量 ,总量    int price;              //单价}Datatype;//定义包含图书顺序表元素结构体typedef struct{     Datatype  data[MAXLINE + 1];     int len;}SeqList;SeqList * init_Seq(void){    SeqList *l =NULL;    l = (SeqList *)malloc(sizeof(SeqList));    //判断是否申请    return l;}void input(SeqList *l){    int i = 0;    printf("输入书的总类数\n");    scanf("%d",&l->len);    for(i = 0;i <l->len; ++i)    {        scanf("%s%s%d%d%d",&l->data[i].no,&l->data[i].name,&l->data[i].newnum,              &l->data[i].sumnum,&l->data[i].price);    }}void print(SeqList *l){    int i = 0;    for(i = 0;i< l->len; ++i)    {         printf("%s %s %d %d %d\n",l->data[i].no,l->data[i].name,                l->data[i].newnum,l->data[i].sumnum,l->data[i].price);    }}void rent(SeqList *l){    int i = 0;    char array[10];    printf("输入要借书名:\n");    scanf("%s",&array);    for(i = 0;i < l->len;++i)    {        if(strcmp(l->data[i].name,array) == 0)        {            if(l->data[i].newnum > 0){                l->data[i].newnum--;            }else{                printf("已借空\n");            }            break;        }    }}void del(SeqList *l){    int j = 0,i = 0;    char array[10];    printf("输入要删除的书名:\n");    scanf("%s",&array);    for(j = 0;j < l->len;++j)    {        if(strcmp(l->data[j].name,array) == 0)        {             i = j;        }    }    for(i = i+1;i<l->len;++i)    {        l->data[i-1] = l->data[i];    }    l->len--;}//图书种类的删除:l->len-1//void deletAll(SeqList **l){   free(*l);   l = NULL;}int main(int argc,char **argv){    SeqList *l = NULL;    l = init_Seq();    input(l);    rent(l);    print(l);    del(l);    print(l);    deletAll(&l);    return 0;}#endif

顺序表的相关算法:
1.顺序表逆置 a1 a2 a3 a4 a5 a6 …. an

void Covert(SeqList *l){    int i,n;    int x;    n = l->len;    for(i = 1;i < n/2;i++)    {        x = l->data[i];        l->data[i] = l->data[n-i+1];        l->data[n-i+1] = x;    }}

2.有序顺序表A,B 合并成顺序表C,使得C依然有序
(方法:创建新的顺序表C)

0 0
原创粉丝点击