线性表的基本操作

一:顺序存储

1.初始化

List MakeEmpty(){
    List PtrL;
    PtrL = (List)malloc( sizeof(struct LNode) );    //申请结构
    PtrL->Last = -1;    //没有元素
    return     Ptrl;    //返回指针
}

2.求长度

  1. int getLength(SqList &L){

  2. return L.length;

  3. }

3.查找

int Find(ElementType X, List PtrL ){    //查找X
    int i = 0;
    while( i <= PtrL->Last && PtrL->Data[i]!= X )
        i++;
    if( i > PtrL->Last ) 
        return -1;    //如果没找到,返回-1
    else
        return i;    //找到后返回的是存储位置
}

4.插入

在第 i 个位置插入一个值为X的元素,先移动 i 及其后面元素的位置(从最后一个开始往后移动),再插入

Void Insert( ElementType X, int i, List PtrL ){
    int j;
    if( PtrL->Last == MAXSIZE-1 ){    //表空间已满,不能插入
        printf("表满");
        return;
    }
    if( i < 1 || i > PtrL->Last+2 ){    //检查插入位置是否合法
        printf("位置不合法");
        return;
    }
    for( j = PtrL->Last; j >= i-1; j--)
        PtrL->Data[j+1] = PtrL->Data[j];    //将ai~an 倒序向后移动
    PtrL->Data[i-1] = X;    //插入元素
    PtrL->Last++;    //Last仍指向最后元素
    return;
}
5.删除

后面的元素依次前移

Void Delete( int i, List PtrL ){
    int j;
    if( i < 1 || i > PtrL->Last+1 ){    //检查是否为空表,及是否合法
        printf("不存在第%d个元素",i);
        return;
    }
    for( j = i; j <= PtrL->Last; j++)
        PtrL->Data[j-1] = PtrL->Data[j];    //将ai+1 ~ an 顺序向前移动
    PtrL->Last--;    //Last仍指向最后元素
    return;
}

二.链式表

2.1插入操作

(插入到第i个结点, 先找到第i-1 个节点, 然后, 让插入结点的指针域指向i-1个结点的指向的指针域, 再修改第i-1结点的指针域, 使其指向插入结点. 注意, 修改指针指向的顺序不要颠倒, 不然会导致找不到第i个结点. 对于边界情况也同样适合.)

bool  insertNode(Link head, int index, int item)
{
    int count=0;
    Link p = head;
    Link node;
    while(p != NULL && count < index-1)   //找到第index前一个结点
    {
        p = p->next;
        count++;
    }
    if(p == NULL)
    {
        return false;                    //没有找到第i-1个结点
    }
    else
    {
        node = (Link)malloc(sizeof(Node));//申请一个结点
        node->data = item;                //结点的数据域
        node->next = p->next;             //修改指针指向关系
        p->next = node;
        return true;
    }
}

2.2删除操作

( 依次遍历链表的数据域 与要查找的数据进行比较,找到要删除的结点, 用free()函数释放该节点, 并修改删除结点两边指针关系情况,要保证p,q指针一前一后: 在插在过程中, 若发现结点p指向的数据域不等于x, 则p,q指针同时向前移动,即可若在查找过程一直没有找到要删除的结点(链表遍历完毕),则退出循环,返回错误)

bool deleteNode(Link head,DateType x)
{
    Link p,q;
    if(head==NULL || head->next==NULL)  //链表没有数据,返回错误
    {
        return false;
    }
    p=head->next;      //初始化p,q 并保证p,q 一前一后
    q=head;
    while(p!=NULL)
    {
        if(p->data==x) //找到结点x ,删除并将两边结点链接起来
        {
            q->next=p->next;
            free(p);
            return true;
        }
        else           //没有找到,p,q依次往前移动
        {
            q=p;
            p=p->next;
        }
    }
    //若循环结束了,说明没有找到该结点
    return false;
}

2.3查找操作

( 依次遍历链表的数据域 与要查找的数据进行比较)

bool queryNode(Link head, int x)
{
    Link p = head->next;
    while(p != NULL)
    {
        if(p->data == x) //查找成功
        {
            printf("d",p->data);
            return true;
        }
        p = p->next;   //没有找到,移动结点
    }
    return false;     //查找失败返回false
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值