您的位置:首页 > 理论基础 > 数据结构算法

数据结构2

2016-03-27 15:11 573 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息