线性链表(单链表)

来源:互联网 发布:node.js 构建工具 编辑:程序博客网 时间:2024/06/03 14:26

/******************************************************************

线性表的单链表存储结构

******************************************************************/

typedef struct LNode{

ElemType  data; //结点的数据域

struct LNode*next;//结点的指针域

}LNode, *LinkList;


/******************************************************************

 取链表中的某个元素的函数GetElem函数实现

******************************************************************/


Status GetElem_L(LinkList L, int i, ElemType &e){

// L为带头结点的单链表的头指针

// 当第i个元素存在时,其赋值给e并返回OK,否则返回ERROR

p = 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;// 取第i个元素

return OK;

}//GetElem_L

/******************************************************************

 单链表中的插入实现函数ListInsert_L

******************************************************************/

Status ListInsert_L(LinkList & L, int i, ElemType e){

// 在带头结点的单链表L中第i个位置之前插入元素e

p = L; j = 0;

while(p && j < i -1){ p = p -> next; ++j; }// 寻找第i - 1个结点

if( !p || j > i - 1)return ERROR;// i小于1或者大于表长+1

s = (LinkList)malloc(sizeof(LNode));// 生成新结点

s->data = e;s->next = p->next;// 插入L中

p->next = s;

return OK;

} // ListInsert_L

/******************************************************************

 单链表中的删除实现函数ListDelete_L

******************************************************************/

Status ListDelete_L(LinkList &L, int i, ElemType &e){

// 带头结点的单链表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_L

/******************************************************************

 从表尾到表头逆向建立单链表的实现CreateList_L

******************************************************************/

int CreateList_L(LinkList &L, int n){

// 逆位序输入n个元素的值,建立带表头结点的单链表L

L = (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;// 插入到表头

}

} // CreateList_L




0 0