在高级语言中,借助数组,实现一个顺序表很容易,如果需要自己实现数组的逻辑,那就不太容易了。
这里直接使用现成的数组,来实现一个顺序结构的线性表,思想是有的。数组保证了线性表的顺序。
代码实现
线性表类SqList
SqList.h
#import <Foundation/Foundation.h>
@class Element;
NS_ASSUME_NONNULL_BEGIN
/// 线性表的顺序结构OC语言实现
@interface SqList : NSObject
// 表长
@property (nonatomic, readonly) NSUInteger count;
// 插入元素
- (void)insertElement:(Element *)element atIndex:(NSUInteger)index;
// 删除元素
- (void)removeElementAtIndex:(NSUInteger)index;
// 读取对应的元素
- (Element *)elementAtIndex:(NSUInteger)index;
@end
NS_ASSUME_NONNULL_END
SqList.m
#import "SqList.h"
#import "Element.h"
#import <objc/message.h>
@interface SqList ()
// 存储数据的容器
@property (nonatomic, strong) NSMutableArray *listArray;
// 表长
@property (nonatomic, readwrite) NSUInteger count;
@end
@implementation SqList
#pragma mark - private
- (NSMutableArray *)listArray {
if (!_listArray) {
_listArray = [[NSMutableArray alloc] init];
}
return _listArray;
}
#pragma mark - public
- (NSUInteger)count {
return self.listArray.count;
}
- (void)insertElement:(Element *)element atIndex:(NSUInteger)index {
if (!element) {
return;
}
((void (*)(id, SEL, NSUInteger))objc_msgSend)(element, @selector(setIndex:),index);
[self.listArray insertObject:element atIndex:index];
}
- (void)removeElementAtIndex:(NSUInteger)index {
[self.listArray removeObjectAtIndex:index];
}
- (Element *)elementAtIndex:(NSUInteger)index {
if (index >= 0 && index <= self.count) {
return self.listArray[index];
}
return nil;
}
@end
元素类Element
Element.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/// 元素类,该类定义了元素的数据、下标等
@interface Element : NSObject
// 数据
@property (nonatomic) int data;
// 下标
@property (nonatomic, readonly) NSUInteger index;
// 初始化
- (instancetype)initWithData:(int)data;
@end
NS_ASSUME_NONNULL_END
Element.m
#import "Element.h"
@implementation Element
- (instancetype)init {
return [self initWithData:0];
}
- (instancetype)initWithData:(int)data {
if (self = [super init]) {
self.data = data;
}
return self;
}
- (void)setIndex:(NSUInteger)index {
_index = index;
}
@end
测试代码
#import "Element.h"
@implementation Element
- (instancetype)init {
return [self initWithData:0];
}
- (instancetype)initWithData:(int)data {
if (self = [super init]) {
self.data = data;
}
return self;
}
- (void)setIndex:(NSUInteger)index {
_index = index;
}
@end