• 线性表之链表


    线性表的链式存储表示的特点:

    是用一组任意的存储单元存储线性表的数据元素
    (这组存储单元可以是连续的,也可以是不连续的)。
    因此,为了表示每个数据元素 与其直接后继数据元素 之间的逻辑关系,
    对数据元素 来说,除了存储其本身的信息之外,
    还需存储一个指示其直接后继的信息(即直接后继的存储位置)。
    由这两部分信息组成一个"结点"(如概述旁的图所示),表示线性表中一个数据元素。

    对于非线性的链表:

    可以参见相关的其他数据结构,
    例如树、图。另外有一种基于多个线性链表的数据结构:
    跳表,插入、删除和查找等基本操作的速度可以达到O(nlogn),和平衡二叉树一样。
    其中存储数据元素信息的域称作数据域(设域名为data),存储直接后继存储位置的域称为指针域(设域名为next)。指针域中存储的信息又称做指针或链。
    由分别表示,,…,的N 个结点依次相链构成的链表,称为线性表的链式存储表示,由于此类链表的每个结点中只包含一个指针域,故又称单链表或线性链表。

    以下代码实现过程:(头不为空)

    #include<stdio.h>
    #include<stdlib.h>
    struct node
    { 
        int data;
        struct node *next;  //后继指针
    };
    int Length(struct node *head)//求表的长度
    {
        struct node *t=NULL;
        t=head;
        int n=0;
        while(t!=NULL)
        {
            t=t->next;
            n++;
        }
        return n;
    }
    int  search1(struct node *head,int index)//根据序号查找返回值
    {
       struct node *t=NULL;
       t=head;
       int j=1;
       while(t!=NULL&&j<index)
       {
           t=t->next;
           j++;
       }
       if(index==j)
       return t->data;
       else
        return 0;
    }
     int search2(struct node *head,int x) //按值查找返回位置
     {
        struct node *t=NULL;
        t=head;
        int j=1;
        while(t!=NULL&&t->data!=x)
        {
            t=t->next;
            j++;
        }
        if(t->data==x)
        return j;
        else
        return 0;
     }
     void Delete(struct node *head,int index) //删除链表中某个位置的
     {
        struct node *t=NULL,*q=NULL;
        t=head;
        int j=1;
        while(t!=NULL&&j<index-1)
        {
           t=t->next;
           j++;
        }
        q=t->next;
        t->next=q->next;
        free(t);
        t=head;
        while(t!=NULL)
        {
            printf("%d ",t->data);
            t=t->next;
        }
            
     }
     void AllDelete(struct node *head)  //整个表的删除
     {
         struct node *t=NULL,*q=NULL;
         t=head;
         while(t!=NULL)
         {
             q=t->next;
             free(t);
             t=q;
         }
         head=NULL;
    
     }
    int main()
    {
       struct  node *head=NULL,*p,*q=NULL,*t=NULL;  //初始化为空
       int n,i,a;
       scanf("%d",&n);
       for(i=0;i<n;i++)
       {
            scanf("%d",&a);
            p=(struct node *)malloc(sizeof(struct node)); //分配动态空间
            p->data=a;
            p->next=NULL;
            if(head==NULL)
                head=p;
            else
                q->next=p;  //q作为临时保存
            q=p;
       }
       printf("表的长度:%d
    ",Length(head));  
       printf("位置1的值:%d
    ",search1(head,1));
       printf("值为4的位置%d
    ",search2(head,4));
       Delete(head,3);//删除位置为3的节点
        scanf("%d",&a);    //插入
        t=head;
        while(t!=NULL)
        {
            if(t->next->data>a)  //找到位置
            {
                p=(struct node *)malloc(sizeof(struct node));
                p->data=a;
                p->next=t->next;  //后接
                t->next=p;     //前接
                break;
            }
            t=t->next;
        }
         //输出
        t=head;
        while(t!=NULL)
        {
            printf("%d ",t->data);
            t=t->next;
        }
        AllDelete(head); //删除整个表
    
    }
    
  • 相关阅读:
    谈敏捷的好文章
    梁信军说的话
    如何做需求管理
    支持向量机通俗解释
    如何写数据报告
    数据分析注意点
    傅盛谈管理的本质
    I Hate It HDU
    敌兵布阵 HDU
    P3372 【模板】线段树 1 (区间查询)
  • 原文地址:https://www.cnblogs.com/julyzqy/p/12777472.html
Copyright © 2020-2023  润新知