链表的定义:
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
链表:
include
include
include
include
include
define TRUE 1
define FALSE 0
define OK 1
define ERROR 0
define OVERFLOW -2
typedef int Status;
typedef int Boolean;
typedef int ElemType;
struct LNode
{
ElemType data;
struct LNode *next;
};
typedef struct LNode *LinkList;
void InitList(LinkList *L)//构建空链表
{
(*L)=(LinkList)malloc(sizeof(struct LNode));
if(!L)
exit(OVERFLOW);
(*L)->next=NULL;
}
void DestroyList(LinkList *L)//摧毁链表
{
LinkList q;
while(L)
{
q=(*L)->next;
free(L);
*L=q;
}
}
Status GetElem(LinkList L,int i,ElemType *e) //搜索
{
int j=1;
LinkList p=L->next;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return ERROR;
*e=p->data;
return OK;
}
Status ListInsert(LinkList *L,int i,ElemType e) //插入
{
LinkList p=*L;int j=0;
while(p&&j<i-1)
{
p=p->next,j++;
}
if(!p||j>i-1)
return ERROR;
LinkList s;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;s->next=p->next;
p->next=s;
return OK;
}
Status ListDelete(LinkList *L,int i,ElemType *e)//删除
{
LinkList p=*L;int j=0;
while(p->next&&j<i-1)
{
p=p->next;
++j;
}
if(!(p->next)||j>i-1)
return ERROR;
LinkList q;
q=p->next;p->next=q->next;
*e=q->data;free(q);
return OK;
}
void ListTraverse(LinkList L)
{
LinkList p=L->next;
while(p)
{
printf("%3d",p->data);
p=p->next;
}
printf("\n");
}
void main()
{
LinkList L;
ElemType e;
Status i;
int j;
InitList(&L);
for(j=1;j<=5;j++)
i=ListInsert(&L,1,j);
printf("在L的表头依次插入1~5后:L=");
ListTraverse(L);
GetElem(L,4,&e);
printf("第4个元素的值为:%d\n",e);
i=ListDelete(&L,4,&e);
if(i==ERROR)
printf("删除元素失败\n");
else
printf("删除元素成功,其值为:%d\n",e);
printf("依次输出L的元素:");
ListTraverse(L);
DestroyList(&L);
}
链表如何分配内存:
调用malloc动态分配内存。
树(二叉树)的定义:
树(Tree)是 n(n≥0)个相同类型的数据元素的有限集合。
树的种类:
满二叉树、完全二叉树,非完全二叉树。