使用单链表实现线性表时,应该特别注意插入和删除操作。
#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;
}
插入,删除操作中都应该寻找插入或删除位置的前一个位置,因为插入或删除元素后要相应的修改其指针。但是删除操作有一点和插入操作不一样,删除位置的元素必须存在。