您的位置:首页 > 理论基础 > 数据结构算法

基础数据结构--线性表链式实现

2015-09-19 17:18 399 查看
以下代码为线性表的链式实现,在VS2012下测试通过。代码比较简单,所以注释只是标明了函数功能,如果有错误之处还请不吝赐教。

#include <stdio.h>
#include <stdlib.h>

//链表元素结构体
typedef struct listEle
{
int data;
struct listEle *next;
}listEle;

//链表结构体
typedef struct list
{
listEle *head;
int length;
}list;

//构造一个新的链表
list* createList()
{
list *l = (list*)malloc(sizeof(list));
l -> head = NULL;
l -> length = 0;
return l;
}

//清空链表
int clearList(list *&l)
{
if(!l) return -1;
listEle *temp = l->head;
listEle *tempNext = NULL;
int i = 0;
for(;i<l->length && temp; ++i)
{
tempNext = temp->next;
free(temp);
temp = tempNext;
}
l->head = NULL;
l->length = 0;
temp = NULL;
tempNext = NULL;
return 1;
}

//销毁链表(l指针变为空指针)
void destroyList(list *&l)
{
if(!l) return ;
clearList(l);
free(l);
l = NULL;
return ;
}

//获取链表长度
int getLength(list *l)
{
if(!l) return -1;
return l->length;
}

//判断链表是否为空
int isEmpty(list *l)
{
if(!l) return -1;
return l == NULL ? 0 :1;
}

//指定位置插入新元素
int insertElem(list *&l, int index, int *e)
{
if(!l)
{
if(index != 0) return -1;
l = createList();
}
if(index < 0 || index > l->length || !e) return -1;
listEle *temp = l->head;
listEle *newEle = (listEle*)malloc(sizeof(listEle));
newEle->data = *e;
int i = 0;
for(;i < index -1 && temp; ++i, temp = temp->next);
if(i == index -1)
{
if(temp->next) newEle ->next = temp->next->next;
else newEle->next = NULL;
temp->next = newEle;
++ (l->length);
return 1;
}
else if(index == 0)
{
newEle->next = l->head;
l->head = newEle;
++ (l->length);
return 1;
}
return -1;
}

//在链表后添加新元素
int appendElem(list *&l, int *e)
{
if(!l) l = createList();
listEle *temp = l->head;
listEle *newEle = (listEle*)calloc(1,sizeof(listEle));
newEle -> data = *e;
newEle -> next = NULL;
int i = 0;
for(;i < l->length -1 && temp; ++i, temp = temp->next);
if(l->length == 0)
{
l->head = newEle;
++(l->length);
return 1;
}
else if(i == l->length -1)
{
temp -> next = newEle;
++ (l->length);
return 1;
}
return -1;
}

//打印链表各个元素
void showList(list *l)
{
if(!l)
{
printf("Error: list not exist!\n");
return;
}
if( !l->head || l->length == 0)
{
printf("empty list\n");
return;
}
listEle *temp = l->head;
int i = 0;
for(; i<l->length ; ++i)
{
printf("%d ",temp->data);
temp = temp->next;
}
printf("\n");
return ;
}

//删除指定位置元素
int deleteElem(list *&l, int index)
{
if(!l || !l->head || l->length == 0) return -1;
if(index < 0 || index >= l->length) return -1;
listEle *temp = l->head;
listEle *deleteEle = NULL;
int i = 0;
for(;i<index -1 && temp; ++i, temp = temp->next);
if(i == index -1)
{
deleteEle = temp->next;
if(!deleteEle) return -1;
temp->next = deleteEle->next;
free(deleteEle);
deleteEle = NULL;
-- l->length;
return 1;
}
else if(index == 0)
{
deleteEle = l->head;
l->head = deleteEle->next;
free(deleteEle);
deleteEle = NULL;
-- l->length;
return 1;
}
return -1;
}

//获取链表指定位置元素值
int getElem(list *l, int index, int *&e)
{
if(!l || !l->head || l->length == 0) return -1;
if(index <0 || index >= l->length) return -1;
listEle *temp = l->head;
int i = 0;
for(;i<index && temp; ++i, temp = temp->next);
if(i == index)
{
e = (int*) malloc(sizeof(int));
*e = temp -> data;
return 1;
}
e = NULL;
return -1;
}

//在指定位置后查找某一特定元素的位置
int findElem(list *l, int start, int *e)
{
if(!l || !l->head || l->length == 0) return -1;
if(start < 0 || start >= l->length) return -1;
listEle *temp = l->head;
int i = 0;
for(; i<start && temp; ++i, temp = temp->next);
if(i == start)
{
for(;i<l->length && temp; ++i, temp = temp->next)
{
if(temp ->data == *e) return i;
}
return -2;
}
return -1;

}

//获取某一特定元素前驱
int getPriorElem(list *l, int *e, int *&prior)
{
if(!l || !l->head || l->length == 0 || !e) return -1;
listEle *temp = l->head;
while(temp)
{
if(temp->next)
{
if(temp->next->data == *e)
{
prior = (int*)malloc(sizeof(int));
*prior = temp -> data;
return 1;
}
}
temp = temp->next;
}
prior = NULL;
return -2;
}

//获取某一特定元素后继
int getNextElem(list *l, int *e, int *&next)
{
if(!l || !l->head || l->length == 0 || !e) return -1;
listEle *temp = l->head;
while(temp)
{
if(temp->data == *e)
{
if(temp->next)
{
next = (int*)malloc(sizeof(int));
*next = temp->next->data;
return 1;
}
next = NULL;
return -2;
}
temp = temp->next;
}
next = NULL;
return -2;
}

int main()
{
list *l = (list*)calloc(1,sizeof(list));
l -> head = NULL;
int e = 1;
showList(l);
insertElem(l,0,&e);
e = 3;
insertElem(l,1,&e);
showList(l);
e = 4;
insertElem(l,4,&e);
showList(l);
e = 10;
insertElem(l,2,&e);
e = 99;
insertElem(l,3,&e);
showList(l);

int length = getLength(l);
printf("list length: %d\n", length);
e = 203;

appendElem(l,&e);
showList(l);

int *s;
getElem(l,3,s);
printf("get answer: %d\n",*s);
free(s);

int ind = findElem(l,2,&e);
printf("find answer: %d\n",ind);

getPriorElem(l,&e,s);
printf("prior answer: %d\n", *s);
free(s);

e = 1;
getNextElem(l,&e,s);
printf("prior answer: %d\n", *s);
free(s);

clearList(l);
showList(l);
destroyList(l);
showList(l);
free(l);
getchar();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息