数据结构—链表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构—链表相关的知识,希望对你有一定的参考价值。
单链表,线性表的链式存储结构,逻辑相邻,物理位置不相邻
描述如下
typedef struct LNode{ ElemType data; struct node *next; }LNode, *LinkList;
数据域data存储数据,指针域 next 使得链表逻辑相邻;
头指针L指向链表表头,包含头节点链表的表头是一个空数据域节点,不包含表头链表表头即是第一个元素。
单链表的插入分为两种形式,栈式插入(先进链表的在最后面)队列式插入(先进链表的在最前面)。
前插法使用一个指针指向待插入节点,一个指针指向表头,
主要代码如下:
//前插法,栈式 LinkList CreatList1(LinkList *L){ LNode *s; int x; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; scanf("%d",&x); while(x!=999){ s=(LNode*)malloc(sizeof(LNode)); s->data=x; s->next=L.next; L->next=s; scanf("%d",&x); } return L; }
后尾插法使用一个指针指向当前结点的尾部,一个指针指向待插入节点,
代码如下:
LinkList CreatList2(LinkList *L){ L=(LinkList)malloc(sizeof(LNode)); int x; LNode *s,*r=L; scanf("%d",&x); while(x!=999){ s=(LNode*)malloc(sizeof(LNode)); s->data=x; r->next=s; r=s; scanf("%d",&x); } r->next=NULL; return L; }
链表还有其他几种形式,双链表有left,right两个指针控制一个节点,而循环链表则是首尾相连的链表,他们的基本操作与单链表没有太大的出入,故不在细说。
1)递归算法。删除不带头结点的单链表L中值为x节点。
void Del_X(LinkList *L,ElemType x){ if(L==NULL) return ; Lnode *q; if(L->data==x){ q=L; L=L.next; free(q); Del_X(L,x); } else Del_X(L->next,x); }
2)带头结点单链表 删除值为x的节点
void deleteX(LinkList *L,ElemType x){ Lnode *p=L->next,*pre=L,*q; while(p!=NULL){ if(p->data==x){ q=p; p=p->next; pre->next = p; free(q); } else{ pre =p; p=p->next; } } }
以上是关于数据结构—链表的主要内容,如果未能解决你的问题,请参考以下文章
NC41 最长无重复子数组/NC133链表的奇偶重排/NC116把数字翻译成字符串/NC135 股票交易的最大收益/NC126换钱的最少货币数/NC45实现二叉树先序,中序和后序遍历(递归)(代码片段