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

线性表的链式结构实现

2016-01-22 22:54 363 查看
/* 6 线性表的链式结构实现 */

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

typedef int TYPE;//定义数据类型别名

//声明结点结构体
typedef struct Node
{
TYPE data;//存储结点数据
struct Node* next;//指向下一节点
}Node;

//声明链表结构体
typedef struct
{
Node* head;//头指针
int length;//链表长度
}lineList;

/*对单链表的操作*/
bool init(lineList* list);//链表初始化

bool input(lineList* list,int pos,TYPE elem);//插入操作

/*因为使用了c++编译器,所以在delete后面加了1*/
TYPE delete1(lineList* list,int pos);//删除操作

int length(lineList* list);//链表长度

void traverse(lineList* list);//遍历操作

int search(lineList* list,TYPE elem);//查询指定元素的位置

void clear(lineList* list);//链表清空

void destroy(lineList* list);//销毁链表

int main()
{
lineList list;
//初始化测试
bool flag=init(&list);
if(flag)
printf("初始化成功!\n");
else
printf("初始化失败!\n");

for(int i=0;i<6;i++)	//循环测试6次
{
//插入操作测试
printf("输入插入的位置:");
int pos=0;
scanf("%d",&pos);
printf("输入插入的数值:");
TYPE elem=0;
scanf("%d",&elem);
flag=input(&list,pos,elem);
if(flag)
printf("插入成功!\n");
else
printf("插入位置不合法,插入失败!\n");

//遍历操作测试
printf("遍历链表:");
traverse(&list);
//链表长度测试
printf("链表的长度为:%d\n",length(&list));

//搜索链表
printf("输入要搜素的元素:");
scanf("%d",&elem);
pos=search(&list,elem);
if(pos!=-1)
printf("元素%d在链表的第%d个位置\n",elem,pos);
else
printf("不存在,查找失败!\n");

//删除操作测试
printf("输入要删除的位置:");
scanf("%d",&pos);
elem=delete1(&list,pos);
if(elem!=-1)
printf("删除的元素是:%d\n",elem);
else
printf("删除位置不合法或者链表已空,删除失败!\n");
printf("删除后遍历链表:");
traverse(&list);
printf("删除后链表的长度为:%d\n",length(&list));
}

//清空链表
clear(&list);
printf("清空后遍历链表:");
traverse(&list);

//销毁链表
destroy(&list);
return 0;
}

//链表初始化
bool init(lineList* list)
{
Node* p=(Node*)malloc(sizeof(struct Node));
if(p)
{
p->next=NULL;
list->head=p;
list->length=0;
return true;
}
else
return false;
}

//插入操作
bool input(lineList* list,int pos,TYPE elem)
{
if(pos>0&&pos<=length(list)+1)
{
Node* p=(Node*)malloc(sizeof(struct Node));
if(p)
{
p->data=elem;
Node* q=list->head;
for(int i=1;i<pos;i++)
{
q=q->next;
}
p->next=q->next;
q->next=p;
list->length++;
return true;
}
else
return false;
}
else
return false;
}

//删除操作
TYPE delete1(lineList* list,int pos)
{
if(0!=length(list)&&pos>0&&pos<=length(list))
{
Node* p=list->head;
for(int i=1;i<pos;i++)
{
p=p->next;
}
Node* q=p->next;
TYPE elem=q->data;
p->next=p->next->next;
free(q);
q=NULL;
list->length--;
return elem;
}
else
return -1;//返回-1代表删除失败
}

//链表长度
int length(lineList* list)
{
return list->length;
}

//遍历链表
void traverse(lineList* list)
{
Node* p=list->head->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}

//搜索链表
int search(lineList* list,TYPE elem)
{
Node* p=list->head->next;
int pos=0;
while(p)
{
if(p->data==elem)
{
break;
}
else
{
pos++;
p=p->next;
}
}
if(pos==length(list))
return -1;
else
return pos+1;
}

//清空链表
void clear(lineList* list)
{
destroy(list);
init(list);
}

//销毁链表
void destroy(lineList* list)
{
Node* p=list->head->next;
while(length(list))
{
Node* q=p;
p=p->next;
free(q);
q=NULL;
list->length--;
}
free(list->head);
list->head=NULL;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息