链表,别名链式存储结构或单链表,用于存储逻辑关系为 "一对一" 的数据。与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的。(动态扩展)
数据元素随机存储,并通过指针表示数据之间逻辑关系的存储结构就是链式存储结构。
链表也分两种表现形式:
1.无头结点,先创建指针 首元节点,指针指向首元节点 首元节点赋值
2.有头结点,创建头结点,创建指针指向头结点
/**************正文****************/
这次C语言主要是双链表(注释掉前指针域相关代码 就是单链表),以及对应循环链表实现,OC主要是单链表实现
C语言:
//第一步先申明节点
typedef struct Book{
char num;//数据域
struct Book * next; //后指针域 - 指向直接后继元素
struct Book * pre; //前指针域 - 指向直接前驱元素
}Book;
//main 函数实现
Book * p = initBook(); //获取创建的链表
display(p); //遍历链表
//创建链表
Book * initBook(){
//无头结点链表(先创建首元节点,头指针指向首元节点)
Book * p = NULL; //创建头指针,指向整个链表头部,便于后面遍历链表
Book * temp = (Book*)malloc(sizeof(Book)); //创建首元节点
temp->num = 1;
temp->pre = NULL;
temp->next = NULL;
p = temp; //头指针指向首元节点
for (int i =2; i < 10; i++) {
//创建其它后继节点
Book * node = (Book*)malloc(sizeof(Book));
node->num = i;
node->pre = NULL;
node->next = NULL;
//已经创建好的节点的后继指针指向刚创建的节点(直接后继元素),并且刚创建的节点的前驱指针指向前面已经创建好的节点(直接前驱元素) (把节点前驱指针 pre 注释掉就是单链表)
temp->next = node;
node->pre = temp;
temp = temp -> next;
//循环链表 (如果到了最后一个节点,把最后节点的后继指针指向头指针即可(头指针指向首元节点,相当于末尾节点指向首元节点),形成一个环)
if (!temp->next) {
temp->next = p;
}
}
//返回创建好的链表
return p;
//有头结点链表(只需创建一个空的头结点,头指针指向头结点) 这是个单链表,只有后继指针。
Book * P = NULL;
//创建空的头结点
Book * head = (Book *)malloc(sizeof(Book));
P = head;
for (int i = 1; i<10; i++) {
//创建首元节点及后继节点
Book * node = (Book *)malloc(sizeof(Book));
node->num = i;
node->next = NULL;
head->next = node;
head = head->next;
}
//返回链表
return P;
}
//遍历链表实现
void display(Book * P){
Book *temp = P;
while (temp) {
printf("temp->num:%d",temp->num);
temp = temp->next;
}
}
OC语言:
//此类为节点Node类以及数据信息person类(节点类的数据域为person类的信息)
#import <Foundation/Foundation.h>
@class WNPerson;
NS_ASSUME_NONNULL_BEGIN
@interface WNNode : NSObject
@property(nonatomic,strong)WNPerson * person;//数据域(为person信息,具体属性可以自己定)
@property(nonatomic,strong)WNNode * _Nonnull next;//后继指针
@end
NS_ASSUME_NONNULL_END
//Person类 定义了姓名。身份编码,年龄 数据信息
NS_ASSUME_NONNULL_BEGIN
@interface WNPerson : NSObject
@property(nonatomic,strong) NSString * name;
@property(nonatomic,strong) NSString *idNum;
@property(nonatomic,strong) NSString *age;
@end
NS_ASSUME_NONNULL_END
//实现文件 不做处理
#import "WNNode.h"
@implementation WNNode
@end
@implementation WNPerson
@end
//链表类 - 创建链表
#import <Foundation/Foundation.h>
#import "WNNode.h"
NS_ASSUME_NONNULL_BEGIN
@interface WNList : NSObject
@property(nonatomic,strong) WNNode *p;//头指针
@property(nonatomic,strong) WNNode *headNode;//首元节点
-(instancetype)initWithData:(NSDictionary *)dic;//初始化链表,创建首元节点
-(void)append:(NSMutableDictionary *)dic;//创建链表后继元素节点
-(void)display:(WNNode *)Node;//遍历链表
@end
NS_ASSUME_NONNULL_END
//链表类,链表实现
#import "WNList.h"
@implementation WNList
//初始化链表,创建首元节点
-(instancetype)initWithData:(NSDictionary *)dic{
self = [super init];
if (self) {
self.headNode = [[WNNode alloc]init];
self.headNode.person = [[WNPerson alloc]init];
self.headNode.person.name = [dic objectForKey:@"name"];;
self.headNode.person.idNum = [dic objectForKey:@"idNum"];;
self.headNode.person.age = [dic objectForKey:@"age"];;
self.headNode.next = nil;
self.p = self.headNode;//头指针指向链表首元节点
}
return self;
}
//创建链表后继元素节点
-(void)append:(NSMutableDictionary *)dic{
WNNode * Node = [[WNNode alloc]init];
Node.person = [[WNPerson alloc]init];
Node.person.name = [dic objectForKey:@"name"];
Node.person.idNum = [dic objectForKey:@"idNum"];
Node.person.age = [dic objectForKey:@"age"];
Node.next = nil;
self.headNode.next = Node;
self.headNode = self.headNode.next;
}
//遍历链表
-(void)display:(WNNode *)node{
WNNode * Node = node;
while(Node) {
DLog(@"节点:姓名:%@ 身份编号:%@ 年龄:%@",Node.person.name,Node.person.idNum,Node.person.age);
Node = Node.next;
}
}
@end
//链表的创建以及遍历 主函数实现
-(void)creatList{
//自定义节点数据信息
NSArray * nameArr = @[@"刘备",@"张三",@"李四",@"王五",@"李二",@"阿彪",@"阿信",@"艾克",@"姜尚",@"曹操"];
NSMutableDictionary * mutDic = [NSMutableDictionary dictionary];
[mutDic setObject:nameArr[0] forKey:@"name"];
[mutDic setObject:[NSString stringWithFormat:@"%lu%d",100000000000*(arc4random()%4+1),0] forKey:@"idNum"];
[mutDic setObject:[NSString stringWithFormat:@"%u",arc4random()%100+1] forKey:@"age"];
//调用初始化链表及创建首元节点函数
WNList * list = [[WNList alloc]initWithData:mutDic];
for (int i = 1; i<10; i++) {
[mutDic setObject:nameArr[i] forKey:@"name"];
[mutDic setObject:[NSString stringWithFormat:@"%lu%d",100000000000*(arc4random()%4+1),i] forKey:@"idNum"];
[mutDic setObject:[NSString stringWithFormat:@"%u",arc4random()%100+i] forKey:@"age"];
//调用创建后继元素节点函数
[list append:mutDic];
}
//调用遍历链表函数
[list display:list.p];
}
遍历结果: