数据结构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的平方;
方法2:复杂度:n;
作业2:
作业3:
作业4:
作业5:
结果:
输入二进制位数:
6
输入此二进制数(数字之间加上空格):
1 0 1 1 0 1
1 0 1 1 1 0
作业6:
作业7:
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; }
相关文章推荐
- 关于指针的一些事情
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#数据结构之顺序表(SeqList)实例详解
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#定义并实现单链表实例解析
- C#数据结构之单链表(LinkList)实例详解
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- C# Pointer指针应用实例简述