带头结点的双向循环链表L(a1,a2,…,an)转化为L2(a1,a3,…,an,…,a4,a2)。
typedef struct Node
{
int data;
struct Node *left,*right;
}*list;
void build(list head)//尾插法构建双向链表
{
int a[7]={1,2,3,4,5,6,7};
list tail,p;
tail=head;
head->right=NULL;
for(int i=0;i<7;i++)
{
list p=(list)malloc(sizeof(Node));
p->data=a[i];
p->right=tail->right;
tail->right=p;
p->left=tail;
tail=p;
}
tail->right=head;
head->left=tail;
}
void change(list head)
{
list tail=head->left;//尾结点指针
int num=1;//奇偶计数
list p=head->right;//p指向第一个非头结点
while(p!=tail)
{
if(num%2==0)
{
list cur=p;
p=p->right;
cur->left->right=p; //当前结点的前驱结点链接到当前节点后继
p->left=cur->left;//当前节点后继结点链接到当前结点前驱
cur->right=tail->right;//当前结点插入到表尾
tail->right->left=cur;
tail->right=cur;
cur->left=tail;
}
else
p=p->right;
num++;
}
}
输出无向无权连通图以v为顶点的最短路径长度为k的所有结点。
typedef struct arcnode
{
int adjvex;
struct arcnode *next;
};
typedef struct Vnode
{
int data;
struct arcnode *firstarc;
}Vnode;
typedef struct graph
{
Vnode adjlist[maxsize];
int n,e;
}graph;
void BFS(graph g,int v,int k)//搜索以v为顶点长度为k的结点
{
int queue[maxsize];
int visit[maxsize]={0};
int len[maxsize];
int front=0,rear=0;
queue[rear++]=v;
visit[v]=1;
len[v]=0;//每个点的路径长度
int level;//记录层次
while(front!=rear)
{
int p=queue[front--];
if(len[p]==k)
printf("%d ",p);
arcnode *temp=g.adjlist[p].firstarc;//取第一个邻接点
level=len[p];
while(temp!=NULL)
{
if(visit[temp->adjvex]==0)
{
queue[rear++]=temp->adjvex;
len[temp->adjvex]=level+1;
visit[temp->adjvex]=1;
}
temp=temp->next;
}
}
}
A[200]的整数数组,输出并打印其中数字出现的个数,每行打印数据值和次数,然后换行打印下一个数据和次数。
void Print(int a[200])//方法1
{
int sum[200]={0};
for(int i=0;i<200;i++)
{
sum[a[i]]++;
}
for(int i=0;i<200;i++)
if(sum[i]!=0)
printf("%d:%d ",i,sum[i]);
}
void P2(int a[])//方法2
{
int visit[200]={0},i;
for(i=0;i<200;i++)
{
if(visit[i]==0)
{
int count=0;
for(int j=0;j<200;j++)
{
if(visit[j]==0&&a[i]==a[j])
{
count++;
visit[j]=1;
}
}
printf("%d:%d\n",a[i],count);
}
}
}