数据结构顺序表元素整体互换和单链表插入练习

线性表用顺序存储,设计一个算法,用尽可能少的辅助存储空间将顺序表中前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;
}

猜你喜欢

转载自blog.csdn.net/weixin_42107106/article/details/82990876
今日推荐