问题与代码
/*
*Copyright (c) 2015,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:linlist.h,main.cpp,zdy.cpp
*作者:陈梦萍
*完成日期:2015年10月5日
*版本号:v1.0
*
*问题描述: 建立单链表数据存储结构基本操作的算法库。
*输入描述:无
*程序输出:若干数据
*/
//linlist.h
#include<iostream>
#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 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);
//main.cpp
#include"linlist.h"
int main()
{
ElemType a;
LinkList *L;
InitList(L);
ListInsert(L, 1, 15);
ListInsert(L, 1, 10);
ListInsert(L, 1, 5);
ListInsert(L, 1, 20);
printf("表长度:%d\n", ListLength(L));
if(GetElem(L, 3, a))
printf("找到了第3个元素值为:%d\n", a);
else
printf("第3个元素超出范围!\n");
printf("找到了,值为20的元素是第 %d 个\n", LocateElem(L, 20));
DispList(L);
DestroyList(L);
return 0;
}
//zdy.cpp
#include "linlist.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));
L->next=NULL;
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 *p=L,*q=p->next;
while (q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
//判断是否为空表
bool ListEmpty(LinkList *L)
{
return(L->next==NULL);
}
//求线性表的长度
int ListLength(LinkList *L)
{
LinkList *p=L;
int i=0;
while (p->next!=NULL)
{
i++;
p=p->next;
}
return(i);
}
//输出线性表
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)
{
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,*q;
while (j<i-1 && p!=NULL)
{
j++;
p=p->next;
}
if (p==NULL)
return false;
else
{
q=p->next;
if (q==NULL)
return false;
e=q->data;
p->next=q->next;
free(q);
return true;
}
}
运行结果
知识点总结
源代码中,进行了链表的插入,删除,求长度,求数值等多个运算的算法,但在main函数中没有使用,所以,小小修改了一下main函数,调用了求表长度 及数值的几个算法。