线性表实现(链表)

本文详细介绍了链表结构以及线性表的各种操作,包括初始化、清空、销毁、查询、插入、删除等。针对每个操作,还给出了相应的时间复杂度分析,如查询和插入的时间复杂度分别为O(n)。
摘要由CSDN通过智能技术生成

链表结构

typedef int ElemType;

typedef int Bool;
#define True 1
#define False 0


typedef enum{
  success = 0,
  fail,
  range_error,
  fatal
}Status;


typedef struct node{
  ElemType data;
  struct node * next;
}Node, *PNode;

线性表操作

  1. 初始化 :

时间复杂度: O(1)

Status initList(PNode *header){
  Status s = success;
  if((*header) == NULL){
    Node *p= (Node *)malloc(sizeof(Node));
    if(p){
      p -> next = NULL;
      *header = p;
    }else{
      s = fatal;
    }
  }
  return s;
}
  1. 清空 :

时间复杂度: O(n)

void clearList(PNode header){
  Node *deleteNode,*ptr=header;
  if(header){
    Node *deleteNode,*ptr=header;
    while(ptr -> next) {
      deleteNode = ptr->next;
      ptr->next = deleteNode ->next;
      free(deleteNode);
    }
    deleteNode = NULL;
  }
}
  1. 销毁 :

时间复杂度: O(1)

void destroyList(PNode *header){
  if(*header){
    clearList(*header);
    free(*header); // 释放头节点
    *header = NULL;
  }
}
  1. 查询(按位置) :

时间复杂度: O(n)

Status retrieveByPos(PNode header, int pos, ElemType *ele){
  Status s = range_error;
  Node *ptr = header -> next;  //ptr point to the first node
  int i = 1;
  while(ptr != NULL && i < pos) {
    i++;
    ptr = ptr ->next;
  }

  if(i == pos && ptr) {
    *ele = ptr->data;
    s = success;
  }
  return s;
}
  1. 查询(按值) :

时间复杂度: O(n)

Status locateByValue(PNode header, ElemType value ,int *pos){
  Status s = range_error;
  Node *ptr = header->next;
  int i = 1;
  while(ptr && ptr->data != value) {
    i++;
    ptr = ptr->next;
  }
  if(ptr){
    *pos = i;
    s = success;
  }
  return s;
}
  1. 插入 :
  • 时间复杂度: O(n).
Status insertByPos(PNode header, int pos, ElemType ele){
  Status s = range_error;

  Node *ptr = header; //这里不能指向第一元素,因为可能删除第一个元素
  int i = 0;
  while(i < pos -1 && ptr) {
    i++;
    ptr = ptr->next;
  }

  if (i == pos - 1 && ptr) {
    Node *newNode = (Node *) malloc(sizeof(Node));
    if(newNode) {
      newNode -> data = ele;
      newNode -> next = ptr -> next;
      ptr ->next = newNode;
      s = success;
    }else{
      s = fatal;
    }
  }

  return s;
}
  1. 删除 :
  • 时间复杂度: O(n)
Status deleteyPos(PNode header, int pos){
  Status s= range_error;
  Node *ptr = header; //这里不能只想第一元素,因为可能删除第一个元素
  int i = 0;
  while(i < pos -1 && ptr) {
    i++;
    ptr = ptr->next;
  }

  if( i == pos -1 && ptr) {   //判断存在第pos-1元素存在
    if(ptr -> next != NULL){  //第pos元素(要删除的元素)存在
      Node * deleteNode = ptr -> next;
      ptr -> next = ptr -> next -> next;
      free(deleteNode);
      deleteNode = NULL;
      s = success;
    }
  }
  return s;
}

  1. 判断是否为空 :

时间复杂度: O(1)

Bool isEmpty(PNode header){
  return (header->next == NULL)? True:False;
}
  1. 获取线性表大小 :

时间复杂度: O(n)

int getLength(PNode header){
  int i = 0;
  if(header){
    Node *ptr = header->next;
    while(ptr != NULL) {
      i++;
      ptr = ptr -> next;
    }
  }
  return i;
}
  1. 尾部插入 :

时间复杂度: O(n)

Status appendList(PNode header,int data){
  Status s = success;
  Node *ptr = header;
  while(ptr && ptr->next != NULL){
    ptr = ptr ->next;
  }
  Node *tmp = (Node *) malloc(sizeof(Node));
  if(tmp){
    tmp -> data = data;
    tmp -> next = NULL;
    ptr -> next = tmp;
  } else{
    s = fatal;
  }
  return s;
}
  1. 打印:
void printLinkList(PNode header){
  if(header){
    Node *ptr = header->next;
    while(ptr!= NULL){
      printf("%d  ",ptr->data );
      ptr = ptr->next;
    }
    printf("\n");
  }
};

  1. 创建线性表:
Status createList(PNode *header, ElemType data[],int len) {
  Status s;
  s = initList(header);
  if(s == success) {
    Node *tmpPtr;
    for (int i = len-1; i >=0 ; i--) {
      tmpPtr = (Node *)malloc(sizeof(Node));
      if(tmpPtr){
        tmpPtr -> data = data[i];
        tmpPtr -> next = (*header) -> next;
        (*header)->next = tmpPtr;
      } else{
        s = fatal;
        break;
      }
    }
  }
  return s;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值