Bootstrap

数据结构之链表笔记

链表

专业术语

  • 首节点:第一个有效节点

  • 尾结点:最后一个有效节点

  • 头结点:

    • 头结点的数据类型和首节点一样

    • 是第一个有效节点之前的那个节点

    • 头结点不存放有效数据

    • 加头结点的目的主要是为了方便对链表的操作

  • 头指针:指向头结点的指针变量

  • 尾指针:指向尾结点的指针变量!

在这里插入图片描述

链表的操作

1.节点的建立

typedef struct Node{
    int data ;//数据域
    Node * next;//指针域
}Node,*pNode;

2.链表的建立

1.空链表的建立
pNode creatList(){
    pNode p = (pNode)malloc(sizeof(Node));
    p->next = NULL;
    return p;
}
2.完整的一个链表建立
pNode creatList(){
    pNode L = (pNode)malloc(sizeof(Node));//建立头结点
    pNode r = L;//再创建一个指针指向头结点
    L->next = NULL;
    int x;// x来存储输入的值
    scanf("%d",&x);
    while(x){//假设一直输入,直到输入0为止
        pNode p = (pNode)malloc(sizeof(Node));//建立新节点
        p->data = x;//把值输入进去
        p->next = NULL;//建立连接关系
        r->next = p;
        r = p;//这个r指针用来当做尾结点
    }
  return L;
}

3.链表的增删改查

1.链表的增加
1.插入到中间

在第 i 个元素之前插入一个数

pNode insertList(pNode L,int x,int i){
    pNode p = L->next;//指向首节点
    for(int j = 0 ; j < i-1 && p != NULL ; j++){
        p = p->next;//如果p不为空而且j满足条件,则继续指向下一结点
    }//直到在第i-1个元素的时候停止循环
    pNode p1 = (pNode)malloc(sizeof(Node));//创建一个新节点
    p1->data = x;
    p1->next = p->next;
    p->next = p1;
    return L;
}
2.追加到链表尾部
pNode inserEndList(pNode L,int x){
   pNode p = L;
   pNode p1 = (pNode)malloc(sizeof(Node));
   p1->data = x;
   //建立联系
   p1->next = NULL;//当做尾结点,指针域为空NULL
   p->next = p1;
   p = p1;
}
2.链表的删除

删除第 i 个元素

int deleteList(pNode L,int i){
    pNode p = L->next;
    pNode s;
    for(int j = 0 ; j < i-1 && p != NULL ; j++){
        p = p->next;
    }//找到第 i-1 个元素
    s = p->next;// s指向第i个元素
    int x = s->data;//把要删除的元素存到x中
    //修改连接关系
    p->next = s->next;//p指向第i+1元素的节点
    free(s);
    return x; 
}
;