链式存储结构

链表的插入,删除比较方便,在给定前驱节点的时候,时间复杂度为O(1)
查找比较麻烦,要根据头指针一个一个往下找,时间复杂度为O(n)

单链表

头插法

使用头插法,读入数据的顺序与生成链表的元素顺序是相反的

#include "iostream"

typedef struct LinkNode{
  LinkNode *next;
  int data;
} ;

LinkNode *linkNodeInsert(){
  LinkNode *head = (LinkNode *) malloc(sizeof (LinkNode));
  LinkNode *s;
  head -> next = NULL;
  for (int i = 1; i <= 5; i++){
      s = (LinkNode *) malloc(sizeof (LinkNode));  //结构体指针分配内存空间
      s -> data = i;
      s -> next = head -> next;
      head -> next = s;
  }

  return head;
}

void display(LinkNode *head){

  while (head -> next){
      head = head -> next;    //指针往后移一位数,指向下一个节点
      printf("%d\n", head -> data);
  }
}

int main(){
  LinkNode *head;
  head = linkNodeInsert();
  display(head);
}

尾插法

定义一个尾指针rear使之指向链表尾节点,不让每一次插入都要从头节点一直查找到尾节点


#include "iostream"

typedef struct LinkNode{
    LinkNode *next;
    int data;
} ;

LinkNode *linkNodeInsert(){
    LinkNode *head = (LinkNode *) malloc(sizeof (LinkNode));
    LinkNode *rear = head;  //添加尾指针,使之指向链表的尾节点
    for (int i = 1; i <= 5; i++){
        LinkNode *s = (LinkNode *) malloc(sizeof (LinkNode));
        s -> data = i;
        rear -> next = s;
        rear = s;
    }
    rear -> next = NULL;    //使尾指针指向Null
    return head;
}

void display(LinkNode *head){
    while (head){
        head = head -> next;
        printf("%d\n", head -> data);
    }
}

int main(){
    LinkNode *head;
    head = linkNodeInsert();
    display(head);
}

双链表

头插法

其实更单链表的创建差不多,只是该节点的指针可以指向改节点的前一个节点的地址

#include "iostream"


typedef struct LinkNode{
    int data;
    LinkNode *prior, *next;
};

LinkNode *linkNode(){
    LinkNode *head = (LinkNode *) malloc(sizeof (LinkNode));
    head -> next = NULL;
    LinkNode *s;
    for (int i = 1; i <=5; i++){
        s = (LinkNode *) malloc(sizeof (LinkNode));
        s -> data = i;
        s -> next = head -> next;
        head -> next = s;
        s -> prior = s;     //s节点向后移
    }
    return head;
}

void display(LinkNode *head){
    while (head -> next){
        head = head -> next;
        printf("%d\n", head -> data);
    }
}

int main(){
    LinkNode *head = linkNode();
    display(head);
}

尾插法

#include "iostream"

typedef struct LinkNode{
    int data;
    LinkNode *prior, *next;
};

LinkNode *linkNode(){
    LinkNode *head = (LinkNode *) malloc(sizeof (LinkNode));
    LinkNode *rear = head;

    for (int i = 1; i <= 5; i++){
        LinkNode *s = (LinkNode *) malloc(sizeof (LinkNode));
        s -> data = i;
        rear -> next = s;
        s -> prior = rear;  //指向前一个节点
        rear = s;
    }
    rear -> next = NULL;
    return head;
}

void display(LinkNode *head){
    while (head -> next){
        head = head -> next;
        printf("%d\n", head -> data);
    }
}

int main(){
    LinkNode *head = linkNode();
    display(head);
}
posted @ 2022-09-24 20:19  MiYol  阅读(47)  评论(0)    收藏  举报