基础数据结构--线性表链式实现
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;
}
#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;
}
相关文章推荐
- 应用领航:盘点那些年我们一起追过的OS
- 无奇不有!盘点各国自己开发的操作系统
- Lua教程(七):数据结构详解
- 可自定义oem的萝卜家园 Ghost XP 新春装机版 V200801 下载
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构揭秘一
- C#实现判断操作系统是否为Win8以上版本
- 数据结构之Treap详解
- JavaScript数据结构和算法之图和图算法
- Linux操作系统添加新硬盘方法
- java如何获取本地操作系统进程列表
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Linux rdesktop操作系统下远程登录Windows XP桌面
- 32位操作系统认出超出4G内存的方法
- Linux rpm tar 操作系统下软件的安装与卸载方法
- JavaScript 获取用户客户端操作系统版本
- jsp 获取客户端的浏览器和操作系统信息
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈