线性表的基本操作(单链表)
2015-06-04 18:47
393 查看
要求同顺序表:
#include<iostream>
using namespace std;
#include <stdio.h>
#include <malloc.h>
#define MaxSize 50
typedef char ElemType;
typedef struct LNode //定义单链表结点类型
{
ElemType data;
struct LNode *next;
} LinkList;
void InitList(LinkList *&L) //初始化线性表
{
LinkList *s,*r;
L=(LinkList *)malloc(sizeof(LinkList)); //创建头结点
r=L;
cout<<"请输入字符个数:";
int x;
cin>>x;
ElemType c[MaxSize];
for(int i=0;i<x;i++)
cin>>c[i];
for(int j=0;j<x;j++)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=c[j];
r->next=s;
r=s;
}
r->next=NULL;
}
void DestroyList(LinkList *&L) //销毁线性表
{
L->next=NULL;
}
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)
{
cout<<p->data<<" ";
p=p->next;
}
printf("\n");
}
ElemType GetElem(LinkList *L,int i,ElemType &e) //求线性表中某个数据元素值
{
int j=0;
LinkList *p=L; //p指向头节点,j置为0(即头节点的序号为0)
while (j<i && p!=NULL) //找第i个节点
{ j++;
p=p->next;
}
if (p==NULL) //不存在第i个数据节点,返回0
return 0;
else //存在第i个数据节点,返回1
{
e=p->data;
return e;
}
}
int LocateElem(LinkList *L,ElemType e) //按元素值查找
{
int i=1;
LinkList *p=L->next; //p指向开始节点,i置为1(即开始节点的序号为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(即头节点的序号为0)
while (j<i-1 && p!=NULL) //查找第i-1个节点
{
j++;
p=p->next;
}
if (p==NULL) //未找到第i-1个节点,返回false
return false;
else //找到第i-1个节点*p,插入新节点并返回1
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=e; //创建新节点*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; //p指向头节点,j置为0(即头节点的序号为0)
while (j<i-1 && p!=NULL) //查找第i-1个节点
{
j++;
p=p->next;
}
if (p==NULL) //未找到第i-1个节点,返回false
return false;
else //找到第i-1个节点*p
{
q=p->next; //q指向第i个节点
if (q==NULL) //若不存在第i个节点,返回false
return false;
e=q->data;
p->next=q->next; //从单链表中删除*q节点
free(q); //释放*q节点
return true; //返回true表示成功删除第i个节点
}
}
void s()
{
printf("1.初始化\n");
printf("2.清空\n");
printf("3.求链表长度\n");
printf("4.检查链表是否为空\n");
printf("5.检查链表是否为满\n");
printf("6.遍历链表\n");
printf("7.从链表中查找元素\n");
printf("8.从链表中查找与给定元素值相同的元素在顺序表中的位置\n");
printf("9.向链表中插入元素\n");
printf("10. 从链表中删除元素\n");
printf("其他键退出。。。。。\n");
}
int scan()
{
int d;
cout<<"请选择所要进行的操作:\n";
scanf("%d",&d);
return(d);
}
int main()
{
int quit=0;
int i;
s();
ElemType e;
LinkList *L;
printf("--第一次操作需选择初始化--\n");
while(!quit)
switch(scan())
{
case 1:InitList(L);break;
case 2:DestroyList(L);break;
case 3:cout<<"链表长度为:"<<ListLength(L)<<endl;break;
case 4:if(ListEmpty(L))
cout<<"链表为空"<<endl;
else
cout<<"链表不为空"<<endl;
break;
case 5:if(ListLength(L)==MaxSize)cout<<"链表已满";
else
cout<<"链表未满";
break;
case 6:DispList(L);break;
case 7:cout<<"请输入需要查找第几个元素:";
cin>>i;
cout<<"第"<<i<<"个元素的值为"<<GetElem(L,i,e)<<endl;
break;
case 8:cout<<"请输入需要查找的元素:";
ElemType e2;
cin>>e2;
if(LocateElem(L,e2)==0)
cout<<"链表中不含有元素"<<e2<<endl;
else
cout<<e2<<" 为第 "<<LocateElem(L,e2)<<" 个元素"<<endl;
break;
case 9:printf("请输入要插入的元素的位置和其值:\n");
int i0;
ElemType e0;
cin>>i0>>e0;
ListInsert(L,i0,e0);
break;
case 10:printf("请输入要删除的元素的位置:\n");
int i1;
cin>>i1;
ElemType e1;
ListDelete(L,i1,e1);
break;
default:quit=1;
}
return 0;
}
#include<iostream>
using namespace std;
#include <stdio.h>
#include <malloc.h>
#define MaxSize 50
typedef char ElemType;
typedef struct LNode //定义单链表结点类型
{
ElemType data;
struct LNode *next;
} LinkList;
void InitList(LinkList *&L) //初始化线性表
{
LinkList *s,*r;
L=(LinkList *)malloc(sizeof(LinkList)); //创建头结点
r=L;
cout<<"请输入字符个数:";
int x;
cin>>x;
ElemType c[MaxSize];
for(int i=0;i<x;i++)
cin>>c[i];
for(int j=0;j<x;j++)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=c[j];
r->next=s;
r=s;
}
r->next=NULL;
}
void DestroyList(LinkList *&L) //销毁线性表
{
L->next=NULL;
}
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)
{
cout<<p->data<<" ";
p=p->next;
}
printf("\n");
}
ElemType GetElem(LinkList *L,int i,ElemType &e) //求线性表中某个数据元素值
{
int j=0;
LinkList *p=L; //p指向头节点,j置为0(即头节点的序号为0)
while (j<i && p!=NULL) //找第i个节点
{ j++;
p=p->next;
}
if (p==NULL) //不存在第i个数据节点,返回0
return 0;
else //存在第i个数据节点,返回1
{
e=p->data;
return e;
}
}
int LocateElem(LinkList *L,ElemType e) //按元素值查找
{
int i=1;
LinkList *p=L->next; //p指向开始节点,i置为1(即开始节点的序号为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(即头节点的序号为0)
while (j<i-1 && p!=NULL) //查找第i-1个节点
{
j++;
p=p->next;
}
if (p==NULL) //未找到第i-1个节点,返回false
return false;
else //找到第i-1个节点*p,插入新节点并返回1
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=e; //创建新节点*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; //p指向头节点,j置为0(即头节点的序号为0)
while (j<i-1 && p!=NULL) //查找第i-1个节点
{
j++;
p=p->next;
}
if (p==NULL) //未找到第i-1个节点,返回false
return false;
else //找到第i-1个节点*p
{
q=p->next; //q指向第i个节点
if (q==NULL) //若不存在第i个节点,返回false
return false;
e=q->data;
p->next=q->next; //从单链表中删除*q节点
free(q); //释放*q节点
return true; //返回true表示成功删除第i个节点
}
}
void s()
{
printf("1.初始化\n");
printf("2.清空\n");
printf("3.求链表长度\n");
printf("4.检查链表是否为空\n");
printf("5.检查链表是否为满\n");
printf("6.遍历链表\n");
printf("7.从链表中查找元素\n");
printf("8.从链表中查找与给定元素值相同的元素在顺序表中的位置\n");
printf("9.向链表中插入元素\n");
printf("10. 从链表中删除元素\n");
printf("其他键退出。。。。。\n");
}
int scan()
{
int d;
cout<<"请选择所要进行的操作:\n";
scanf("%d",&d);
return(d);
}
int main()
{
int quit=0;
int i;
s();
ElemType e;
LinkList *L;
printf("--第一次操作需选择初始化--\n");
while(!quit)
switch(scan())
{
case 1:InitList(L);break;
case 2:DestroyList(L);break;
case 3:cout<<"链表长度为:"<<ListLength(L)<<endl;break;
case 4:if(ListEmpty(L))
cout<<"链表为空"<<endl;
else
cout<<"链表不为空"<<endl;
break;
case 5:if(ListLength(L)==MaxSize)cout<<"链表已满";
else
cout<<"链表未满";
break;
case 6:DispList(L);break;
case 7:cout<<"请输入需要查找第几个元素:";
cin>>i;
cout<<"第"<<i<<"个元素的值为"<<GetElem(L,i,e)<<endl;
break;
case 8:cout<<"请输入需要查找的元素:";
ElemType e2;
cin>>e2;
if(LocateElem(L,e2)==0)
cout<<"链表中不含有元素"<<e2<<endl;
else
cout<<e2<<" 为第 "<<LocateElem(L,e2)<<" 个元素"<<endl;
break;
case 9:printf("请输入要插入的元素的位置和其值:\n");
int i0;
ElemType e0;
cin>>i0>>e0;
ListInsert(L,i0,e0);
break;
case 10:printf("请输入要删除的元素的位置:\n");
int i1;
cin>>i1;
ElemType e1;
ListDelete(L,i1,e1);
break;
default:quit=1;
}
return 0;
}
相关文章推荐
- java对redis的基本操作
- js获取电子秤串口数据
- 通过Gradle来下载依赖的jar包
- Druid是什么
- Java.lang.UnsatisfiedLinkError android studio集成Jpush极光推送
- Java乔晓松-Android SD卡路径问题以及如何获取SDCard内存大小
- win7下通过easyBCD引导安装Ubuntu14.04(补充完善版)
- linux下vim如何配置markdown插件
- Java for LeetCode 141 Linked List Cycle
- Drupal - upload shell with admin privilege
- linux libjpeg库的安装方法
- 利用java反射重写toString
- 领域驱动设计实战--战略建模
- 解决企业In-House安装APP需HTTPS支持的问题(转载)
- 八大排序算法
- linux两台服务器建立信任机制
- windows下搭建flask环境
- 用GCD的方式,加载网络图片(主线程加载图片+类扩展方式)
- Druid使用ConfigFilter
- 《软件工程》课程改进意见