C语言实现线性表(链式存储方式)

2018-12-04 07:12:37来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

#include <stdio.h>
#include <stdlib.h>  //提供malloc()原型

typedef struct LNode *List;
typedef int ElementType;
//定义数据结构的自定义名称


struct LNode{
    ElementType Data;       //数据域
    List Next;              //指针域
};

struct LNode L;
List PtrL;

int Length(List PtrL) //链表头指针
/*表长*/
{
    List p = PtrL;   //临时的指针 p 指向表的第一个节点
    int j = 0;  //计数器作用
    while(p)  //遍历单向链表
    {
        p = p->Next;
        j++;          //当前p指向的是第j个节点
    }
    return j;
}

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; //未找到,返回空
    }
}


List Find(ElementType X,List PtrL)
/*查找-值*/
{
    List p = PtrL;
    while (p != NULL && p->Data != X)
    {
        p = p->Next;
    }
    return p; //找到X,返回指针,未找到X,返回NULL
}


List Insert(ElementType X, int i, List PtrL)
/*插入*/
//步骤: 1、 构造一个新结点,用s指向
//      2、 找到链表的第i-1个结点,用p指向
//      3、 然后修改指针,插入结点
//      s-Next指向 p->Next,p->Next指向s,
{
    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)
    {
        printf("参数%d错误",i);
        return NULL;             //i-1结点不存在
    }
    else
    {
        s = (List)malloc(sizeof(struct LNode)); //申请结点空间
        s->Data = X;
        s->Next = p->Next;
        p->Next = s;
        return PtrL;
    }
}

List Delete(int i, List PtrL)
/*删除*/
{
    List p ,s;
    if(i==1)        //删除表的第一个节点
    {
        s = PtrL;   //s指向第一个节点
        if (PtrL != NULL)
        {
            PtrL = PtrL->Next; //从链表中删除
        }
        else
        {
            return NULL;
        }
        free(s);  //释放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()
{
    int j;
    int i =1;
    List p;

    j=Length(PtrL);      //计算长度
    printf("当前长度:%d\n",j);

    PtrL=Insert(5,1,PtrL);  //在表头插入结点

    p=FindKth(1,PtrL);
    printf("查找头结点的值:%d\n",p->Data); //按照序号查找并打印结果

    p=Find(5,PtrL);
    printf("查找数值5:%d\n",p->Data); //按照值查找并打印结果

     printf("插入数值3\n");
    Insert(3,2,PtrL);  //插入操作

    p=Delete(1,PtrL);
    printf("删除头结点后,当前头结点数值:%d\n",p->Data); //删除头结点

    j=Length(&L);      //计算长度
    printf("当前长度:%d\n",j);

    return 0;
}

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:函数调用方法之__cdecl与_stdcall

下一篇:利用ZYNQ SOC快速打开算法验证通路(3)——PS端DMA缓存数据到PS