【计算机408学习笔记】C语言(中级)11.单链表代码实战

11.单链表代码实战

五、线性表的链式表示——简称链表
  • 顺序表:插入和删除操作需要移动大量元素。数组的大小不好确定。占用一大段连续的存储空间,造成很多碎片。
  • 单链表:逻辑上相邻的两个元素在物理位置上不相邻。
【计算机408学习笔记】C语言(中级)11.单链表代码实战_第1张图片
  • 例子(单链表结点的定义)
typedef struct LNode{        //单链表结点类型,LNode不能省略
    ElemType data;           //数据域
    struct LNode *next;      //指针域
}LNode, *LinkList;
  • 一个节点需要一个结构体变量存储。当链表最后一个节点后的*next,赋值为NULL。
  • 头指针: 链表中第一个结点的存储位置, 用来标识单链表。
  • 头结点: 在单链表第一个结点之前附加的一个结点, 为了操作上的方便。
  • 若链表有头结点, 则头指针永远指向头结点, 不论链表是否为空, 头指针均不为 , 头指针是链表的必须元素, 他标识一个链表。
  • 头结点是为了操作的方便而设立的, 其数据域一般为空, 或者存放链表的长度。有头结点后, 对在第一结点前插入和删除第一结点的操作就统一了, 不需要频繁重置头指针。 但头结点不是必须的。
  • 链表优点: 插入和删除操作不需要移动元素, 只需要修改指针。不需要大量的连续存储空间。
  • 链表缺点: 单链表附加指针域, 也存在浪费存储空间的缺点。查找操作时需要从表头开始遍历, 依次查找, 不能随机存取。
  • 考研的数据结构都是进行增删改查。
  • 插入操作
//创建新结点代码:
q=(LNode*)malloc(sizeof(LNode))
q->data=x;
//(a) (b)操作的代码:
q->next=p->next;
p->next=q;
//(c)操作的代码:
p->next=q;
q->next=NULL;
【计算机408学习笔记】C语言(中级)11.单链表代码实战_第2张图片
  • 删除操作
//(a)(b) (c)操作的代码:
p=GetElem(L,i-1);        //查找删除位置的前驱节点。头结点位置为0
q=p->next;
p->next=q->next;        //断链
free(q);
【计算机408学习笔记】C语言(中级)11.单链表代码实战_第3张图片
  • 查找操作
//按序号查找结点值的算法如下:
LNode *p=L->next;
int j=1;
while(p&&jnext;
    j++;
}
return p;
  • L是头指针, 用来指向头结点。
【计算机408学习笔记】C语言(中级)11.单链表代码实战_第4张图片
//按值查找结点的算法如下:
LNode *p=L->next;
while(p!=NULL&&p->data!=e){
    p=p->next;
}
return p;
【计算机408学习笔记】C语言(中级)11.单链表代码实战_第5张图片

你可能感兴趣的:(学习,笔记,c语言)