线性链表实现注意事项
来源:互联网 发布:一条sql删除 重复数据 编辑:程序博客网 时间:2024/06/02 18:58
使用单链表实现线性表时,应该特别注意插入和删除操作。
#define OK 0
#define ERROR 1
#define OVERFLOW 1
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode *next;
}LNode, *LinkList;
//在含头节点单链表list中第insertIndex个位置之前插入新的数据元素insertElement,list的长度加1
status linkListInsert(LinkList list, int insertIndex, ElemType insertElement)
{
int index;
LNode *p;
LNode *q;
//寻找第insertIndex个元素的前驱,p指向其前驱
for(index=0, p=list; index<insertIndex-1 && p!=NULL; ++index, p=p->next)/*空语句*/;
//p===NULL表示insertIndex>链表list的长度+1,index>insertIndex-1表示insertIndex<1
if(p==NULL || index>insertIndex-1)
{
printf("Invalid index!/n");
return ERROR;
}
q = (LNode *)malloc(sizeof(LNode));
if(q == NULL)
{
printf("Overflow/n");
exit(OVERFLOW);
}
//元素q为要添加的元素,元素p为要添加元素的前驱
q->data = insertElement;
q->next = p->next;
p->next = q;
return OK;
}
//删除线性表list中第deleteIndex个数据元素,并用deletedElement返回其值,list的长度减1
status linkListDelete(LinkList list, int deleteIndex, ElemType *deletedElement)
{
int index;
//p指向第deleteIndex个数据元素
LNode *p;
//q始终指向p的前驱
LNode *q;
//寻找第deleteIndex个元素,p指向该元素,q指向其前驱
for(index=1, q=list, p=list->next; index<deleteIndex && p!=NULL; ++index, q=p, p=p->next)/*空语句*/;
//p===NULL表示deleteIndex>链表list的长度,index>deleteIndex表示deleteIndex<1
if(p==NULL || index>deleteIndex)
{
printf("Invalid index!/n");
return ERROR;
}
//p指向要删除的元素,q指向其前驱
q->next = p->next;
//用deletedElement返回删除的元素
*deletedElement = p->data;
free(p);
return OK;
}
插入,删除操作中都应该寻找插入或删除位置的前一个位置,因为插入或删除元素后要相应的修改其指针。但是删除操作有一点和插入操作不一样,删除位置的元素必须存在。
#define OK 0
#define ERROR 1
#define OVERFLOW 1
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode *next;
}LNode, *LinkList;
//在含头节点单链表list中第insertIndex个位置之前插入新的数据元素insertElement,list的长度加1
status linkListInsert(LinkList list, int insertIndex, ElemType insertElement)
{
int index;
LNode *p;
LNode *q;
//寻找第insertIndex个元素的前驱,p指向其前驱
for(index=0, p=list; index<insertIndex-1 && p!=NULL; ++index, p=p->next)/*空语句*/;
//p===NULL表示insertIndex>链表list的长度+1,index>insertIndex-1表示insertIndex<1
if(p==NULL || index>insertIndex-1)
{
printf("Invalid index!/n");
return ERROR;
}
q = (LNode *)malloc(sizeof(LNode));
if(q == NULL)
{
printf("Overflow/n");
exit(OVERFLOW);
}
//元素q为要添加的元素,元素p为要添加元素的前驱
q->data = insertElement;
q->next = p->next;
p->next = q;
return OK;
}
//删除线性表list中第deleteIndex个数据元素,并用deletedElement返回其值,list的长度减1
status linkListDelete(LinkList list, int deleteIndex, ElemType *deletedElement)
{
int index;
//p指向第deleteIndex个数据元素
LNode *p;
//q始终指向p的前驱
LNode *q;
//寻找第deleteIndex个元素,p指向该元素,q指向其前驱
for(index=1, q=list, p=list->next; index<deleteIndex && p!=NULL; ++index, q=p, p=p->next)/*空语句*/;
//p===NULL表示deleteIndex>链表list的长度,index>deleteIndex表示deleteIndex<1
if(p==NULL || index>deleteIndex)
{
printf("Invalid index!/n");
return ERROR;
}
//p指向要删除的元素,q指向其前驱
q->next = p->next;
//用deletedElement返回删除的元素
*deletedElement = p->data;
free(p);
return OK;
}
插入,删除操作中都应该寻找插入或删除位置的前一个位置,因为插入或删除元素后要相应的修改其指针。但是删除操作有一点和插入操作不一样,删除位置的元素必须存在。
- 线性链表实现注意事项
- 线性表以及几个注意事项
- 线性表-链表实现
- 类实现线性链表
- 线性链表 java实现
- java实现线性链表
- C++实现线性链表
- 线性结构--->线性表实现
- 线性表—由链表实现
- java 链表实现线性表
- 3.静态链表实现 线性表
- JAVA 实现线性表之链表
- 线性表--使用链表实现
- 线性表-链式实现-循环链表
- 线性表-链式实现-双向链表
- 链表实现的线性表
- 【数据结构】线性表(链表实现)
- 线性表的链表实现
- 计算机英语
- 呵呵,才发现Google 企业应用套件和服务
- 备份数据库日志压缩数据库
- 用ADO向excel批量导入数
- 多年开发Oracle,积累的Oracle基础函数库。(转载)
- 线性链表实现注意事项
- 新奇家居用品 The Wellness Skull 骷髅小床[多图]
- 什么是lib文件,lib和dll的关系如何
- acm pku 2234 解题报告(取子问题)
- ConcurrentHashMap原理分析
- 智能ABC你真的会用吗?[转]
- LAN网络故障时的简单排除方法
- ASP菜鸟程序员的城战国之路
- 使用PLSQL Developer时,“ORA-12154: TNS:无法解析指定的连接标识符”问题的解决方法