单链表
来源:互联网 发布:广东影响力网络盛典 编辑:程序博客网 时间:2024/06/16 06:06
/*要求:实现单链表的各种基本算法
添加:插入和销毁
作者:ys
日期:16.10.13
添加日期:10.17,10.18*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define maxsize 50;
typedef char ElemType;
typedef struct LNode//定义单链表结点类型
{
ElemType data;
struct LNode *next;
}Linklist;
/*实现单链表的各种基本运算的算法
1、初始化
2、输入
3、插入
4、输出即显示
5、求长度
6、判断是否为空
7、输出第i位置的元素
8、查找一个给定元素在表中的位置
9、删除
10、释放单链表
0、退出*/
void Initlist(Linklist *&L);//初始化链表函数的声明
bool Inputlist(Linklist *L);//输入函数的声明
void Insertlist(Linklist *&L);//插入函数的声明
void Dislist(Linklist *L);//输出函数的声明
int Listlength(Linklist *L);//求长度函数的声明
bool Listempty(Linklist *L);//判空函数的声明
bool Getelem(Linklist *L);//求值函数的声明
void LocateElem(Linklist *L);//查找函数的声明
bool Delectlist(Linklist *&L);//删除函数的声明
bool Destroylist(Linklist *&L);//销毁函数的声明
void main()
{
//1、变量的定义:
int n;//操作数
Linklist *H;
int len;//求长度的值
bool i;//求值的返还类型
//2、菜单
for(;;)
{
printf("单链表的基本操作如下:\n");
printf("1、初始化\t");
printf("2、输入\n");
printf("3、插入 \t");
printf("4、输出\n");
printf("5、求长度 \t");
printf("6、判空\n");
printf("7、求值 \t");
printf("8、查找\n");
printf("9、删除 \t");
printf("10、销毁 \t");
printf("0、退出\n");
printf("请选择操作步骤: ");
scanf("%d",&n);
switch(n)
{
case 1:
printf("执行初始化操作!\n");
Initlist(H);
break;
case 2:
printf("执行链表的输入!\n");
Inputlist(H);
break;
case 3:
printf("执行链表的插入!\n");
Insertlist(H);
Dislist(H);
break;
case 4:
printf("执行链表的输出!\n");
Dislist(H);
break;
case 5:
printf("执行链表的求长度!\n");
len = Listlength(H);
printf("链表的长度为:%d\n",len);
break;
case 6:
printf("执行链表的判空!\n");
printf("该链表为%s!\n",Listempty(H)?"空":"非空");
break;
case 7:
printf("执行链表的求值!\n");
i = Getelem(H);
if(i == false)
{
printf("取值失败!请输入%d以内的值\n",Listlength(H));
}
break;
case 8:
printf("执行链表的查找!\n");
LocateElem(H);
break;
case 9:
printf("执行链表的删除!\n");
Delectlist(H);
break;
case 10:
printf("执行链表的释放!\n");
Destroylist(H);
break;
case 0:
exit(0);
}
}
}
void Initlist(Linklist *&L)//1.初始化链表的定义
{
L = (Linklist *)malloc(sizeof(Linklist));
L->next = NULL;
}
bool Inputlist(Linklist *L)//2.输入函数的定义
{
Linklist *s;
Linklist *p;
p = L;
int i;
i = 0;
printf("请输入个数:\n");
int n;
cin>>n;
if(L == NULL)
return false;
while(i < n)
{
s = (Linklist *)malloc(sizeof(Linklist));
printf("请输入链表的第%d个元素",i+1);
cin>>s->data;
p->next = s;//头指针为空
s->next = NULL;
p = p->next;
i++;
}
return true;
}
//L为指向链表的指针,n为插入的逻辑位置
void Insertlist(Linklist *&L)//3.插入函数的定义
{
Linklist *p = L;
int i;
i = 1;//循环变量初始化
int n;
printf("请输入插入元素的逻辑位置:");
scanf("%d",&n);
if(n < 1 || n > Listlength(L))//判断loc是否合法
{
printf("取值失败!请输入%d以内的值\n",Listlength(L));
}
else if(p == NULL);
else
{
Linklist *s = (Linklist *)malloc(sizeof(Linklist));
printf("请输入插入的元素:");
cin>>s->data;
while(i < n && p != NULL)//*p指向n位置
{
p = p->next;
i++;
}
if(p->next == NULL)
{
p->next = s;
s->next = NULL;
}
else
{
s->next = p->next;
p->next = s;
}
}
}
void Dislist(Linklist *L)//4.输出函数的定义
{
Linklist *p;
p = L->next;
printf("链表的全部元素如下:\n");
while(p != NULL)
{
cout<<p->data<<" ";
p = p->next;
}
cout<<endl;
}
int Listlength(Linklist *L)//5.求长度函数的定义
{
int len;
len = 0;
Linklist *p = L;
while(p->next != NULL)
{
len++;
p = p->next;
}
return len;
}
bool Listempty(Linklist *L)//6.判空函数的定义
{
return (L->next == L);
}
bool Getelem(Linklist *L)//7.求值函数的定义
{
int loc;
printf("请输入要取值的逻辑位置:\n");
scanf("%d",&loc);
if(loc < 1 || loc > Listlength(L))//判断loc是否合法
{
return false;
}
Linklist *p = L;
int i = 0;
while(i < loc && p->next != NULL)
{
p = p->next;
i++;
}
cout<<"第"<<loc<<"个元素的值为:"<<p->data<<endl;
return true;
}
//注:L的头指针为空,返回值为其他表示查到了
void LocateElem(Linklist *L)//8.查找函数的定义
{
Linklist *p = L;
int loc;
printf("请输入要查找第几个元素:\n");
scanf("%d",&loc);//输入需查寻的逻辑位置
if(loc > Listlength(L))
{
printf("输入不合法,查找失败!");
}
else
{
int i;
i = 0;
while(i < loc)
{
p = p->next;
i++;
}
cout<<"元素为:"<<p->data<<endl;
}
}
//删除返回true
bool Delectlist(Linklist *&L)//删除函数的定义
{
Linklist *pre = L;
Linklist *p = L->next;
printf("请输入删除的逻辑位置:");
int n;
scanf("%d",&n);
int i = 1;
while(i < n &&pre != NULL)//找到n个节点
{
i++;
pre = pre->next;
}
if(p == NULL)
return false;
else
{
p = pre->next;
if(p == NULL)
return false;
pre->next = p->next;
free(p);
return true;
}
/*if(pre->next != NULL)
{
while(i < n && pre != NULL)
{
p = p->next;
i++;
}
}
if(p->next = NULL)
{
free(p);
pre->next = NULL;
return true;
}
else
{
pre = p;
p = p->next;
pre->next = p->next;
free(p);
return true;
}*/
}
bool Destroylist(Linklist *&L)//10.销毁函数的定义
{
Linklist *pre = L;
Linklist *p = pre->next;
while(p != NULL)
{
free(pre);
pre = p;
p = p->next;
}
free(pre);
return 1;
}
新手入门,不知道怎么将它写入文件,并且读出来。
很纠结一个问题,输入链表的数据是写在分函数好呢,还是主函数好呢?为什么?
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 欢迎使用CSDN-markdown编辑器
- 服务service
- sql优化-order by rand
- Kafka Stream
- 编译原理初探
- 单链表
- noVNC
- 1007. 素数对猜想 (20)
- 深度学习(一):Windows下CNTK的安装与配置
- android仿IOS 旋转菊花Loading、等待Loading、花瓣
- Linux --多线程之读写锁1
- NodeJS中的mongodb驱动
- 二、关于C++版本的OpenTLD问题
- WebRTC学习之三:录音和播放