知识点小记:
- 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;
}