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;
}