数据结构2

1.已知顺序表L中的数据类型为整型。设计算法将其调整为左右两部分,左边的元素(即排在前面的)均为奇数,右边所有元素(即排在后面的)均为偶数,并要求算法的时间复杂度为O(n),空间复杂度为O(1)。
2、写一算法,从顺序表中删除自第i个元素开始的k个元素。
3、已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为O(n),空间复杂度为O(1)的算法,删除线性表中所有值为item的数据元素。
4、设计算法实现带头节点单链表的逆置。
5、建立一个带头节点的线性链表,用以存放输入的二进制数,链表中每个节点的data域存放一个二进制位。并在此链表上实现对二进制数的加1运算。
6、对单链表,编写算法实现以第一个元素为基准,将小于该元素的节点全部放到前面,大于该节点的元素全部放到后面。时间复杂度要求为O(n),不能申请新空间。
7、假设有一个循环链表的长度大于1,且表中既无头结点也无头指针。已知s为指向链表某个节点的指针,试编写算法在链表中删除指针s所指节点的前驱节点。

作业1:
方法1:复杂度:n的平方;

void sort3(LinkList H)//二,作业1:分为左右两部分,左边的元素为奇数,右边所有元素为偶数
{
    LinkList L=H,p,q,r;
    r=L;
    p=L->next;
    int j=0;
    while(p!=NULL)
    {
        p=p->next;
        j++;
    }
    for(int i=0; i<j-1; i++)
    {
        r=L;
        q=L->next;
        for(int k=0; k<j-1; k++)
        {
            p=q;
            q=p->next;
            if(((p->data)%2==0)&&((q->data)%2==1))
            {
                p->next=q->next;
                q->next=p;
                r->next=q;
            }
            r=p;
        }
    }
}

方法2:复杂度:n;

void sort4(LinkList H)//二,作业1:分为左右两部分,左边的元素为奇数,右边所有元素为偶数
{
    LinkList L=H,p,q,r,s;
    r=L;
    p=L->next;
    int j=0;
    while(p!=NULL)
    {
        s=p;//s为最后一个节点;
        p=p->next;
        j++;
    }
    r=L;
    p=L->next;
    q=p->next;
    for(int i=0; i<j-1; i++)
    {
        if((p->data)%2==0)
        {
            r->next=q;
            p->next=NULL;
            s->next=p;
            s=p;
            p=q;
            q=p->next;
        }
        else
        {
            r=p;
            p=q;
            q=p->next;
        }
    }
}

作业2:

void deleteE(LinkList H)//删除自i开始的k个元素
{
    LinkList L=H,q,p;
    printf("please input weizhi and sum:\n");
    int i,k;
    cin>>i>>k;
    for(int j=1; j<i; j++)
        L=L->next;
    for(int j=i; j<i+k; j++)
    {
        q=L->next;
        p=q->next;
        free(q);
        L->next=p;
    }
}

作业3:

void deleteEl(LinkList H)//删除值为item的元素
{
    LinkList L=H,q,p;
    printf("please input item:\n");
    int n;
    cin>>n;
    while(L->next!=NULL)
    {
        p=L->next;
        if(p->data==n)
        {
            q=p->next;
            free(p);
            L->next=q;
        }
        else
        L=L->next;
    }
}

作业4:

void nizhi(LinkList H)//将链表逆置
{
    LinkList L=H;
    LinkList p,q;
    p=L->next;
    L->next=NULL;
    while(p)
    {
        q=p;
        p=p->next;
        q->next=L->next;
        L->next =q;
    }
}

作业5:

#include <iostream>
#include <cstdio>
#include <cstdlib>

using namespace std;

typedef struct node
{
    int data;
    struct node *next;
} Node,*LinkList;
LinkList Createlist()//构建先进后出链表;
{
    LinkList L,p;
    int n;
    printf("输入二进制位数:\n");
    cin>>n;
    L=(LinkList)malloc(sizeof(Node));
    L->next=NULL;
    printf("输入此二进制数(数字之间加空格):\n");
    for(int i=n; i>0; i--)
    {
        p=(LinkList)malloc(sizeof(Node));
        scanf("%d",&p->data);
        p->next=L->next;
        L->next=p;
    }
    return L;
}
void add1(LinkList H)//二进制完成自加一;
{
    int x=1;
    LinkList L=H;
    LinkList p=L->next;
    while(x!=0)
    {
        p->data+=x;
        if(p->data==2)
        {
            p->data=0;
            x=1;
            p=p->next;
        }
        else
        {
            x=0;
        }
    }
}
void nizhi(LinkList H)//将链表逆置
{
    LinkList L=H;
    LinkList p,q;
    p=L->next;
    L->next=NULL;
    while(p)
    {
        q=p;
        p=p->next;
        q->next=L->next;
        L->next =q;
    }
}
void put(LinkList H)//输出链表里的值
{
    LinkList L=H;
    LinkList q;
    while(L->next!=NULL)
    {
        L=L->next;
        q=L;
        printf("%d ",q->data);
    }
    cout<<endl;
}
void freelist(LinkList H)//作业3:释放链表节点空间
{
    LinkList L=H;
    LinkList q;
    while(L!=NULL)
    {
        q=L;
        L=L->next;
        free(q);
    }
}
int main()
{
    LinkList head;
    head=Createlist();
    add1(head);
    nizhi(head);
    put(head);
    freelist(head);
    return 0;
}

结果:
输入二进制位数:
6
输入此二进制数(数字之间加上空格):
1 0 1 1 0 1
1 0 1 1 1 0

作业6:

void sort5(LinkList H)//二,作业6:以第一个元素为基准,将小于该元素的节点全部放到前面,大于该节点的元素全部放到后面
{
    LinkList L,p,q,r,s;
    r=H;
    p=H->next;
    int j=0;
    while(p!=NULL)
    {
        s=p;//s为最后一个节点;
        p=p->next;
        j++;
    }
    L=s;
    r=H;
    p=H->next;
    q=p->next;
    int t=p->data;//将第一个值与最后一个值交换,方便后面的运算;
    p->data=s->data;
    s->data=t;
    for(int i=0; i<j-1; i++)
    {
        if((p->data)>L->data)
        {
            r->next=q;
            p->next=NULL;
            s->next=p;
            s=p;
            p=q;
            q=p->next;
        }
        //else if((p->data)==L->data)//考虑相等的代码有一组数组不成功。。
        //{
        //    r->next=q;
        //    p->next=L->next;
        //    L->next=p;
        //    p=q;
        //    q=p->next;
        //}
        else
        {
            r=p;
            p=q;
            q=p->next;
        }
    }
}

作业7:

void delete_index(LinkList s)//删除指针s所指节点的前驱节点
{
    LinkList L=s;
    while(L->next!=s)
    {
        L=L->next;
    }
    L->next=NULL;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值