不带头结点的单链表C实现代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//without head node
#include "LinkList.h"

void ElemCpy( ElemType *a,ElemType *b )
{
a->a = b->a;
strcpy( a->b, b->b );
//*a = *b;
}

Status ElemCmp( ElemType *a, ElemType *b )
{
if( a->a == b->a && strcmp( a->b, b->b ) == 0 ) return 0;
else return -1;
}

Status InitList_L( LinkList *L )
{
*L = NULL;
return OK;
}

size_t GetLength( LinkList L )
{
size_t i = 0;
LinkList p = L;
while( p != NULL ){
p = p->next;
i++;
}
return i;
}

Status InsertElem_L( LinkList *L, size_t i, ElemType e )//不带头结点的链表插入时要特别针对第一个结点
{
LinkList s;
if( i == 1 ) { //要插入第一个结点位置
s = (LinkList)malloc( sizeof( LNode ) );
ElemCpy( &( s->data ), &e );
s->next = *L;
*L = s;
return OK;
}

size_t j = 1;
LinkList pre = *L;
while( pre != NULL && j < i-1 ) {
j++;
pre = pre->next;
}
if( pre == NULL || i < 1 ) return ERROR; //i < 1 或者 i > length + 1

s = (LinkList)malloc( sizeof( LNode ) );
ElemCpy( &( s->data ), &e );
s->next = pre->next;
pre->next = s;
return OK;
}

Status DeleteElem_L( LinkList *L, size_t i, ElemType *e )//不带头结点的链表删除时要特别针对第一个结点
{
LinkList pre = *L;
if( *L == NULL ) return ERROR;
if( i == 1 ) { //删除第一个元素
ElemCpy( e, &( (*L)->data ) );
*L = (pre)->next;
free( pre );
return OK;
}

size_t j = 1;
while( pre != NULL && j < i-1 ) {//p指向要删除结点的前一个结点
j++;
pre = pre->next;
}
if( pre == NULL || pre->next == NULL || i < 1 ) return ERROR;//i>length 或者i < 1

LinkList temp = pre->next; //temp要删除的结点
pre->next = temp->next;
ElemCpy( e, &(temp->data) );
free( temp );
return OK;
}

Status GetElem( LinkList L, size_t i, ElemType *e )
{
size_t j = 1;
LinkList p = L;
while( p != NULL && j < i ) {
j++;
p = p->next;
}
if( p == NULL || i < 1 ) return ERROR;
ElemCpy( e, &( p->data ) );
return OK;
}


void printArray( ElemType *E, size_t length )
{
size_t i;
for( i = 0; i < length; i++ )
printf( "%d\t%s\n", E[i].a,E[i].b );
}

void printLinkList( LinkList L )
{
LinkList p = L;
while( p != NULL ) {
printf("%d\t%s\n", p->data.a, p->data.b );
p = p->next;
}
}

相关文档
最新文档