链表基础


/*
 * ===========================================================================
 *
 *       Filename:  Linklist.c
 *    Description:  
 *        Version:  1.0
 *        Created:  2018年04月15日 12时49分59秒
 *       Revision:  none
 *       Compiler:  gcc
 *         Author:   (ycs), 
 *        Company:  
 *
 * ===========================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct _node_ {
  int data;
  struct _node_ *next;//指针
}Linklist;

//创建空链表头
Linklist * create_empty() {

  Linklist *head;
  head = (Linklist*)malloc(sizeof(Linklist));
  head->next = NULL;

  return head;
}

//头插法插入链表
int insert_head_Linklist(Linklist *head,int data) {

  Linklist * node = (Linklist*)malloc(sizeof(Linklist));
  node->data = data;
  
  node->next = head->next;
  head->next = node; 

  return 0;
}
//尾插法插入链表
int insert_tail_Linklist(Linklist *head,int data){

  Linklist *tail = head;
  //遍历tail指针位置
  while(NULL != tail->next) {
    tail = tail->next;
  } 

  Linklist *node = (Linklist*)malloc(sizeof(Linklist));
  node->data = data;
  //新节点插入
  tail->next = node;
  node->next = NULL;


  return 0;
}
//顺序插入链表
int insert_order_Linklist(Linklist *head,int data){
  Linklist *p = head;
  
  //遍历判断节点大小
  while(NULL != p->next && data > p->next->data)
    p = p->next;
 
  Linklist *node = (Linklist*)malloc(sizeof(Linklist));
  node->data = data;
  //新节点插入
  node->next = p->next;
  p->next = node;

  return 0;
}
//删除特定节点
int del_Linklist(Linklist *head,int num){
    Linklist *p = head;
    Linklist *delNode = NULL;

    int i = 0;
     
    while(p){//遍历链表
        if(i == num -1 ){//找到节点
          delNode = p->next;
          p->next = delNode->next;//链表指针指向下一个链表节点
          free(delNode);//删除
        }
        i ++;
        p = p->next;
    }
}
//添加特定位置节点
int add_Linklist(Linklist *head,int data,int num){
    Linklist *p = head;
    Linklist *AddNode = (Linklist*)malloc(sizeof(Linklist));
    AddNode->data = data;
    int i = 0;

    while(p){//遍历链表
      if(i == num -1 ){//找到位置
        AddNode->next = p->next;
        p->next = AddNode;//添加
      } 
    
      i ++;
      p = p->next;
    }


}

//逆序链表
int reverase_Linklist(Linklist *head){
  
  Linklist *curent = head->next;
  Linklist *tmp = NULL;

  head->next = NULL;
  
  while(NULL != curent){//curent和tmp的偏移
    tmp = curent->next;
    curent->next = head->next;//头插法
    head->next = curent;
    curent = tmp;
  }
  return 0;

}

int print_Linklist(Linklist *head){

  Linklist *p = head;

  while(NULL != p->next){  
    p = p->next;
    printf("data : %d ",p->data);
  }
  printf("\n");
  return 0;
}



int main(){
  int i = 0;
  Linklist *h  = create_empty();
  for(i = 0;i < 10; i ++) {
    //insert_head_Linklist(h,i);
    //insert_tail_Linklist(h,i);
    insert_order_Linklist(h,i);
  }
  print_Linklist(h);
  reverase_Linklist(h);
  print_Linklist(h);
  del_Linklist(h,3);
  print_Linklist(h);
  add_Linklist(h,7,3);
  print_Linklist(h);

  return 0;
}

阅读更多
个人分类: 算法 & 数据结构
上一篇C++单例模式(懒汉 & 饿汉)
想对作者说点什么? 我来说一句

4.9.链表&状态机与多线程

-

学院

1970年01月01日 08:00

c++链表的基本操作

2014年03月12日 954B 下载

没有更多推荐了,返回首页

不良信息举报

链表基础

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭