您的位置:首页 > 其它

第四周项目-2建设“单链表”算法库

2016-09-22 11:26 337 查看
问题描述及代码:

opyright (t) 2016,烟台大学计算机学院

*All rights reserved.

*文件名称:1.cpp

*作者:王智超

*完成日期:2016年9月22日

*版本号:v1.0

*问题描述:建立单链表"算法库",实现单链表的基本运
<pre name="code" class="cpp">#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED

typedef int ElemType;
typedef struct LNode        //定义单链表结点类型
{
ElemType data;
struct LNode *next;     //指向后继结点
}LinkList;
void CreateListF(LinkList *&L,ElemType a[],int n);//头插法建立单链表
void CreateListR(LinkList *&L,ElemType a[],int n);//尾插法建立单链表
void InitList(LinkList *&L);  //初始化线性表
void DestroyList(LinkList *&L);  //销毁线性表
bool ListEmpty(LinkList *L);  //判断线性表是否为空
int ListLength(LinkList *L);  //求线性表长度
void DispList(LinkList *L);  //输出线性表
bool GetElem(LinkList *L,int i,ElemType &e);  //求线性表某个数据元素值
int LocateElem(LinkList *L,ElemType e);  //按元素值查找
bool ListInsert(LinkList *&L,int i,ElemType e);  //插入数据元素
bool ListDelete(LinkList *&L,int i,ElemType &e);  //删除数据元素

#endif // LINKLIST_H_INCLUDED


linklist.cpp:

#include <stdio.h>
#include <malloc.h>
#include "linklist.h"
void CreateListF(LinkList *&L,ElemType a[],int n)//头插法建立单链表
{
LinkList *s;
int i;
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
for(i=0;i<n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
s->next=L->next; //s指针域指向原来L的后继节点
L->next=s; //L的指针域指向新插入的s
}
}
void CreateListR(LinkList *&L,ElemType a[],int n)//尾插法建立单链表
{
LinkList *s,*r; //头指针*s与增加的尾指针*r
int i;
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
for(i=0;i<n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL; //到尾
}
void DestroyList(LinkList *&L) //销毁单链表
{
LinkList *pre=L,*p=L->next;
while(p!=NULL)
{
free(pre); //释放*pre节点
pre=p;
p=pre->next; //“跟随”,同步后移
}
free(pre); //循环结束时pre已指向尾节点,释放尾节点,完成销毁
}
void DispList(LinkList *L) //输出单链表
{
LinkList *p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void InitList(LinkList *&L) //初始化单链表(即创建一个头节点)
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
bool ListEmpty(LinkList *L) //判断单链表是否为空表
{
return (L->next!=NULL);
}
int ListLength(LinkList *L) //求单链表长度
{
int length=0;
LinkList *p=L; //长度初始化为0,p指向头节点
while(p->next!=NULL)
{
length++;
p=p->next;
}
return length;
}
bool GetElem(LinkList *L,int i,ElemType &e) //求线性表中某个数据元素值
{
int j=0;
LinkList *p=L; //p指向头节点,j(头节点序号)置0
while(j<i && p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL) //不存在第i个数据节点,返回false
return false;
else //存在第i个数据节点,返回true
{
e=p->data;
return true;
}
}
int LocateElem(LinkList *L,ElemType e) //按元素值查找元素
{
int i=1;
LinkList *p=L->next; //p指向头节点,i(头节点序号)置1
while(p!=NULL && p->data!=e) //查找data值为e的节点,其序号为i
{
p=p->next;
i++;
}
if(p==NULL) //不存在元素值为e的节点,返回0
return 0;
else //存在元素值为e的节点,返回逻辑序号i
return i;
}
bool ListInsert(LinkList *&L,int i,ElemType e) //插入数据元素
{
int j=0;
LinkList *p=L,*s; //p指向头节点,j(头节点序号)置0
while(j<i && p!=NULL) //遍历查找第i-1个节点
{
j++;
p=p->next;
}
if(p==NULL) //未找到此节点,无法插入
{
return false;
}
else
{
s=(LinkList *)malloc(sizeof(LinkList)); //能插入,分配节点空间
s->data=e; //创建新节点,并保存数据
s->next=p->next;
p->next=s; //更改指针域,完成插入
return true;
}
}
bool ListDelete(LinkList *&L,int i,ElemType &e) //删除数据元素
{
int j=0;
LinkList *p=L,*s;
while(j<i && p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
{
return false;
}
else
{
s=p->next; //s指向第i个节点
if(s==NULL) //第i个节点不存在,无法删除
return false;
else
{
e=s->data;
p->next=s->next; //删除*q节点
free(s); //释放*q节点
return true; //成功删除第i个节点
}
}
}


main.cpp:
#include <stdio.h>
#include <malloc.h>
#include "linklist.h"
int main()
{
LinkList *L;
ElemType a[8]= {7, 9, 8, 2, 0, 4, 6, 3};
ElemType e;
int i;

InitList(L);
printf("该表已被初始化\n");
if(ListEmpty(L))
printf("该表为非空表\n");
else
printf("该表为空表\n");

CreateListF(L, a, 8);
printf("头插法建表结果:");
DispList(L);
if(ListEmpty(L))
printf("该表为非空表\n");
else
printf("该表为空表\n");
printf("该表长度为:%d\n\n",ListLength(L));
DestroyList(L);
InitList(L);

CreateListR(L, a, 6);
printf("尾插法建表结果:");
DispList(L);
printf("该表长度为:%d\n\n",ListLength(L));

//接下来对尾插法建立的单链表进行操作
for(i=1;i<=ListLength(L)+4;i++) //测试第i个节点找到和找不到的情况
{
if(GetElem(L,i,e))
printf("找到第%d个元素,其值为:%d\n",i,e);
else
printf("第%d个元素未找到!\n",i);
}
printf("\n");

for(i=0;i<=ListLength(L)+4;i++) //测试第i个节点找到和找不到的情况
{
if(LocateElem(L,i))
printf("找到元素%d,它是表中的第%d个元素\n",i,LocateElem(L,i));
else
printf("元素%d未找到!\n",i);
}
printf("\n");

ListInsert(L,0,12); //测试成功插入和无法插入的情况
printf("插入元素12后表中各元素为:");
DispList(L);

ListInsert(L,4,15);
printf("插入元素15后表中各元素为:");
DispList(L);

ListInsert(L,8,17);
printf("插入元素17后表中各元素为:");
DispList(L);

ListInsert(L,12,26);
printf("插入元素26后表中各元素为:");
DispList(L);

ListDelete(L,0,e); //测试成功删除和无法删除的情况
printf("删除第1个节点后表中各元素为:");
DispList(L);

ListDelete(L,3,e);
printf("删除第4个节点后表中各元素为:");
DispList(L);

ListDelete(L,6,e);
printf("删除第6个节点后表中各元素为:");
DispList(L);

ListDelete(L,10,e);
printf("删除第10个节点后表中各元素为:");
DispList(L);

DestroyList(L);
return 0;
} 运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: