数据结构上机实验(编程)(单链表的基本操作)

实验目的及要求
1.熟悉线性表的基本运算在顺序存储结构上的实现;
2.以线性表的基本操作(建表、插入、删除等)的实现为重点;
3.通过本次实验帮助学生加深对C/c++ 语言的使用(特别是函数参数、数据类型的定义和数组的使用)。

不需要太难的结构,最好带上解释..需要调用函数的那种...谢谢啦

我们正在学数据结构,两星期前写好了线性表的所有基本操作,运行全部正确。包括InitList、DestoryList、ClearList、ListEmpty、ListLength、GetElem、LocateElem、PriorElem、NextElem、ListInsert、ListDelete、ListTraverse

我所编译的环境是VC++ 6.0,有三个文件linklist.h linklist.cpp main.cpp 至于怎样用你应该知道的,我就不多说了。

========================linklist.h============================
#include <iostream>
using namespace std;

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int Status;
typedef int ElemType;

//线性表的单链表存储结构
typedef struct LNode
{
ElemType data;
int len;
struct LNode * next;
}LNode,*LinkList;

void CreateList_L(LinkList &L,int n);

int ListLength(LinkList L);

Status ListInsert(LinkList & L,int i,ElemType e);

Status ListDelete(LinkList & L,int i,ElemType & e);

ElemType GetElem(LinkList L,int i);

Status EmptyList_L(LinkList L);

int LocateElem(LinkList L,ElemType e);

Status PriorElem(LinkList L,ElemType curr_e,ElemType & e);

Status NextElem(LinkList L,ElemType curr_e,ElemType & e);

Status ListTraverse(LinkList L);

Status ClearList_L(LinkList & L);

void DestoryList_L(LinkList & L);

==========================linklist.cpp=======================
#include "linklist.h"

int LISTLEN = 0;

//逆序输入n个元素的值
//创建带有头结点的线性单链表
void CreateList_L(LinkList &L,int n)
{

L = (LinkList)malloc(sizeof(LNode));
L->len = 0;
L->next = NULL;

for(int i = n;i>0;--i)
{
LinkList p = (LinkList)malloc(sizeof(LNode));
cout<<"请输入元素的值(前插):";
cin>>p->data;
p->next = L->next; //插入到表头
L->next = p;
L->len++;
LISTLEN++;
}
}

//求表长
int ListLength(LinkList L)
{
int len1=0;
LinkList p = L->next;
while(p)
{
p = p->next;
len1++;
}
return len1;
//return L->len;

}

//在链表的第i位之前插入元素e
// i 的合法位置是:1 <= i <= ListLength(L)+1
Status ListInsert(LinkList & L,int i,ElemType e)
{
if(i<1 || i>ListLength(L)+1)
{
cout<<"插入失败! 访问越界..."<<endl;
return ERROR;
}
else
{
int j;
LinkList p = L;
for(j = 0;j<i-1;j++) //for循环结束后p将指向第i-1个元素,即应该在p后插入元素e
p = p->next;
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;

L->len++;
return TRUE;
}
}

//删除链表的第i个元素,并用e返回值
//i的合法范围是:0<i<ListLength(L)+1
Status ListDelete(LinkList & L,int i,ElemType & e)
{
if(i<1 || i>ListLength(L))
{
cout<<"访问越界..."<<endl;
return ERROR;
}
else
{
LinkList p = L;
int j;
for(j = 0;j < i-1;j++) //for循环后指针p将指向要删除的元素的前驱结点
p = p->next;
e = p->next->data;
LinkList q = p->next;
p->next = q ->next;
L->len--;
free(q);

return TRUE;
}
}

//获取表中第i个元素
//i的合法取值范围是:0 < i < ListLength(L)+1
ElemType GetElem(LinkList L,int i)
{
if(i<1 || i>ListLength(L))
{
cout<<"取值非法! 链表中无此位序元素"<<endl;
return ERROR;
}
else
{
LinkList p = L;
int j;
for(j = 0;j<i;j++)
p = p->next;
return p->data;
}

}

//判断链表是否为空
Status EmptyList_L(LinkList L)
{
if(L->next == NULL)
return TRUE;
return ERROR;
}

//在链表中查找定位元素e的位序,并通过函数返回
int LocateElem(LinkList L,ElemType e)
{
int i = 0;
LinkList p = L;
while(p->next && p->next->data != e)
{
p = p->next;
i++;
}
if(p->next == NULL)
{
cout<<"在链表中找不到元素 "<<e<<endl;
return ERROR;
}

return (i+1);
}

//求当前元素curr_e的直接前驱元素,用e返回其值
Status PriorElem(LinkList L,ElemType curr_e,ElemType & e)
{
LinkList p = L;
while(p->next && curr_e != p->next->data)
p = p->next;
if(p->next == NULL)
{
cout<<"在链表中找不到元素 "<<curr_e<<" ,无法求其前驱元素!"<<endl;
return ERROR;
}
if(p == L)
{
cout<<"元素 "<<curr_e<<" 是链表中的首元元素,无前驱..."<<endl;
return ERROR;
}
e = p->data;
return OK;
}

/*
//求当前元素curr_e的直接后继元素,用e返回其值
Status NextElem(LinkList L,ElemType curr_e,ElemType & e)
{
LinkList p = L->next;
//cout<<curr_e<<endl;

//cout<<p->next->data<<endl;

if(p == NULL)
{
cout<<"链表是个空表!"<<endl;
return ERROR;
}

if(p->next == NULL)
{
cout<<"链表中只有一个元素,无后继..."<<endl;
return ERROR;
}

while(p->next && curr_e != p->data)
{
//cout<<"while"<<endl;
p = p->next;
}
cout<<"p->data = "<<p->data<<endl;

if(p->data != curr_e)
{
cout<<"111"<<endl;
cout<<"在链表中找不到元素 "<<curr_e<<" ,无法求其后继元素!"<<endl;
return ERROR;
}

if(p->next == NULL && curr_e == p->data)
{
cout<<"222"<<endl;
cout<<"元素 "<<curr_e<<" 是链表中的尾元元素,无后继..."<<endl;
return ERROR;
}
cout<<"333"<<endl;
e = p->data;
return OK;
}
*/

//求当前元素curr_e的直接后继元素,用e返回其值
Status NextElem(LinkList L,ElemType curr_e,ElemType & e)
{
LinkList p = L->next;
while(p && p->data != curr_e)
p = p->next;
if(p == L->next)
{
if(p == NULL)
{
cout<<"\n链表是一个空表,无法做取后继操作!"<<endl;
return ERROR;
}
else
{
cout<<"\n链表中只有一个元素,无法求其后继..."<<endl;
return ERROR;

}
}
if(p == NULL)
{
cout<<"\n在链表中未能找到元素: "<<curr_e<<endl;
return ERROR;
}
if(p->next == NULL)
{
cout<<"\n元素 "<<curr_e<<" 是链表的尾元元素,无法求其后继..."<<endl;
return ERROR;
}
e = p->next->data;
return OK;

}

//对链表进行遍历操作
Status ListTraverse(LinkList L)
{
LinkList p = L->next;

if(LISTLEN == 0)
{
cout<<"\n链表中除头结点以外的所有内容已被释放,是一个空表!"<<endl;
cout<<"\n遍历失败..."<<endl;
return ERROR;
}
if(LISTLEN == -1)
{
cout<<"\n所有内容已被释放,链表已被销毁!"<<endl;
cout<<"\n遍历失败..."<<endl;
return ERROR;
}
while(p != NULL)
{
cout<<p->data<<" ";
p = p->next;
}
cout<<"\n遍历成功!"<<endl;
return OK;
}

//清空链表的内容
//单链表的清空是指释放除头结点以外的内存空间
Status ClearList_L(LinkList & L)
{
LinkList p = L;
while(p->next)
{
LinkList m = p->next;
free(p);
p = m;
}
L->next = NULL;
LISTLEN = 0;
return OK;
}

//销毁链表
//单链表的释放是指释放链表的所有结点内存空间
void DestoryList_L(LinkList & L)
{
LinkList p = L;
while(p->next)
{
LinkList m = p->next;
free(p);
p = m;
}

//free (p);
//free (L);
LISTLEN = -1;
}

=========================main.cpp=======================
#include "linklist.h"

int main()
{
LinkList L;
ElemType e;
ElemType curr_e;
int n;
int status; //返回函数执行状态

cout<<"请输入所需创建的元素个数:";
cin>>n;
cout<<endl;

//创建单链表
CreateList_L(L,n);
cout<<endl;

//遍历
status = ListTraverse(L);

//返回链表表长
cout<<"\n单链表的长度是: "<<ListLength(L)<<endl;

//链表的插入操作
cout<<"\n请输入需要插入元素的位置: ";
cin>>n;
cout<<"\n请输入插入的元素值: ";
cin>>e;
status = ListInsert(L,n,e);
if(status)
cout<<"\n链表元素插入成功!"<<endl;
else
cout<<"\n链表元素插入失败!"<<endl;

status = ListTraverse(L);
cout<<endl;

//单链表的删除操作
cout<<"请输入需要删除的元素的位置: ";
cin>>n;
status = ListDelete(L,n,e);
if(status)
{
cout<<"\n删除成功!";
cout<<" 删除的元素是: "<<e<<endl;
}
else
cout<<"\n删除失败..."<<endl;

status = ListTraverse(L);
cout<<endl;

//获取单链表的元素
cout<<"请输入你想获取的元素在链表中的位置: ";
cin>>n;
e = GetElem(L,n);
if(n > 0 && n <= L->len)
cout<<"\n单链表第"<< n <<"个元素值是: "<<e<<endl;

//单链表判空操作
status = EmptyList_L(L);
if(status)
cout<<"\n单链表为空表!"<<endl;
else
cout<<"\n单链表非空,其中含有元素."<<endl;

//查找定位元素
cout<<"\n请输入所需查找的元素: ";
cin>>e;
n = LocateElem(L,e);
if(n)
cout<<"\n元素 "<<e<<" 在链表中的位置是: "<<n<<endl;

//前驱操作
cout<<"\n需要求其前驱的元素值: ";
cin>>curr_e;
status = PriorElem(L,curr_e,e);
if(status)
cout<<"\n元素 "<<curr_e<<" 的前驱是: "<<e<<endl;

//后继操作
cout<<"\n需要求其后继的元素值: ";
cin>>curr_e;
status = NextElem(L,curr_e,e);
if(status)
cout<<"\n元素 "<<curr_e<<" 的后继是: "<<e<<endl;

//单链表的清空操作
cout<<"\n调用清空链表函数";
status = ClearList_L(L);

cout<<endl;

status = ListTraverse(L);

//单链表的销毁操作
cout<<"\n调用链表销毁函数";
DestoryList_L(L);

cout<<endl;

status = ListTraverse(L);

cout<<endl;

return 0;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-04-25
我空间里有一些,你说的好像都有

数据结构上机实验(编程)(单链表的基本操作)
\/\/单链表判空操作 status = EmptyList_L(L); if(status) cout<<"\\n单链表为空表!"<<endl; else cout<<"\\n单链表非空,其中含有元素."<<endl;\/\/查找定位元素 cout<<"\\n请输入所需查找的元素: "; cin>>e; n = LocateElem(L,e); if(n) cout<<"\\n元素 "<<e<<" 在链表中的位置是: "<...

数据结构求代码 实现单链表的基本运算 要求是:依次用头插法插入a、b...
*L) \/* 内存分配失败 *\/exit (OVERFLOW);(*L)->next = NULL; \/* 指针域为空 *\/}\/* 单链表指定位置插入新元素 *\/\/* 操作结果:在带头结点的单链表L中第1个位置之前插入元素e *\/status listInsertNode (linkList L, elemType e) {int j=0;linkList p=L,s;\/* 生成新结点,并插入L...

数据结构的编程题,关于单链表。
1、该单链表已经是递增有序的了,那么只需在遍历这个单链表的过程中,将e与遍历到的这个节点、这个节点的下一个节点的值相比较,如果e的值大于当前节点,且e小于等于当前节点下一节点,那么将e插入到当前节点后 2、若循环起始节点为a节点,其下一节点a->next=b;则对a与b进行原地转置首先需要将b...

...实现初始化、求表长、取元素、按值查找、单链表的插入、删除、遍历访...
struct node *p;printf("请输入要创建链表的大小:\\n");scanf("%d",&n);printf("请向链表中输入%d个整型数据:\\n",n);createList(l1,n);printf("当前链表为:\\n");

数据结构之单链表基本运算的实现[12]
双向链表结点的定义如下 typedef struct node{ DataType data;struct node *prior *next;}DuNode *DLinkList;和单链表类似 双向链表也有几种变形形式 图 给出了带头结点的双向链表示意图 链表中存在从头到尾和从尾到头的两条链;图 给出了带头结点的双向循环链表示意图 链表中存在两个环 显然通过某...

【数据结构】C\/C++ 单链表的 创建、初始化、增、删、改、查、遍历等基 ...
C\/C++单链表的基本操作包括创建、初始化、增删改查和遍历等。首先,定义链表结构,包括数据域和指向下一个节点的指针。头插法建立链表函数Creat_LinkList()的工作流程是:动态分配链表节点,输入用户数据,通过循环将节点依次插入到链表头部,直到用户输入0为止。尾插法的创建函数Creat_LinkList_R()则是...

数据结构系列-1-单链表
单链表,一种基本的线性数据结构,由一系列节点组成,每个节点包含数据域和指针域。节点的指针域指向下一个节点,形成链式结构。头节点有两种处理方式:一种不存储数据,作为链表起点;另一种则存储数据,并正常连接其他节点。第一种处理方式简化了插入操作,无论在链表头部还是中间插入新节点,操作逻辑一致...

数据结构作业~急求~~~用c语言或c++ 使用单链表实现系统进程列表,完成...
一、单链表的建立 有了动态内存分配的基础,要实现链表就不难了。所谓链表,就是用一组任意的存储单元存储线性表元素的一种数据结构。链表又分为单链表、双向链表和循环链表等。我们先讲讲单链表。所谓单链表,是指数据接点是单向排列的。一个单链表结点,其结构类型分为两部分:1、数据域:用来存储...

【数据结构】单链表的建立——头插法与尾插法
该算法的官方描述为∶从一个空表开始,重复读入数据,生成新结点将读入数据存放到新结点的数据域中,然后将新结点插入到当前链表的表尾结点之后。这里的重点就是:生成的一个新结点是直接插入当前单链表的尾端,也就是让原来最后一个结点指向该新结点。这也是链表长度增长的一种最基本的方式。后来居后...

1、编程实现单链表的建立、插入、删除和查找算法,语言采用C或JAVA等...
void hhead_creat()\/*用头插法建立带头结点的单链表*\/ {int x;linklist *p;head=(struct node*)malloc(LEN);head->data=-999;head->next=NULL;printf("\\n\\n\\t\\t请随机输入一组正整数以0作为结束符:\\n\\n\\t\\t");scanf("%d",&x);while(x!=0){ p=(struct node*)malloc(LEN);p...

相似回答