数据结构-题目1
2016-03-27 21:09
316 查看
/* 一个线性表L采用顺序存储结构,其中所有元素为整数。设计一个算法,删除元素值在[x,y]之间的所有元素。 要求算法时间复杂度为O(n),空间复杂度为O(1)。 */ /* 思路: 扫描顺序表,重建表L。用k记录顺序表L中等于x到y之间的元素个数,一边扫描L,一边统计k值,并将不为x到y之间的元素前移k个位置,最后修改L的长度。 */ #include <iostream> #include <malloc.h> #include <cstdio> #include <cstring> using namespace std; #define MaxSize 100 typedef int ElemType; typedef struct { ElemType data[MaxSize]; int length; } SqList; void InitList(SqList *&L) //初始化顺序表L { L=(SqList *)malloc(sizeof (SqList)); L->length=0; } void ListInsert(SqList *&L,ElemType a[],int n) //采用尾插法依次插入元素 { for(int i=0; i<n; i++) L->data[i]=a[i]; L->length=n; } void DispList(SqList *L) //输出顺序表L { for(int i=0; i<L->length; i++) cout<<L->data[i]<<" "; cout<<endl; } void delNode(SqList *&L,ElemType x,ElemType y) { int k=0,i=0; while (i<L->length) { if(L->data[i]>=x&&L->data[i]<=y) k++; else L->data[i-k]=L->data[i]; i++; } L->length=L->length-k; } int main() { ElemType a[10]; for(int i=0;i<=7;i++) cin>>a[i]; SqList *L; InitList(L); ListInsert(L,a,8); cout<<"输出顺序表:"; DispList(L); delNode(L,5,7); cout<<"输出顺序表:"; DispList(L); return 0; }
/*
一个线性表L采用顺序存储结构,其中所有元素为整数。设计一个算法,将所有小于0的元素移到
所有大于0的元素前面,要求算法时间复杂度为O(n),空间复杂度为O(1)。
*/
/*
思路:
用i和j分别指向顺序表的第一个元素(i=0)和最后一个元素(j=L->length-1)。
当i<j时循环:从右向左扫描,找一个关键字小于等于0的data[j],再从左向右扫描,找一个关键字大于0
的data[i],将两者进行交换。
*/
#include <iostream>
#include <malloc.h>
#include <cstdio>
#include <cstring>
using namespace std;
#define MaxSize 100
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize];
int length;
} SqList;
void InitList(SqList *&L) //初始化顺序表L
{
L=(SqList *)malloc(sizeof (SqList));
L->length=0;
}
void ListInsert(SqList *&L,ElemType a[],int n) //采用尾插法依次插入元素
{
for(int i=0; i<n; i++)
L->data[i]=a[i];
L->length=n;
}
void DispList(SqList *L) //输出顺序表L
{
for(int i=0; i<L->length; i++)
cout<<L->data[i]<<" ";
cout<<endl;
}
void move1(SqList *&L)
{
int i=0,j=L->length-1;
ElemType tmp;
while(i<j)
{
while(i<j&&L->data[j]>0)
j--;
while(i<j&&L->data[i]<=0)
i++;
if(i<j)
{
tmp=L->data[i];
L->data[i]=L->data[j];
L->data[j]=tmp;
}
}
}
int main()
{
ElemType a[10];
for(int i=0; i<=5; i++)
cin>>a[i];
SqList *L;
InitList(L);
ListInsert(L,a,6);
cout<<"输出顺序表:";
DispList(L);
move1(L);
cout<<"输出顺序表:";
DispList(L);
return 0;
}
/*设计一个算法,将一个带头节点的数据域依次为a1,a2,...,an(n>=3)的单链表的所有节点逆置, 即第一个节点的数据域变为an,...,最后一个节点的数据域变为a1。 */ /* 思路: 建立一个新链表,采用头插法将L2中的数据依次存入L1中。 */ #include <iostream> #include <malloc.h> #include <cstdio> #include <cstring> using namespace std; typedef char ElemType; typedef struct LNode { ElemType data; struct LNode *next; } LinkList; void InitList(LinkList *&L) //初始化单链表h { L=(LinkList *)malloc(sizeof (LinkList)); L->next=NULL; } void CreateListR(LinkList *&L,ElemType a[],int n) //采用尾插法依次插入元素 { LinkList *s,*r; int i; L=(LinkList *)malloc(sizeof(LinkList)); r=L; for(i=0; i<n; i++) { s=(LinkList *)malloc(sizeof(LinkList)); s->data=a[i]; r->next=s; r=s; } r->next=NULL; } void reverse(LinkList *&L1,LinkList *&L2,int n) { LinkList *s,*t; L1=(LinkList *)malloc(sizeof(LinkList)); L1->next=NULL; t=L2->next; for(int i=0;i<n;i++) { s=(LinkList *)malloc(sizeof(LinkList)); s->data=t->data; s->next=L1->next; L1->next=s; t=t->next; } } void DispList(LinkList *L) //输出单链表h { LinkList *p=L->next; while(p!=NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; } int main() { ElemType a[10]; for(int i=0; i<=5; i++) cin>>a[i]; LinkList *L1,*L2; InitList(L1); CreateListR(L1,a,6); cout<<"输出单链表:"; DispList(L1); reverse(L2,L1,6); cout<<"输出单链表:"; DispList(L2); return 0; }
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)