链表(C面向过程以及OC面向对象)实现

链表,别名链式存储结构或单链表,用于存储逻辑关系为 "一对一" 的数据。与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的。(动态扩展)

数据元素随机存储,并通过指针表示数据之间逻辑关系的存储结构就是链式存储结构。

链表也分两种表现形式:

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];

}

 

遍历结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值