线性表的学习总结一

本文详细总结了线性表的相关知识,包括单链表的建立、长度计算、数据打印、查找操作、插入和删除节点,以及链表的倒置和去重。此外,还探讨了冒泡排序在链表中的应用。
摘要由CSDN通过智能技术生成
作为一名通工转cs的coder,这学期中终于开始学习数据结构,在此做一些学习总结,以下是实现的一些功能:
  • 建立链表
  • 求链表长度
  • 打印数据
  • 按序号查找
  • 按值查找
  • 单链表的插入,按序号插入
  • 删除链表第i个元素
  • 倒置链表
  • 单链表中删除重复节点,排序思想,双重循环进行比较
  • 冒泡排序

    定义结构体
    struct node
    {
    int num;
    struct node *next;
    };
    typedef struct node *LinkList,Node;

建立链表

LinkList create_LinkList();
LinkList create_LinkList()
{
    LinkList h=(LinkList)malloc(sizeof(Node));
    h->next=NULL;
    Node *s,*r=h;
    int x;
    scanf("%d",&x);
    while(x!=-1)
    {
        s=(LinkList)malloc(sizeof(Node));
        s->num=x;
        r->next=s;
        r=s;
        //s->next=r->next;
        //r->next=s;
        //r=s;
        scanf("%d",&x);
    }
    r->next=NULL;
    return h;
}

求链表长度

int getLength_LinkList(LinkList h);
int getLength_LinkList(LinkList h)
{
    Node *p=h;
    int Length=0;
    while(p->next!=NULL)
    {
        p=p->next;
        Length++;
    }
    return Length;
}

打印数据

void print_LinkList(LinkList h);
void print_LinkList(LinkList h)
{
    Node *p;
    p=h->next;
    if(p==NULL)
        printf("LinkList is NULL!");
    printf("Head:");
    while(p!=NULL)
    {
        printf("%d -> ",p->num);
        p=p->next;
    }
    printf("NULL");
}

按序号查找

LinkList get_LinkList(LinkList h, int k);
LinkList get_LinkList(LinkList h, int k)
{
    Node *p=h;
    int i=0;
    while(p->next != NULL && i<k)
    {
        p=p->next;
        i++;
    }
    if(i==k)
        return p;
    else
        return NULL;
}

按值查找

LinkList locate_LinkList(LinkList h,int x);
LinkList locate_LinkList(LinkList h,int x)
{
    Node *p=h->next;
    while(p!=NULL&&p->num!=x)
        p=p->next;
    if(p==NULL)
        return NULL;
    else
        return p;
}

单链表的插入,按序号插入

LinkList insert_LinkList(LinkList h, int i, int x);
LinkList insert_LinkList(LinkList h, int i, int x)
{
    Node *p,*s;
    p=get_LinkList(h,i-1);
    if(p==NULL)
    {
        printf("插入位置i错!");
        return;
    }
    else
    {
        s=(LinkList)malloc(sizeof(Node));
        s->num=x;
        s->next=p->next;
        p->next=s;
        printf("插入成功!");
    }
}

删除链表

LinkList delete_LinkList(LinkList h, int i);
LinkList delete_LinkList(LinkList h, int i)
{
    Node *p,*q;
    p=get_LinkList(h,i-1);
    if(p==NULL||p->next==NULL)
    {
        printf("第i-1个节点不存在!");
        return;
    }
    else
    {
        q=p->next;
        p->next=p->next->next;
        free(q);
        printf("删除成功!");
    }
}

倒置链表

void remove_LinkList(LinkList h);
void remove_LinkList(LinkList h)
{
    Node *p,*q;
    p=h->next;
    h->next=NULL;
    while(p)
    {
        q=p;
        p=p->next;
        q->next=h->next;
        h->next=q;
    }
}

单链表中删除重复节点,排序思想,双重循环进行比较

void pur_LinkList(LinkList h);
void pur_LinkList(LinkList h)
{
    Node *p,*q,*r;
    p=h->next;
    if(p!=NULL)
    while(p->next)
    {
        q=p;
        while(q->next)
        {
            if(p->num==q->next->num)
            {
                r=q->next;
                q->next=q->next->next;
                free(r);
            }
            else
                q=q->next;
        }
        p=p->next;
    }
}

冒泡排序(可优化)

void bubblesort_LinkList(LinkList h);
void bubblesort_LinkList(LinkList h)
{
    Node *p,*q,*x,*y;
    p=h;
    if(p->next==NULL||p->next->next==NULL)
        return;
    for(;p->next->next!=NULL;p=p->next)
        for(q=p;q->next->next!=NULL;q=q->next)
        {
            if(q->next->num > q->next->next->num)
            {
                y=q->next->next;
                x=q->next;
                q->next=y;
                x->next=y->next;
                y->next=x;
            }
        }
}
以上基本是线性单链表的所有操作,可以借鉴交流一下。
由于个人不太喜欢写注释,部分地方需要自己好好想想,画图理解,敬请见谅。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值