2.2 线性链表

来源:互联网 发布:焦大seo视频下载 编辑:程序博客网 时间:2024/06/08 05:11

数据结构(C语言版)学习笔记!

线性表的顺序存储结构在逻辑关系上相邻的两个元素在物理位置上也相邻,存储位置可以用一个公式来表示。

弱点:插入或删除操作时需要大量移动元素

线性链表:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以连续,也可以是不连续的)

结点(node):包括数据域和指针域

数据域:其中存储数据元素信息的域

指针域:其中存储直接后继存储位置的域,指针域存储的信息称作指针

链表:n个结点链结成一个链表(线性表的链式存储结构);由于每个结点又只有一个指针域,故又称线性链表单链表

头指针:头指针指示链表中第一个结点(第一个数据元素的存储映像)的存储位置

NULL:最后一个数据元素没有直接后继,其指针称为“空”(NULL)

 

单链表可由头指针唯一确定,在C语言中用“结构指针”来描述

//---------线性表的单链表存储结构------------------typedef struct LNode{ElemType data;struct Lnode *next;}LNode,*LinkList;

其中LinkList存储链表的头结点。

#include<stdio.h>#define ElemType int #define Status bool #define OK 1#define ERROR 0//---------线性表的单链表存储结构----------typedef struct LNode{ElemType data;struct LNode *next;}LNode,*LinkList;//取i结点的数据元素Status GetElem_L(LinkList L,int i,ElemType &e){LinkList p;int j;//L为带头结点的单链接表的头指针//当第i个元素存在时,其值赋给e并返回OK,否则返回ERRORp=L->next;j=1;//初始化,P指向第一个节点,j为计数器while(p&&j<i)//顺指针向后查找,知道p指向第i个元素或p为空{p=p->next;++j;}if(!p||j>i)return ERROR;//第i个元素不存在e=p->data;return OK;}//GetElem_L//插入元素Status ListInsert_L(LinkList L,int i,ElemType e){LinkList p,s;int j;//在带头结点的单链线性表L中第i个位置之前插入元素ep=L;j=0;while(p&&j<i-1){p=p->next;++j;}//寻找第i-1个结点if(!p||j>i-1)return ERROR;//i小于1或者大于表长加1s=(LinkList)malloc(sizeof(LNode));//生成新结点s->data=e;s->next=p->next;//插入L中p->next=s;return OK;}//ListInsert_L//删除元素Status ListDelete_L(LinkList L,int i,ElemType &e){LinkList p,q;int j;//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值p=L;j=0;while(p->next&&j<i-1)//寻找第i个结点,并令p指向其前驱{p=p->next;++j;}if(!(p->next)||(j>i-1))return ERROR;//删除位置不合理q=p->next;p->next=q->next;//删除并释放结点e=q->data;free(q);return OK;}//ListDelete_Lvoid CreateList_L(LinkList &L,int n){LinkList p;int i;// 逆位序输入n个元素的值,建立带表头结点的单链线性表LL=(LinkList)malloc(sizeof(LNode));L->next=NULL;//先建立一个带头结点的单链表for(i=n;i>0;--i){p=(LinkList)malloc(sizeof(LNode));//生成新结点scanf(&p->data);p->next=L->next;L->next=p;//插入到表头}}void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){LinkList pa,pb,pc;//已知单链线性表La和Lb的元素按值非递减排列//归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列pa=La->next;pb=Lb->next;Lc=pc=La;//用La的头结点作为Lc的头结点while(pa&&pb){if(pa->data<=Pb->next){pc-next=pa;pc=pa;pa=pa->next;}else{pc-next=pb;pc=pb;pb=pb->next;}}pc->next=pa?pa:pb//插入剩余段free(Lb);}//MergeList_L



 

 

 

0 0
原创粉丝点击