问题及代码:
/*
*烟台大学计算机与控制工程学院
*作 者:杨宁
*完成日期:2015年9月21日
*问题描述:算法库包括三个文件:
*头文件:linklist.h,包含定义顺序表的代码,宏定义,要实现算法的函数的声明。
*源文件:linklist.cpp,包含实现各种算法的函数的定义。
*主函数:main.cpp。
*/
#include <stdio.h>
#include <malloc.h>
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 DestroyList(LinkList *&L); //销毁单链表
void DispList(LinkList *L); //输出单链表
void InitList(LinkList *&L);//初始化单链表
bool ListEmpty(LinkList *L);//判断线性表是否为空表
int ListLength(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);//删除数据元素
#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;
L->next=s;
}
}
void CreateListR(LinkList *&L,ElemType a[],int n)//尾插法建立单链表
{
LinkList *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 InitList(LinkList *&L)//初始化单链表
{
L=(LinkList *)malloc(sizeof(LinkList)); //创建头结点
L->next=NULL;
}
void DestroyList(LinkList *&L)//销毁单链表
{
LinkList *pre=L,*p=L->next;
while(p!=NULL)
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
bool ListEmpty(LinkList *L)//判断线性表是否为空表
{
return(L->next==NULL);
}
int ListLength(LinkList *L)//求线性表的长度
{
int n=0;
LinkList *p=L;
while(p->next!=NULL)
{
n++;
p=p->next;
}
return(n);
}
void DispList(LinkList *L)//输出单链表
{
LinkList *p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
bool GetElem(LinkList *L,int i,ElemType &e)//求线性表中某个数据的元素值
{
int j=0;
LinkList *p=L;
while(j<i&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return false;
else
{
e=p->data;
return true;
}
}
int LocateElem(LinkList *L,ElemType e)//按元素值查找
{
LinkList *p=L->next;
int n=1;
while (p!=NULL && p->data!=e)
{
p=p->next;
n++;
}
if (p==NULL)
return(0);
else
return(n);
}
bool ListInsert(LinkList *&L,int i,ElemType e)//插入数据元素
{
int j=0;
LinkList *p=L,*s;
while (j<i-1 && p!=NULL) //查找第i-1个结点
{
j++;
p=p->next;
}
if (p==NULL) //未找到位序为i-1的结点
return false;
else //找到位序为i-1的结点*p
{
s=(LinkList *)malloc(sizeof(LinkList));//创建新结点*s
s->data=e;
s->next=p->next; //将*s插入到*p之后
p->next=s;
return true;
}
}
bool ListDelete(LinkList *&L,int i,ElemType &e)//删除数据元素
{
int j=0;
LinkList *p=L,*q;
while (j<i-1 && p!=NULL) //查找第i-1个结点
{
j++;
p=p->next;
}
if (p==NULL) //未找到位序为i-1的结点
return false;
else //找到位序为i-1的结点*p
{
q=p->next; //q指向要删除的结点
if (q==NULL)
return false; //若不存在第i个结点,返回false
e=q->data;
p->next=q->next; //从单链表中删除*q结点
free(q); //释放*q结点
return true;
}
}
#include"linklist.h"
int main()
{
LinkList *L;
InitList(L);
ListInsert(L, 1, 15);
ListInsert(L, 1, 10);
ListInsert(L, 1, 5);
ListInsert(L, 1, 20);
DispList(L);
DestroyList(L);
return 0;
}
运行结果:
知识点及总结:
用到了程序的多文件组织,线性表的基础算法。
包括初始化线性表LinkList(L),头插法尾插法建表CreateListF(),销毁线性表DestoryList(L),判断线性表是否为空表ListEmpty(L),求线性表的长度ListLength(L),输出线性表DispList(L),求线性表中某个数据的元素值GetList(L),按元素值查找LocateList(L),插入数据元素ListInset(L,i,e),删除数据元素ListDelete(L,i,e)。
学习心得:
虽然用到了许多算法,可还是对这些算法掌握不熟练,需要再练。
本文介绍了使用C语言实现单链表的各种基本操作,包括初始化、建立、销毁、查询、插入和删除等,并通过示例代码展示了如何进行单链表的操作。
250

被折叠的 条评论
为什么被折叠?



