线性表用顺序存储,设计一个算法,用尽可能少的辅助存储空间将顺序表中前m个元素与后n个元素进行整体互换,即将线性表
(a1,a2,a3,......,am,b1,b1,b3,......,bn)
(b1,b2,b3,.......,bn,a1,a2,a3,.......,am)
#include <stdio.h>
#include <stdlib.h>
#define Num 100
typedef struct
{
char data[Num];
int last;
} seqlist;
seqlist* init (seqlist*l,int arrsize)
{
l=(seqlist*)malloc(sizeof(seqlist));
l->last=arrsize-1;
return l;
}
seqlist* getresult(seqlist*s,int m,int n)
{
int x,j,i=0;
if(m<n)
{
for(i=0; i<m; i++) //移动m次
{
x=s->data[0];
for(j=1; j<=s->last; j++)
{
s->data[j-1]=s->data[j];//从第二个数开始全体向前移动
}
s->data[s->last]=x;
}
}
else
{
for(i=0; i<n; i++) //移动n次
{
x=s->data[s->last];
for(j=s->last-1; j>=0; j--)
{
s->data[j+1]=s->data[j];//从倒数第二个数开始之前的数往后移
}
s->data[0]=x;
}
}
return s;
}
int main()
{
seqlist *s;
int m,n,i;
scanf("%d %d",&m,&n);
s=init(s,m+n);
for(i=0; i<=s->last; i++)
{
scanf(" %c",&s->data[i]);//前有一个空格,处理字符空格
}
s=getresult(s,m,n);
for(i=0;i<=s->last;i++)
{
printf("%c ",s->data[i]);
}
return 0;
}
已知带头结点的单链表L中的结点是按整数递增排列的。试写一算法,将值为x的结点插入到表L中,使得表L仍然递增有序。
这是原题中带有头结点的做法,与不带头结点稍有差异,注意区别,体现在 creat函数和插入数之前的处理。
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}Lnode,*Lnode1;
Lnode* init()
{
Lnode *s;
s=(Lnode1)malloc(sizeof(Lnode));
s->data=0;
s->next=NULL;
return s;
}
Lnode1 creat()
{
Lnode* s,*r;Lnode1 L;
//Lnode1 L=NULL;
int x,flag=1;
L=(Lnode1)malloc(sizeof(Lnode));
L->next=NULL;
r=L;
printf("input the num of -1 to stop\n");
scanf("%d",&x);
while(flag)
{
s=(Lnode1)malloc(sizeof(Lnode));
s->data=x;
s->next=NULL;
r->next=s;
r=s;
scanf("%d",&x);
if (x==-1)
{
flag=0;
}
}
return L;
}
Lnode1 insert(Lnode* L,int x)
{
Lnode* p,*q,*s;
s=(Lnode1)malloc(sizeof(Lnode));
p=L;
q=p;//q为p的前驱结点
while(p->data<x)
{
q=p;
p=p->next;
}
s->data=x;
s->next=q->next;
q->next=s;
return L;
}
int main()
{
Lnode* s,*r;
int x;
s=creat();
printf("please give the num you want to insert\n");
scanf("%d",&x);
r=s->next;//有头结点,头结点的数据是随机的,所以指向第一个结点
s=insert(r,x);
while(s)
{
printf("%d ",s->data);//这里不先写下式,是因为头结点已经处理,所以直接打印
s=s->next;
}
return 0;
}
不带头节点的做法,注意创建时第一个结点的处理
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}Lnode,*Lnode1;
Lnode* init()
{
Lnode *s;
s=(Lnode1)malloc(sizeof(Lnode));
s->data=0;
s->next=NULL;
return s;
}
Lnode1 creat()
{
Lnode* s,*r=NULL;Lnode1 L=NULL;
int x,flag=1;
printf("input the num of -1 to stop\n");
scanf("%d",&x);
while(flag)
{
s=(Lnode1)malloc(sizeof(Lnode));
s->data=x;
if(L==NULL)L=s;//第一个结点处理
else r->next=s;
r=s;
// s->next=L;
// L=s; //头插
scanf("%d",&x);
if (x==-1)
{
flag=0;
}
}
if(r!=NULL) r->next=NULL;
return L;
}
Lnode1 insert(Lnode* L,int x)
{
Lnode* p,*q,*s;
s=(Lnode1)malloc(sizeof(Lnode));
p=L;
q=p;//q为p的前驱结点
while(p->data<x)
{
q=p;
p=p->next;
}
s->data=x;
s->next=q->next;
q->next=s;
return L;
}
int main()
{
Lnode* s;
int x;
s=creat();
printf("please give the num you want to insert\n");
scanf("%d",&x);//输入的是递增的数据
s=insert(s,x);
while(s)
{
printf("%d ",s->data);
s=s->next;
}
return 0;
}