链表A1032 A1052 A1074 A1097

A1032静态链表

//静态链表 
#include<bits/stdc++.h>
using namespace std;

const int maxn=100010;
struct NODE{
	char data;//数据域 
	int next;//指针域
	bool flag;//结点是否在第一条链表中出现 
}node[maxn];

int main()
{
	for(int i=0;i<maxn;i++){
		node[i].flag=false;//先把他们都置为false, 
	}
	int s1,s2,n;//s1与s2分别代表两条链表的首地址 
	scanf("%d%d%d",&s1,&s2,&n);
	int address,next;
	char data;
	for(int i=0;i<n;i++)
	{
		scanf("%d %c %d",&address,&data,&next);
		node[address].data=data;
		node[address].next=next;
	}
	int p;
	for(p=s1;p!=-1;p=node[p].next){
		node[p].flag=true;
	}
	for(p=s2;p!=-1;p=node[p].next)
	{
		if(node[p].flag) break;
	 } 
	if(p!=-1){
		printf("%05d\n",p);
	}
	else{
		printf("-1\n");
	}
	return 0;
}

A1052静态链表

#include<bits/stdc++.h>
using namespace std;

const int maxn=100010;
struct NODE{
	int address,key,next;
	bool flag;//结点是否在链表上 
}node[maxn];

bool cmp(NODE a,NODE b){
	if(a.flag==false||b.flag==false){
		return a.flag>b.flag;
	}else{
		return a.key<b.key;
	}
}

int main()
{
	for(int i=0;i<maxn;i++)
	{
		node[i].flag=false;
	}
	int n,begin;
	scanf("%d %d",&n,&begin);
	int address;
	for(int i=0;i<n;i++)
	{
		scanf("%d",&address);
		scanf("%d%d",&node[address].key,&node[address].next);
		node[address].address=address;
	}
	//枚举链表,对flag进行标记,并记录有效结点个数 
	int p=begin,count=0;
	while(p!=-1){
		node[p].flag=true;
		count++;
		p=node[p].next;
	}
	
	if(count==0)
	{
		printf("0 -1");//特判 
	 } else{
	 	sort(node,node+maxn,cmp);
	 	printf("%d %05d\n",count,node[0].address);
	 	for(int i=0;i<count;i++){
	 		if(i!=count-1){
	 			printf("%05d %d %05d\n",node[i].address,node[i].key,node[i+1].address);
			 }
			else{
				printf("%05d %d ",node[i].address,node[i].key);
				printf("-1\n");
			}
		 }
	 }
	return 0;
}

A1074
不会

#include <iostream>
using namespace std;
int main() {
    int first, k, n, sum = 0;
    cin >> first >> n >> k;
    int temp, data[100005], next[100005], list[100005], result[100005];
    for (int i = 0; i < n; i++) {
        cin >> temp;
        cin >> data[temp] >> next[temp];
    }
    while (first != -1) {
        list[sum++] = first;
        first = next[first];
    }
    for (int i = 0; i < sum; i++) result[i] = list[i];
    for (int i = 0; i < (sum - sum % k); i++)
        result[i] = list[i / k * k + k - 1 - i % k];
    for (int i = 0; i < sum - 1; i++)
        printf("%05d %d %05d\n", result[i], data[result[i]], result[i + 1]);
    printf("%05d %d -1", result[sum - 1], data[result[sum - 1]]);
    return 0;
}

A1097

#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
struct node{
    int data,next;
}n[maxn];
int main()
{
    int i,j,k,N,begin;
    cin>>begin>>N;
    while(N--)
    {
        cin>>i>>j>>k;//i是地址,j是数据,k是next
        n[i].data=j;
        n[i].next=k;
    }
    bool appeared[100001]={0};
    vector<int> v1,v2;//重复的推进v2里,不重复的推进v1里
    //开始遍历链表
    for(i=begin;i>=0;i=n[i].next)
    {
        j=abs(n[i].data);
        if(appeared[j])
        {
            v2.push_back(i);
        }
        else
        {
            appeared[j]=true;
            v1.push_back(i);
        }
    }
    //开始输出
    for(i=0;i<v1.size();i++)
    {
        if(i!=v1.size()-1)
            printf("%05d %d %05d\n",v1[i],n[v1[i]].data,v1[i+1]);
        else
            printf("%05d %d -1\n",v1[i],n[v1[i]].data);
    }
    if(v2.size())
    {
            for(i=0;i<v2.size();i++)
        {
            if(i!=v2.size()-1)
                printf("%05d %d %05d\n",v2[i],n[v2[i]].data,v2[i+1]);
            else
                printf("%05d %d -1\n",v2[i],n[v2[i]].data);
        }
        
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值