7-1两个有序链表的合并
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList creat()
{
LinkList L,s,p;
L=(LNode *)malloc(sizeof(LNode));
p=L;
int e;
scanf("%d",&e);
while(e>=0)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
p->next=s;
p=s;
scanf("%d",&e);
}
p->next=NULL;
return L;
}
LinkList merge(LinkList la,LinkList lb)
{
LinkList lc,pc,pa,pb;
pc=lc=la;
pa=la->next;
pb=lb->next;
while(pa&&pb)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
if(pa) pc->next=pa;else pc->next=pb;
free(lb);
return lc;
}
void print(LinkList lc)
{
LinkList p=lc->next;
if(!p) printf("NULL");
else
{
printf("%d",p->data);
p=p->next;
while(p)
{
printf(" %d",p->data);
p=p->next;
}
}
}
int main()
{
LinkList la,lb,lc;
la=creat();
lb=creat();
lc=merge(la,lb);
print(lc);
return 0;
}
7-2两个有序链表序列的交集
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//一个开始用数组最后一个点总是过不了,就老实写链表了
struct Node{
int Data;
struct Node* Next;
};//链表结构体
typedef struct Node* List;
//创建一个链表
List Creat(){
List head = (List)malloc(sizeof(struct Node)),q;
head->Next = NULL;
q = head;//创建头结点的链表
int x;
while(~scanf("%d",&x)&&x!=-1){
List p = (List)malloc(sizeof(struct Node));
p->Data = x;
p->Next = NULL;//赋值操作
q->Next = p;//前一个的下一个为新创建的结点
q = p;//尾指针指向最后一个
}
return head;
}
//求交集
List Merge(List a,List b){
a = a->Next;
b = b->Next;//分别指向第一个有效结点
//创建交集链表的表头
List head = (List)malloc(sizeof(struct Node));
head->Next = NULL;
List q = head;
while(a&&b){
if(a==NULL||a->Data > b->Data){
b = b->Next;//如果a为空,或者a比b大,a不能移动了,b往后移找更大的
}
else if(b==NULL||b->Data > a->Data){
a = a->Next;//同理
}
else{//相同创建新的交集链表
List p = (List)malloc(sizeof(struct Node));
p->Data = b->Data;
p->Next = NULL;
q->Next = p;
q = p;
a = a->Next;
b = b->Next;//同时移动到下一个
}
}
return head;
}
//打印链表
void printList(List a){
a = a->Next;
if(a==NULL){//为空输出NULL;
printf("NULL\n");
return;
}
int flag = 0;
while(a!=NULL){
if(!flag)printf("%d",a->Data);
else printf(" %d",a->Data);
flag = 1;
a = a->Next;//移动下一个,老是忘。。。。
}
puts("");
return;
}
int main(){
List a = Creat();
List b = Creat();
List c = Merge(a,b);
printList(c);
return 0;
}
7-3约瑟夫环
#include<stdio.h>
#include<string.h>
int a[3000];
int main()
{
int n,p,cnt=0,flag=0,num=0,i=1;
scanf("%d %d",&n,&p);
while(1)
{
if(!a[i])
{
num++;
if(num==p)
{
a[i]=1;
if(!flag)
{
printf("%d",i);
flag=1;
}
else
printf(" %d",i);
num=0;
cnt++;
}
}
i++;
if(i==n+1)
i=1;
if(cnt==n)
break;
}
return 0;
}
7-4两个有序序列的中位数
#include <stdio.h>
int main(){
int n, i, j = 0, k = 0;
scanf("%d", &n);
int a[n], b[n];
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
for(i = 0; i < n; i++)
scanf("%d", &b[i]);
while(j + k < n - 1)
{
if(a[j] >= b[k])
k++;
else
j++;
}
printf("%d", a[j]>b[k]?b[k]:a[j]);//三目运算符
return 0;
}