静态链表的应用

简介

静态链表也是由数据域与指针域两部分组成的一个结构体,只不过指针域是由整数下标表示

cpp 复制代码
struct node{
      int data;//数据域
      int next;//指针域
      };

求两个链表首个公共结点的地址

cpp 复制代码
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=100000000;
struct node{
   char data;
    int next;
    bool flag;
}nodes[maxn];
int main(){
    for(int i=0;i<maxn;i++)
    nodes[i].flag=false;
    int addr1,addr2,n;//链表1的首地址addr1、个数n,链表2的首地址addr2
    scanf("%d%d%d",&addr1,&addr2,&n);
    int addr,next;
    char data;
    for(int i=0;i<n;i++){//将链表信息边输入边存入
        scanf("%d%s%d",&addr,&data,&next);
        nodes[addr].data=data;
        nodes[addr].next=next;
    }
    int j;
    for( j=addr1;j!=-1;j=nodes[j].next)//遍历链表1,
    nodes[j].flag=true;//改flag为true
    for( j=addr2;j!=-1;j=nodes[j].next){//遍历链表2
        if(nodes[j].flag==true) break;//找到在链表1中首个出现过的结点
    }
    if(j!=-1) printf("%05d\n",j);//返回结点地址
    else printf("-1\n");
    return 0;
}

由小到大输出静态链表

cpp 复制代码
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=100000;
struct node{
    int now;
    int data;
    int next;
    bool flag;
}nodes[maxn];
bool cmp(node a,node b){//排序后,flag==true都在flag==false左端
    if(a.flag==false||b.flag==false)//碰到无效结点排序
    return a.flag>b.flag;//true在前,false在后
    else return a.data<b.data;//给结点排序
}
int main(){
    for(int i=0;i<maxn;i++)
    nodes[i].flag=false;
    int begin,num;
    scanf("%d%d",&begin,&num);
    int addr1,data,addr2;
    for(int i=0;i<num;i++){
        scanf("%d",&addr1);
        scanf("%d%d",&nodes[addr1].data,&nodes[addr1].next);
        nodes[i].now=addr1;
    }
    int position=begin,count=0;
    while(position!=-1){
        nodes[position].flag=true;//标记
        count++;
        position=nodes[position].next;
    }
    if(count==0)
    printf("0 -1\n");
    else{
        sort(nodes,nodes+maxn,cmp);//地址不连续,只能全部都考虑
        printf("%d %d\n",count,nodes[0].now);//输出首个地址
        for(int i=0;i<count;i++){
            if(i!=count-1)
        printf("%d %d %d\n",nodes[i].now,nodes[i].data,nodes[i].next);
        else
        printf("%d %d -1\n",nodes[i].now,nodes[i].data);
        }
    }
    return 0;
}
相关推荐
星星.7225 小时前
C++算法竞赛|二分查找与二分答案:边界模板、浮点二分、STL
数据结构·c++·算法
动词ing5 小时前
【学习笔记】数据结构(数组长度和关键特性+快慢指针+左右指针)
数据结构·笔记·学习
linux-hzh7 小时前
百日算法修炼 · Day 17
数据结构·算法
OPEN-F9 小时前
C++入门教程:数组、字符串与指针入门
数据结构·c++·算法
pluviophile_s9 小时前
数据结构:第7讲:图
数据结构·笔记
林森lsjs9 小时前
零基础吃透二叉树:定义、遍历与高频算法 —数据结构柒
java·开发语言·数据结构·算法·二叉树
船厂电气自动化ai大模型9 小时前
AI大模型与数学·第56课 快速傅里叶变换FFT:DFT高效优化算法,图像、音频、扩散模型工程加速核心工具
数据结构·人工智能·深度学习·算法·机器学习
橘子汽水1689 小时前
Leetcode 236,437:二叉树的最近公共祖先,路径总和III
java·数据结构
wabs66611 小时前
关于二叉树【力扣144.二叉树的前序遍历的思考】
数据结构·c++·算法·leetcode·二叉树
LuminousCPP11 小时前
数据结构-二叉树(三):堆复杂度证明与 Top-K 问题|错位相减推导 + 海量数据内存优化
c语言·数据结构·笔记·排序算法