学习数据结构中的线性表

先是数组实现



/*数组实现顺序表*/

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int ElementType;
typedef struct
{
    ElementType Data[MAXSIZE];
    int Last;
}List;
List *MakeEmpty()
{
    List *PtrL;//定义指针
    PtrL = (List *)malloc(sizeof(List));//申请空间
    PtrL->Last = -1;//让它指向-1(无元素);0表示第一个位置
    return PtrL;//返回指针
}
int Find(ElementType X,List *PtrL)
{
    int i;
    while(i <= PtrL->Last && PtrL->Data[i] != X)
    {
        i++;
    }
    if(i > PtrL->Last)return -1;//找不到返回-1
    else return i; //找到返回下标
}
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[i - 1] = PtrL ->Data[j];  /* 将a i+1  ~ a n 顺序向前移动*/
    PtrL->Last--;  /*Last 仍指向最后元素*/
        return;
}
void Insert(ElementType X,int i,List *PtrL)
{
    int j;
    if(PtrL-> Last == MAXSIZE-1)
    {
        printf("表满了\n");  /* 表空间满了,不能插入*/
        return ;
    }
     if(i < 1 || i > PtrL->Last +2)
    {
        printf("位置不合法\n");  /* 检查插入位置的合法性*/
        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 ;

}
int main()
{
    return 0;
}

下面是链表的相关操作

#include<stdio.h>
#include<stdlib.h>
typedef int   ElementType;
typedef struct Node
{
    ElementType Data;
    struct Node *Next;
}List;
List L,*PtrL;
// 求 表长
int Length(List *PtrL)
{
    List *p = PtrL; //p指向表的第一个结点
    int j = 0;
    while(p)
    {
        p = p->Next; //当前p指向的是第j个结点
        j++;
    }
    return j;
}
//查找
//A:(按序号查找)
List *FindKth(int K,List *PtrL)
{
    List *p = PtrL;
    int i = 1;
    while(p != NULL && i < K)
    {
        p = p -> Next;
        i++;
    }
    if(i == K)return p;//找到第k个,返回指针
    else return NULL;//否则返回空
}
//B:(按值查找)
List *Find(ElementType X,List * PtrL)
{
    List *p = PtrL;
    while(p != NULL && p->Data != X)
        p = p->Next;
    return p;
}
//插入(在第i- 1(1<= i <= n + 1 )个结点后插入一个值为X的新结点)
//(1) 先构造一个新结点,用s指向
//(2) 再找到链表的第i-1个结点,用p指向
//(3)然后修改指针,插入结点(p之后插入新结点是s)
List *Insert(ElementType X,int i,List *PtrL)
{
    List *p,*s;
    if(i == 1)
    {
        s = (List *)malloc(sizeof(List));
        s->Data  = X;
        s->Next = PtrL;
        return s;
    }
    p = FindKth(i - 1,PtrL);
        if(p == NULL)
        {
            printf("参数i错误\n");
          return NULL;
        }
        else
        {
            s = (List *)malloc(sizeof(List));
            s->Data = X;
            s->Next = p->Next;
            p->Next = s;
            return PtrL;
        }
}
//删除
//(1)先找到链表的第i-1个结点,用p指向
//(2)再用指针s指向要被删除的结点(p的下一个结点)
//(3)修改指针,删除s所指结点
//(4)释放s所指结点的空间
List *Delete(int i,List *PtrL)
{
    List *p,*s;
    if(i == 1)         //若要删除的是表的第一个结点
    {
        s = PtrL;                    //s指向第1个结点
        if(PtrL != NULL)PtrL = PtrL->next; //从链表中删除
        else return NULL;
        free(s);   //释放被删除的结点
        return PtrL;

    }
    p =  FindKth(i -1,PtrL);  // 查找第i-1 个结点
    if(p == NULL)
    {
        printf("第%d个结点不存在",i-1)return NULL;
    }
    else if(p ->Next == NULL)
    {
        printf("第%d个结点不存在",i);return NULL;
    }
    else
    {
        s = p->Next;     //s指向第i个结点
        p->Next = s->Next;   // 从链表中删除
        free(s);         //被删除结点
        return PtrL;
    }
}
int main()
{
    return 0;
}

关于广义表与多重链表

猜你喜欢

转载自blog.csdn.net/weixin_40616644/article/details/81324206
今日推荐