由于老师课件都是分开写得 有的变量名出现了差错 (课件被我们疯狂吐槽) 然后小编根据昨天晚上室友的讲解 写了这篇比较简洁的代码 希望能够帮到你们~ 大家可以看完我写的代码 然后再去看课件 应该就能看懂 所有链表 你只要学会了 插入 删除 其他的都比较简单 希望各位一定要手动去实现 !!! 光理解是不行的
单链表操作 博客:https://blog.csdn.net/henucm/article/details/82709515 课件是上面是 先学一维数组 然后再学单链表
计算时间复杂度和空间复杂度 博客:https://blog.csdn.net/henucm/article/details/82494953
在使用dev c++ 的时候需要注意的事项:
这个地方需要根据你电脑是32位 还是64位 现在一般的电脑都是64位
机房这台电脑是32位
如果你在运行的时候 弹出如图所示小黑块 说明你上面那个位数选错了。。
如果你的电脑是64位的 就选这个 上午就卡在这里 吐血。。。基础不牢固 哎
在编译的时候 会出现编译失败的情况 这个时候你需要根据报错提示 修改你的代码
说了这些 让我们回到正题 在学习链表之前你需要了解指针概念 基本的指针表示符号你要知道 &取地址 *指向地址内存的值
不明白的 手动去实现 ~
下面举个栗子 让我们重视指针 知道它的重要性
#include<iostream>
using namespace std;
void swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
}
int main()
{
int a=1,b=2;
cout<<a<<" "<<b<<endl;
swap(a,b);
cout<<a<<" "<<b<<endl;
}
/*
output
1 2
1 2
*/
这个你会发现它并没有交换它的值
#include<iostream>
using namespace std;
void swap(int *x,int *y) // int *x=*&a
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
int main()
{
int a=1,b=2;
cout<<a<<" "<<b<<endl;
swap(&a,&b);
cout<<a<<" "<<b<<endl;
}
/*
output
1 2
2 1
*/
这样就改变了
具体到这个链表代码的话 我们需要注意当我需要改变值的时候需要在前面加& 其他的话可加可不加 所以我们统一加上比较好
下面是较易懂代码(自认为 嘻嘻):
提醒!!交作业的时候不可复制黏贴 会查重 !! 一定要自己亲自动手去敲 这样才是真正的懂
#include <iostream>
#include <cstdlib>
using namespace std;
# define LIST_INIT_SIZE 100 // 线性表存储空间的初始分配量
# define LISTINCREMENT 10 // 线性表存储空间的分配增量
struct Sqlist{
int *elem;//存储空间基址
int length;//当前表长(特指元素个数)
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
};
// 数组存取得时候是从0位开始存得
//构造一个空的线性表L。
int initlist(Sqlist &L)
{
L.elem=new int[LIST_INIT_SIZE];// 空表长度为0
L.length=0;
L.listsize=LIST_INIT_SIZE;// 初始存储容量
return 1;
}
//销毁函数
void destroylist(Sqlist &L)
{
if(L.elem) delete[] L.elem;//释放存储空间
L.length=0;
L.listsize=0;
}
// 清除链表
void ClearList(Sqlist &L)
{
L.length=0;//将线性表的长度置为0
}
//判空
int IsEmpty(Sqlist &L)
{
if(!L.length)// L.length == 0
return 1;
return 0;
}
// 求链表长度
int GetLength(Sqlist &L)
{
return L.length;
}
//获取线性表位置的元素
void GetElem(Sqlist &L,int i)
{
if(i<1||i>L.length)//越界
{
cout<<"输入不合法"<<endl;
}
else
cout<<L.elem[i-1]<<endl;
}
//获得前驱
void GetPre(Sqlist &L,int i)
{
if(i<2||i>L.length+1)
{
cout<<"输入不合法"<<endl;
}
else
cout<<L.elem[i-2]<<endl;
}
//获得后继
void GetSuc(Sqlist &L,int i)
{
if(i<1||i>L.length-1)
{
cout<<"输入不合法"<<endl;
}
cout<<L.elem[i]<<endl;
}
int ListInsert_Sq(Sqlist &L, int i, int e)
{
if(i<0||i>L.listsize)//越界
{
cout<<"输入不合法"<<endl;
return -1;
}
if(L.length==L.listsize)//当前存储空间已满,增加分配
{
int *newbase=(int *)realloc(L.elem,(L.listsize+ LISTINCREMENT)*sizeof(int));
if(!newbase)
cout<<"存储分配失败"<<endl;
L.elem=newbase;//新基址
L.listsize += LISTINCREMENT;//增加存储容量
}
int *q=&(L.elem[i-1]); //q为插入位置
for(int *p=&L.elem[L.length-1];p>=q;p--)
{
*(p+1)=*p;//插入位置之后的元素右移
}
*q=e;//插入e
++L.length;//长度加一
return 1;
}
//线性表的删除实现
int ListDelete_Sq(Sqlist &L,int i)
{
if(i<1||i>L.length)
{
cout<<"输入不合法"<<endl;
return -1;
}
int *q=&(L.elem[L.length-1]);p为被删除元素的位置
for(int *p=&(L.elem[i-1]);p<q;p++)
{
*p=*(p+1); //被删除元素之后的元素左移
}
--L.length; //表长减1
}
//显示线性表
int Show_Sq(Sqlist &L)
{
for(int i=0;i<L.length;i++)
{
cout<<L.elem[i]<<endl;
}
return 1;
}
void show_help()
{
cout << "1----清空线性表" << endl;
cout << "2----判断线性表是否为空" << endl;
cout << "3----求线性表长度" << endl;
cout << "4----获取线性表指定位置元素" << endl;
cout << "5----求前驱" << endl;
cout << "6----求后继" << endl;
cout << "7----在线性表指定位置插入元素" << endl;
cout << "8----删除线性表指定位置元素" << endl;
cout << "9----显示线性表" << endl;
cout << " 退出,输出一个负数!" << endl;
}
int main()
{
int operate_code;
show_help();
Sqlist L;
initlist (L);
int e,i;
while(1)
{
cout << "请输入操作代码:";
cin >> operate_code;
if (operate_code == 1)
{
//调用操作函数1
ClearList(L);
cout << "the list is empty now" << endl;
}
else if (operate_code == 2)
{
if (IsEmpty(L))
cout << "The list is empty" << endl;
else
cout << "The list is not empty" << endl;
}
else if (operate_code == 3)
{
cout << "the length of list is:" << GetLength(L) << endl;
}
else if (operate_code == 4)
{
cout << "请输入线性表元素的位置:" << endl;
cin >> i;
GetElem(L,i);
}
else if (operate_code == 5)
{
cout << "请输入元素的位置:" << endl;
cin >> i;
GetPre(L, i);
}
else if (operate_code == 6)
{
cout << "请输入元素的位置:" << endl;
cin >> i;
GetSuc(L, i);
}
else if (operate_code == 7)
{
cout << "请输入插入元素及其位置:" << endl;
cin >> e >> i;
ListInsert_Sq(L, i, e);
cout << "e=" << e << " " << "i=" << i << endl;
}
else if (operate_code == 8)
{
cout << "请输入删除元素位置:" << endl;
cin >> i;
ListDelete_Sq(L, i);
cout << "已删除" << endl;
}
else if (operate_code == 9)
{
Show_Sq(L);
}
else if (operate_code<0)
{
break;
}
else
{
cout << "\n操作码错误!!!" << endl;
show_help();
}
}
//调用销毁线性表函数
destroylist(L);
return 0;
}
课件版:
你看完发现并没有那么复杂只不过把有的名字取的比较复杂 然后就看起来比较复杂啦
再次提醒!!交作业的时候不可复制黏贴 会查重 !! 一定要自己亲自动手去敲 这样才是真正的懂
#include <iostream>
#include <cstdlib>
using namespace std;
//1.定义存储表示 ppt 22页
typedef int ElemType; //定义ElemType类型为int
# define LIST_INIT_SIZE 100 // 线性表存储空间的初始分配量
# define LISTINCREMENT 10 // 线性表存储空间的分配增量
// !这种结构体的也可以 不过我更喜欢自己那种
typedef struct { //若后面不再用,可省略结构名
ElemType *elem; //存储空间基址
int length; //当前表长(特指元素个数)
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
typedef int Status;// !定义ElemType类型为int
//初始化
//大家在看老师的代码的时候把 ElemType和 Status都看成int
Status InitList_Sq(SqList &L)
{ //构造一个空的线性表L。
L.elem = new ElemType[LIST_INIT_SIZE];
L.length = 0; // 空表长度为0
L.listsize = LIST_INIT_SIZE; // 初始存储容量
return 1;
}
//销毁函数
void DestroyList(SqList &L)
{
if (L.elem) delete[] L.elem; //释放存储空间
L.length = 0;
L.listsize = 0;
}
//2.定义操作函数1
void ClearList(SqList &L)
{
L.length = 0; //将线性表的长度置为0
}
//3.定义操作函数2
bool IsEmpty(SqList L)
{
if (L.length == 0)
return true;
else
return false;
}
//4.定义操作函数3
int GetLength(SqList L)
{
return L.length;
}
//5.获取线性表位置的元素
Status GetElem(SqList &L,int i) {
if (i<1 || i>L.length )
{
cout<<"输入不合法"<<endl;
return 0;
}
cout << L.elem[i - 1] << endl;
return 1;
}
//获得前驱
Status GetPre(SqList &L, int i) {
if (i<2 || i>L.length+1){
cout<<"输入不合法"<<endl;
return 0;
}
cout<< L.elem[i - 2]<<endl;
return 1;
}
//获得后继
Status GetSuc(SqList &L, int i) {
if (i<1 || i>L.length - 1)
{
cout<<"输入不合法"<<endl;
return 0;
}
cout<<L.elem[i]<<endl;
return 1;
}
//线性表的插入实现
Status ListInsert_Sq(SqList &L, int i, ElemType e) {
if (i<0 || i>L.listsize) //i值不合法
{
cout<<"输入不合法"<<endl;
return 0;
}
if (L.length == L.listsize)//当前存储空间已满,增加分配
{
ElemType* newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
if (!newbase)
cout<<"存储分配失败"<<endl;//存储分配失败
L.elem = newbase; //新基址
L.listsize += LISTINCREMENT; //增加存储容量
}
ElemType* q = &(L.elem[i - 1]); //q为插入位置
for (ElemType* p = &L.elem[L.length - 1]; p >= q; --p) {
*(p + 1) = *p; //插入位置之后的元素右移
}
*q = e; //插入e
++L.length;
return 1;
} //ListInsert_Sq
//线性表的删除实现
Status ListDelete_Sq(SqList &L, int i) {
if (i<1 || i>L.length)
{
cout<<"输入不合法"<<endl;
return 0;
}
ElemType* p=&(L.elem[i-1]); //p为被删除元素的位置
ElemType* q = L.elem + L.length - 1; //表尾元素的位置
for (++p; p<=q;++p) {
*(p - 1) = *p; //被删除元素之后的元素左移
}
--L.length; //表长减1
return 1;
}//ListDelete_Sq
//显示线性表
Status Show_Sq(SqList &L) {
int res;
for (int j = 0; j < L.length; j++) {
res = L.elem[j];
cout << res << endl;
}
return 1;
}
void show_help()
{
cout << "1----清空线性表" << endl;
cout << "2----判断线性表是否为空" << endl;
cout << "3----求线性表长度" << endl;
cout << "4----获取线性表指定位置元素" << endl;
cout << "5----求前驱" << endl;
cout << "6----求后继" << endl;
cout << "7----在线性表指定位置插入元素" << endl;
cout << "8----删除线性表指定位置元素" << endl;
cout << "9----显示线性表" << endl;
cout << " 退出,输出一个负数!" << endl;
}
int main()
{
int operate_code;
show_help();
//定义线性表变量,如SqList L;
//调用初始化线性表函数,如 Init_List(L);
SqList L;
InitList_Sq(L);
ElemType e;
int i;
while (1)
{
cout << "请输入操作代码:";
cin >> operate_code;
if (operate_code == 1)
{
ClearList(L);
cout << "the list is empty now" << endl;
}
else if (operate_code == 2)
{
if (IsEmpty(L))
cout << "The list is empty" << endl;
else
cout << "The list is not empty" << endl;
}
else if (operate_code == 3)
{
cout << "the length of list is:" << GetLength(L) << endl;
}
else if (operate_code == 4)
{
cout << "请输入线性表元素的位置:" << endl;
cin >> i;
GetElem(L,i);
}
else if (operate_code == 5)
{
cout << "请输入元素的位置:" << endl;
cin >> i;
GetPre(L, i);
}
else if (operate_code == 6)
{
cout << "请输入元素的位置:" << endl;
cin >> i;
GetSuc(L, i);
}
else if (operate_code == 7)
{
cout << "请输入插入位置及其元素:" << endl;
cin >> i >> e;
ListInsert_Sq(L, i, e);
}
else if (operate_code == 8)
{
cout << "请输入删除元素位置:" << endl;
cin >> i;
ListDelete_Sq(L, i);
cout << "已删除" << endl;
}
else if (operate_code == 9)
{
Show_Sq(L);
}
else if (operate_code<0)
{
break;
}
else
{
cout << "\n操作码错误!!!" << endl;
show_help();
}
}
//调用销毁线性表函数,如 Destroy_List(L);
DestroyList(L);
return 0;
}