算法学习之旅-线性表及其实现

目录

1.1、定义

1.2、注意操作的实现

(1)初始化(建立空的顺序表)

(2)查找    (X)

(3)插入 (在第i(1<=i<=n+1)个位置上插入一个值为X的新元素)

(4)删除(在第i(1<=i<=n+1)个位置上删除一个值为X的新元素)

2、链式存储(链表)

2.1、定义:

2.2、实现操作

(1)求表长

(2)查找

(3)插入(在第i-1(1<=i<=n+1)个结点后插入一个值为X的新结点

(4)删除(删除链表的第i(1<=i<=n)个位置上的结点)

3、扩展 -- 广义表

3.1、定义

3.2、概念注意点


1、顺序存储实现(数组)

1.1、定义

typedef struct LNode *List;
struct LNode{
        ElementType Data[MAXSIZE];
        int Last;
};
struct LNode L;
List Ptrl;

1.2、注意操作的实现

(1)初始化(建立空的顺序表)

List MakeEmpty()
{
    List Ptrl;
    Ptrl = (List)malloc(sizeof(struct LNode);
    Ptrl->Last = -1;
    return Ptrl;
}

(2)查找    (X)

int Find (ElementType X, List Ptrl)
{
    int i = 0;
    while(i <=Ptrl->Last && Ptrl->Data[i]!=X)
    i++;
    if(i > Ptrl->Last) return -1;//如果没找到,返回-1
    else return i;

}

(3)插入 (在第i(1<=i<=n+1)个位置上插入一个值为X的新元素)

实现:

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;i++)
        Ptrl->Data[j+1] = Ptrl->Data[j];//将a[j]后面的元素依次向后移动
    Ptrl->Data[i+1] = X;//新元素插入
    Ptrl->Last++;
    return ;
} 

(4)删除(在第i(1<=i<=n+1)个位置上删除一个值为X的新元素)

实现:

void Delete(int i,List Ptrl)
{
    int j;
    if(i < 1 || i > Ptrl->Last+1) {
        printf("不存在第%d个元素",i);
    }
    for (j=i;j<=Ptrl->Last;j++)
        Ptrl->Data[j-1] = Ptrl->Data[j];
    Ptrl->Last--;
    return ; 
}

2、链式存储(链表)

2.1、定义:

typedef struct LNode *List;
struct LNode {
    ElementType Data;//数据域
    List Next;//指针域,即下一个结点的位置
};
struct LNode L;
List Ptrl;

2.2、实现操作

(1)求表长

int Length(List Ptrl) {
    List p = Ptrl;//p指向表的第一个结点
    int j = 0;
    while (p) {
        P = P->Next;
        j++;//当前p指向的是第j个结点
    }
    return j;
}

(2)查找

a、按序号查找:FindKth;

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;
    else 
        return NULL;
}    

b、按值查找:Find

List Find(ElementType X,List Ptrl) {
    List p = Ptrl;
    while (p!=NUll && p->Data !=X)
    p = p->Next;
    return p;
}

(3)插入(在第i-1(1<=i<=n+1)个结点后插入一个值为X的新结点

实现:

List Insert(ElementType X, int i, List Ptrl) {
    List p,s;
    if (i==1) {    //新结点插入在表头
        s = (List)malloc(sizeof(struct LNode)); //申请空间,填装结点
        s->Data = X;
        s->Next = Ptrl;
        return s; //返回新表头指针
    }
    p = FindKth(i-1,Ptrl); //查找第i-1个结点
    if (p == NULL) {    //第i-1个不存在,不能插入
        printf("参数i错");
        return NULL;
    }else {
        s = (List)malloc(sizeof(struct LNode));//申请空间,填装结点
        s->Data = X;
        s->Next = p->Next; //新结点插入在第i-1个结点的后面
        p->Next = s;
        return Ptrl;
    }
}

(4)删除(删除链表的第i(1<=i<=n)个位置上的结点)

实现:

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);
    } else if (p->Next == NULL) {
        printf("第%d个结点不存在",i);
    } else {
        s= p->Next;        //s指向第i个结点
        p->Next = s->Next;    //从链表中删除
        free(s);            //    释放被删除结点
        return Ptrl;    
}

3、扩展 -- 广义表

3.1、定义

3.2、概念注意点

猜你喜欢

转载自blog.csdn.net/qq_41603102/article/details/82763631