ArrayList,LinkedList, Vector, Stack的区别,
分享于 点击 32490 次 点评:88
ArrayList,LinkedList, Vector, Stack的区别,
List的框架图
List
|---- LinkList
|---- ArrayList
|---- Vector
|---- Stack
List是一个接口,它继承于Collection的接口。它代表着有序的队列。
ArrayList,LinkedList, Vector, Stack是List的4个实现类。
ArrayList:一个数组队列,相当于动态数组。它由数组实现,随机访问效率高,随机插入、删除效率低。
LinkedList:一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作。随机访问效率低,但随机插入、随机删除效率低。
Vector:矢量队列,和ArrayList一样,它也是一个动态数组。但是ArrayList是非线程安全的,而Vector是线程安全的。
Stack:它继承于Vector。它的特性是:先进后出(FILO, FirstIn Last Out)。
List使用场景
如果涉及到“栈”、“队列”、“链表”等操作,应该考虑用List,具体的选择哪个List,根据下面的标准来取舍。
1、对于需要快速插入,删除元素,应该使用LinkedList。
2、对于需要快速随机访问元素,应该使用ArrayList。
3、对于“单线程环境” 或者“多线程环境,但List仅仅只会被单个线程操作”,此时应该使用非同步的类(如ArrayList)。
对于“多线程环境,且List可能同时被多个线程操作”,此时,应该使用同步的类(如Vector)。
下面是自己用C语言写的单链表,实现了基本的添加元素,删除元素,遍历元素的功能。 注释非常详细,有点数据结构和C基础的一定能看懂。
<span >/*
* LinkList.c
*
* Created on: 2011-11-2
* Author: du_minchao
*/
#include <stdlib.h>
#include "IDVRealise.h"
#include "BaseLinkList.h"
int main(){
//建立空表,初始化头指针, head ->next = NULL;
LinkList head = (LinkList)malloc(sizeof(LNode));
head->next = NULL;
LinkList L = head;
insertList(L,1,5);
insertList(L,1,4);
insertList(L,1,3);
insertList(L,1,2);
insertList(L,1,1);
printList(L);
delList(L,1);
delList(L,5); //由于没有第5个元素,所有删除失败, 提示位置不合适
printList(L);
return 0;
}
</span>
<span >/*
* IDVRealise.h
*
* Created on: 2011-11-2
* Author: du_minchao
*/
#ifndef IDVREALISE_H_
#define IDVREALISE_H_
#include <stdio.h>
#include <stdlib.h>
#define DataType int
typedef struct LNode{
DataType data;
struct LNode *next;
}LNode, *LinkList;
//查找L中得第i个元素, 并返回其指针
LinkList findList(LinkList L, int i){
LinkList p ;
int j=0;
p = L; //p指向头结点,这样可以找到第i个元素
while(p && j<i){
p = p->next;
++j;
}
if(!p){
printf("链表中没有第%d个元素\n", i);
return NULL;
}
return p;
}
//在头指针链表L第I个位置插入元素e
void insertList(LinkList L, int i, DataType e){
//1.首先找到链表中的第i-1个元素
LinkList p = findList(L,i-1);
if(!p){
printf("你插入的位置无效!\n");
return;
}
//2.将元素e插入到链表中
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
printf("你已经插入元素%d。\n", s->data);
return ;
}
//删除L中的第I个元素
void delList(LinkList L, int i){
LinkList s=NULL;
//1.先找到第i-1个元素
LinkList p = findList(L,i-1); //p指向第i-1个元素
if(!p || !(p->next)){ //如果第I个元素或者第i个元素为空, 则返回删除位置无效
printf("你要删除的位置无效\n");
return ;
}
//第i个位置不为空
s = p->next; //s指向第i个元素
p->next = s->next; //删除第i个元素
//3.如果有效删除第i个元素。
printf("你已经删除第%d个元素%d。\n",i,s->data);
free(s);
return ;
}
#endif /* IDVREALISE_H_ */
</span>
<span >/*
* BaseLinkList.h
*
* Created on: 2011-11-3
* Author: du_minchao
*/
#ifndef BASELINKLIST_H_
#define BASELINKLIST_H_
#include <stdio.h>
//对线性表进行初始化
void initList(LinkList L){
}
void getElem(LinkList L, int i, DataType e){
}
//遍历打印链表中的所有元素
void printList(LinkList L){
LinkList p = L->next; //p指向第一个元素
while(p){
printf("%d ",p->data);
p = p->next;
}
puts("");
return;
}
#endif /* BASELINKLIST_H_ */
</span>
相关文章
- 暂无相关文章
用户点评