数据结构—顺序表

顺序结构

头定义

#define MAXSIZE 20  /*存储空间初始分配量*/
typedef int Elemtype;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;

结构定义

typedef struct
{
    Elemtype data[MAXSIZE];
    int length;
}sqlist;

获得线性表元素

Status GetElem(sqlist L,int i,Elemtype *e)
{
    if(L.length==0 || i > L.length)
        return ERROR;
    *e = L.data[i-1];
    return OK;
}

插入元素操作

//插入操作(第i个位置知之后)
Status Insert(sqlist *L,int i,Elemtype e)
{
    if(L->length==MAXSIZE || i > L->length)
        return ERROR;
    if(i<1 || i>L->length+1)
        return ERROR;
    for(i;i < L->length;i++)
    {
        L->data[i] = L->data[i-1];
    }
    L->data[i-1] = e;
    L->length++;
    return OK;
}//自己写的,书上是倒着遍历
/*书上的
Status Insert(sqlist *L,int i,Elemtype e)
{
    int k;
    if(L->length==MAXSIZE)
        return ERROR;
    if(i<1 || i>L->length+1)
        return ERROR;
    if(i<=L->length)
{
    for(l=L->length-1;k>=i-1;k--)
        L->data[k+1] = L->data[k];
}
        L->data[i-1] = e;
        L->length++;
    return OK;
}
 */

删除元素操作

//删除操作
/*操作结果:删除L的第i个数据元素。并用e返回其值,L的长度减1*/
Status ListDelete(sqlist *L,int i,Elemtype *e)
{
    int k;
    if(L->length == 0)
        return ERROR;
    if(i < 1 || i > L->length)
        return  ERROR;
    *e = L->data[i - 1];
    for(k = i -1;k < L->length;i++)
        L->data[i-1] = L->data[i];
    L->length--;
    return ERROR;
}

链式结构

结构定义

typedef struct Node
{
    Elemtype data;
    struct Node *next;
}Node;
typedef struct Node *LinkList;

获得线性表元素

Status GetElem(LinkList L,int i,Elemtype *e)
{
    int j;
    LinkList p;
    p = L->next;
    j = 1;
    while (p && j<i)
    {
        p = p->next;
        ++j;
    }
    if(!p || j>i)
        return ERROR;
    *e = p->data;
    return OK;
}

插入元素操作

Status ListInsert(LinkList *L,int i,Elemtype e)
{
    int j;
    LinkList p,s;
    p = *L;//p指向链表头结点;
    j = 1;
    while(p && j<i)
    {
        p = p->next;
        ++j;
    }
    if(!p || j>i)
        return ERROR;
    s = (LinkList)malloc(sizeof(Node));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;
}

删除元素操作

Status ListDelete(LinkList *L,int i,Elemtype *e)
{
    int j;
    LinkList p;
    p = *L;//p指向链表头结点;
    j = 1;
    while(p && j<i)//遍历寻找第i-1个结点
    {
        p = p->next;
        ++j;
    }
    if(!p || j>i)
        return ERROR;
    *e = p->next->data;
    p->next =  p->next->next;
    free(p->next);
    return OK;
}

单链表的整表创建

头插法

void CreatListHead(LinkList *L,int n)
{
    LinkList p;
    int i;
    srand(time(0));//初始化随机数种子
    *L = (LinkList)malloc(sizeof(Node));
    (*L)->next = NULL;//先建立一个带头结点的单链表
    for(i=0; i<n; i++)
    {
        p = (LinkList)malloc(sizeof(Node));//生成新结点
        p->data = rand()%100+1;//随机生成100以内的数字
        p->next = (*L)->next;
        (*L)->next = p;//插入到表头
    }
}

尾插法

void CreatListTail(LinkList *L,int n)
{
    LinkList p,r;
    int i;
    srand(time(0));//初始化随机数种子
    *L = (LinkList)malloc(sizeof(Node));
    r = *L;//r为指向尾部的结点
    for(i=0; i<n; i++)
    {
        p = (LinkList)malloc(sizeof(Node));//生成新结点
        p->data = rand()%100+1;//随机生成100以内的数字
        r->next = p;//将表尾终端节点的指针指向新结点
        r = p;//将当前的新结点定义为表尾终端结点
    }
    r->next = NULL;//表示当前链表结束
}

单链表的整表删除

Status ClearList(LinkList *L)
{
    LinkList p,q;
    p = (*L)->next;//p指向第一个结点
    while(p)//没到表尾
    {
        q = p->next;
        free(p);
        p = q;
    }
    (*L)->next = NULL;//头结点指针域为空
    return OK;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值