数据结构--线性表的销毁,逆置

这篇博客介绍了C语言中使用EOF进行多次输入的方法,以及线性表(顺序表、单链表和双向循环链表)的销毁操作。此外,还探讨了线性表的逆置问题,包括顺序表和链表的逆置算法。最后,提供了一个关于麻将排序问题的代码示例,展示了如何处理一系列操作后麻将的最终排序情况。
摘要由CSDN通过智能技术生成

知识点小记:

  • c语言进行多次输入时可采用EOF来实现,   

 while(scanf("%c%c%c",&ah,&ch,&bh)!=EOF)//进行多次输入用EOF 

 知识点小记: c语言万能头文件 #include <bits/stdc++.h>

  • 线性表销毁

1.顺序表销毁

Status DestoryList(Sqlist &L){
    free(L.elem);
    L.elem=NULL;
    L.length=0;
    L.listsize=0;
    return OK;
}

2.单链表销毁

Status DestoryList(LinkList &L){
	LinkList q,p=L;//让p指向头结点
    while(p!=0){//当头结点的指针域不为0,即不是链尾时
        q=p->next;//让q指向头结点的后续结点
        delete p;//删除p
        p=q;//让p和q都指向后续结点

    }
    L=NULL;//最后不要忘了让指向头结点的指针的指针的值为0

3.双向循环链表销毁(先free头结点后面的每个结点再free头结点)

Status DestoryList(DuLinkList &L){
    DuLNode *p,*q;
    q = p = L->next;
    while(p != L)
    {
        p = p->next;
        free(q);
        q = p;
    }
    free(L);
    L = NULL;
    return OK;
}

对线性表的逆置(将正常顺序的线性表元素逆序即为逆置)

针对顺序表而言,即遍历原表一半的元素,将第一个元素与最后一个元素交换,第二个与倒数第二个元素交换,依次进行,实现逆置,而对单链表来说,类似于尾插法建立非空链表一样,将每个元素依次以尾插法的形式插入,继而实现逆置。

1.顺序表

2.链表

void ReverseList(LinkList L)//线性表的逆置
{
    Node *p,*q;
    p=L->next;
    L->next=NULL;//对L的后继初始化
    while(p!=NULL){
        q=p->next;
        p->next=L->next;//相当于尾插法建立链表
        L->next=p;
        p=q;
    }
}
        

 附带算法题:

打麻将

描述

最近ACM大佬们沉迷于打麻将,已经到了对麻将能过目不忘的地步。现在有一堆各不相同的麻将,按一定顺序排列,为方便理解,给麻将编号为1到n,但并不一定按1到n排序。ACM的臭大佬们想拉你进组(cuo ma jiang),但有个条件,得尽量解决下面这个问题:

对按一定顺序排序的n个麻将进行m次操作,每个操作都是将编号为ai的麻将拿出来放到第一个位置去,要求你要知道最后的排序方式。

这样臭大佬们就会觉得你很厉害,并且赢你的钱比较有成就感。

输入

输入有三行,第一行包含两个整数n,m(1 <= n,m <= 100000),第二行输入n个整数,作为初始的麻将顺序,第三行输入m个整数,即ai(1 <= i <= m,1 <= ai<=n)。

输出

输出n个整数,表示进行m次操作后的麻将顺序。

代码:

#include<stdio.h>
int main(){
	int m,n,s[10000000],t[10000000],i,flag=0,f[1000000]={0},p[1000000];
	scanf("%d%d",&n,&m);
	for(i=0;i<n;i++){
		scanf("%d",&s[i]);//存入n数据 
	}
	for(i=0;i<m;i++){
		scanf("%d",&t[i]);//存入m数据 
	}

   for(int i=0;i<m;i++){
   		p[i]=t[m-1-i];//逆序将m存入p数组 
	}
	i=0;
	for(int j=m;j<m+n;j++){
		p[j]=s[i];//顺序将n存入p数组 
		i++;
	}
	for(i=0;i<m+n;i++){
		flag=p[i];//有标记的输出p(不重复) 
		if(f[flag]!=1){
			printf("%d ",p[i]);
		}f[flag]=1;
	}
	
	return 0;
}

 

 

  • 9
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值