实验一第1题
#include
#include
#include
#include
typedef struct Node
{
int data;
struct Node *next;
}Node,*Linklist;
Linklist CreateFromTail(Linklist L)
{//尾插法创建链表
Node *r,*s;
int flag=1;
int c;
r=L;
while(flag)
{ c=getchar();
if(c!='$')
{
s=(Node*)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL;
}
}
}
void DisplayLinklist(Linklist L)
{//显示链表
Node *q,*p;
q=L->next;
p=L;
while(p->next!=NULL)
{
printf("%c ",q->data);
p=p->next;
q=q->next;
}
}
void DeleteLinklist(Linklist L,char n)
{//删除值为n的结点
Node *h,*r;
h=L->next;
r=L;
while(r->next!=NULL)
{
if(h->data==n)
{
r->next=h->next;
h=h->next;
}
else
{
r=r->next;
h=h->next;
}
}
}
void main()
{
printf("输入数据(输入$则结尾)和要删除结点的值x\n");
char x;
Linklist L=(Node*)malloc(sizeof(Node));
L->next=NULL;//初始化链表
CreateFromTail(L);
printf("生成链表如下:\n");
DisplayLinklist(L);
x=getchar();
DeleteLinklist(L,x);
printf("\n删除x后的链表如下:\n");
DisplayLinklist(L);
free(L);
L=NULL;
system("pause");//让程序不马上退出
return 0;
}
实验一第2题
#include
#include
#include
#include
typedef struct Node
{
int data;
struct Node *next;
}Node,*Linklist;
Linklist CreateFromTail(Linklist L)
{//尾插法创建链表
Node *r,*s;
int flag=1;
int c;
r=L;
while(flag)
{ c=getchar();
if(c!='$')
{
s=(Node*)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL;
}
}
}
void DisplayLinklist(Linklist L)
{//显示链表
Node *q,*p;
q=L->next;
p=L;
while(p->next!=NULL)
{
printf("%c ",q->data);
p=p->next;
q=q->next;
}
}
Linklist DaozhiLinklist(Linklist L)
{//生成逆序链表
Linklist d=(Node*)malloc(sizeof(Node));
d->next=NULL;
Node *p;
while(L->next!=NULL)
{
L=L->next;
p=(Node*)malloc(sizeof(Node));
p->data=L->data;
p->next=d->next;
d->next=p;
}
return d;
}
void main()
{
printf("输入数据(输入$则结尾)\n");
Linklist L=(Node*)malloc(sizeof(Node));
L->next=NULL;//初始化链表
CreateFromTail(L);
printf("逆序前链表如下:\n");
DisplayLinklist(L);
Linklist d=DaozhiLinklist(L);
printf("\n逆序后链表如下:\n");
DisplayLinklist(d);
free(L);
free(d);
L=NULL;
d=NULL;
system("pause");//让程序不马上退出
return 0;
}
实验一第3题(链式)
#include
#include
#include
#include
typedef struct Node
{
char data;
struct Node *next;
}Node,*Linklist;
Linklist CreateFromTail(Linklist L)
{//尾插法创建链表
Node *r,*s;
int flag=1;
int c;
r=L;
while(flag)
{ c=getchar();
if(c!='$')
{
s=(Node*)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL;
}
}
}
void DisplayLinklist(Linklist L)
{//显示链表
Node *q,*p;
q=L->next;
p=L;
while(p->next!=NULL)
{
printf("%c ",q->data);
p=p->next;
q=q->next;
}
}
void DeleteLinklist(Linklist L,char n)
{//删除值为n的结点
Node *h,*r;
h=L->next;
r=L;
while(r->next!=NULL)
{
if(h->data==n)
{
r->next=h->next;
h=h->next;
}
else
{
r=r->next;
h=h->next;
}
}
}
void QuchongLinklist(Linklist L)
{//去除重复
Node *a,*b,*c;
a=L;
while(a->next!=NULL)
{
a=a->next;
if(a->next!=NULL)
{
b=a->next;
c=a;
while(b!=NULL)
{
if(b->data==a->data)
{
c->next=b->next;
b=b->next;
}
else
{
b=b->next;
c=c->next;
}
}
}
else ;
}
}
Linklist HebingLinklist(Linklist p,Linklist q)
{//并集
Node *m,*n;
QuchongLinklist(p);
QuchongLinklist(q);
m=p;
while(m->next!=NULL)
{
m=m->next;
DeleteLinklist(q,m->data);
};
Linklist c=p->next;
while(c->next!=NULL)c=c->next;
c->next=q->next;
return p;
}
void main()
{
printf("输入数据(输入$则结尾)\n");
Linklist L=(Node*)malloc(sizeof(Node));
L->next=NULL;//初始化链表
Linklist N=(Node*)malloc(sizeof(Node));
N->next=NULL;//初始化链表
CreateFromTail(L);
CreateFromTail(N);
printf("链表a如下:\n");
DisplayLinklist(L);
printf("\n链表b如下:\n");
DisplayLinklist(N);
printf("\na、b的并集链表c如下:\n");
Linklist c=HebingLinklist(L,N);
DisplayLinklist(c);
free(L);
free(N);
free(c);
L=NULL;
N=NULL;
c=NULL;
system("pause");//让程序不马上退出
return 0;
}
实验一第3题(顺序)
#include
#include
typedef struct
{
int *elem;
int last;
}SeqList;
int isExist(SeqList l, int x)//判断元素x是否存在于表中
{
int i = 0;
while (i < l.last)
{
if (l.elem[i] == x)
break;
i++;
}
if (i == l.last)
return 0;
return 1;
}
SeqList bingList(SeqList x, SeqList y)//求x,y的并集
{
SeqList L;
int i;
L.elem=(int*)malloc(sizeof(int)*(x.last + y.last));
L.last = 0;
for (i = 0;i < x.last;i++)
{
if (!isExist(L, x.elem[i]))
{
L.elem[L.last] = x.elem[i];
L.last++;
}
}
for (i = 0;i < y.last;++i)
{
if (!isExist(L, y.elem[i])){
L.elem[L.last] = y.elem[i];
L.last++;
}
}
return L;//返回并集
}
int fun(int a[]){//初始化函数
int i=0;
printf("输入整型数据,以回车结束\n");
do{
scanf("%d",&a[i]);
i++;
}while(getchar()!='\n');
return i;
}
int main()
{
SeqList A,B;
int i;
int a[100],b[100];
A.last=fun(a);
A.elem=a;
B.last=fun(b);
B.elem=b;
SeqList x=bingList(A, B);
printf("并集为:\n");
for (i = 0;i < x.last;i++)
printf("%d ", x.elem[i]);
return 0;
}
实验一第4题
#include
#include
typedef struct Node
{
int data;
struct Node *next;
}Node,*Linklist;
void main()
{
Linklist p,rear,head;
int m,n,king,i,j;
scanf("%d %d",&m,&n);
if(m==1)
king=1;//一只猴子时不用循环
p=rear=(Node*)malloc(sizeof(Node));
head=p;
head->data=1;
for(i=1;i {
p=(Node*)malloc(sizeof(Node));
p->data=i+1;
rear->next=p;
rear=p;
}
rear->next=head;
p=head;
for(i=1;i {
for(j=1;j p=p->next;
rear=p->next;//找到报数n的猴子
p->next=rear->next;//删掉那个猴子
p=rear->next;
free(rear);
}
king=p->data;
free(p);
printf("猴王原始序号为%d\n",king);
system("pause");
}