数据结构02 ------线性表(顺序表)

数据结构02 ------线性表(顺序表),第1张

线性表:
        按照顺序存储:


                顺序表  


        按照链式存储:


                链表 (单向链表   双向链表   内核链表  )

首先,我们来看   顺序表:

顺序表:


        数据只有一个前驱和一个后继,数据紧挨保存。


        具体实现:


         数组:int arr[100];


         弊端:100个元素,我只初始化了50个,但是遍历的时候,100个元素全部都会被遍历出来。
            
         改进:(使用结构体)


                    struct seq{
                        int arr[100];    // 数据保存的地方
                        int len;        // 有效数据个数
                    };

                这样的话,就可以只遍历我们使用到的部分。

顺序表的优点缺点:


        缺点:添加数据 删除数据 非常麻烦 
        优点:查询,替换数据非常方便(下标)

顺序表的代码实现:  /* 实现 顺序表的 增  删  改  查 *** 作 */

#include

#include

#define N 7

typedef int datatype;

struct seqlist{                    //先定义一个结构体
    datatype data[N];         //定义一个长度为7的数组
    int len;                         //数组中,有效数据的个数
};

/***************************************
 *函数名称:seq_init
 *函数功能:对顺序表进行初始化 *** 作
 *函数参数:void
 *返 回 值:
    struct seq *: 所开辟的堆的首地址
 ****************************************
*/

struct seq *seq_init(void)
{
    
    struct seq *p = (struct seq *)malloc(sizeof(struct seq));//在堆中开辟空间
    if(p == NULL)        // malloc 出错处理
    {
        perror("seq_init malloc error");
        return NULL;
    }
    p->len = 0;        //由于一开始没有数据插入数组,所以此时数组中存储的有效数据的个数为0
    
    return p;
}

/***************************************
 *函数名称:seq_add
 *函数功能:往顺序表中添加数据
 *函数参数:
            d : 被添加的数据
            p : 顺序表
            loc: 数据存放的位置(不是下标,loc ==1的时候,指的是数组中第一个元素的位置)
 *返 回 值:void
 ****************************************
*/

void seq_add(struct seq *p,datatype d,unsigned int loc)
{
    //判断顺序表是否存满
    if(p->len == N){
        printf("sorry!满了\n");
        return; //结束函数
    }
    
  /* 判断位置是否合法,数组中存储的数据必须是一个紧挨着一个,即:后面的数据必须紧挨着前面的数据,中间不允许隔有空位置,所以插入的位置最多也就是数组的尾部,也就是数组的最后一个元素data[p->len-1]的后面,即:data[p->len]这个位置,所以,loc不能大于p->len+1(注意:loc不是数组的下标,loc是从1开始的,而不是从0开始。所以,数组中第一个元素data[0]的位置为:loc == 1,而不是loc == 0。同理,最后一个元素data[p->len-1]的位置为:loc == p->len,而不是loc == p->len-1。*/
    if(loc<1 || loc > p->len+1)
    {
        printf("您的位置不合法\n");
        return; //结束函数
    }
    
    /* 存储数据 */
    int i;
    for(i=p->len;i>=loc;i--){           //从位置loc( 即:data[loc-1] )  开始往后,将数据依次往后面挪动一个位置,留出一个空位,好让新数据插入空位中
        p->data[i]=p->data[i-1];
    }
    
    p->data[loc-1]=d;    //将数据插入刚才留出来的空位中
    p->len++;               //新数据插入后,数组长度+1,所以,我们需要在这里手动更新一下数组中存储的有效数据的个数+1
}


/***************************************
 *函数名称:seq_del
 *函数功能:从顺序表中删除数据
 *函数参数:
            p : 顺序表
            loc: 数据删除的位置(不是下标)
 *返 回 值:int : 成功返回0  失败返回-1
 ****************************************
*/

int seq_del(struct seq *p,unsigned int loc,datatype *d)
{
    //判断位置是否合法,或者为空
    if(loc<1 || loc > p->len)
    {
        printf("您的位置不合法\n");
        return -1; //结束函数
    }
    
    // 删除数据
    *d = p->data[loc-1];   //将需要删除的数据传出去
    
    int i;
    for(i=loc;i<=p->len-1;i++){
        p->data[i-1]=p->data[i];
    }
    p->len--;        // 整个有效数据长度-1
    return 0;
}

/***************************************
 *函数名称:seq_update
 *函数功能:修改顺序表中数据
 *函数参数:
            p : 顺序表
            old: 旧数据(需要修改的数据)
            new:新数据(修改后的数据)
            
 *返 回 值:int : 成功返回0 失败返回-1
 ****************************************
*/

void seq_update(struct seq *p,datatype old,datatype new)
{
    int i;
    for(i=0;ilen;i++){
        if(old == p->data[i])
            p->data[i]=new;
    }
}

/***************************************
 *函数名称:display
 *函数功能:遍历打印顺序表中的数据
 *函数参数:
            p : 顺序表
 *返 回 值:void
 ****************************************
*/

void display(struct seq *p)
{
    printf("遍历结果为:");
    int i;
    for(i=0;ilen;i++){            
        printf("%d ",p->data[i]);
    }
    printf("\n");
}
 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/921110.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存