线性表
顺序表
#include<bits/stdc++.h>
using namespace std;
#define MaxS 100
typedef int Elem;
typedef struct
{
Elem date[MaxS];
int length;
}Sqlist;
void printlist(Sqlist &q)
{
for(int i = 0; i < q.length; i++)
{
cout<<q.date[i]<<" ";
}
}
int getelem(Sqlist &q,int p)
{
if(q.length==0 || p < 1|| p > q.length)
{
return 0;
}
return q.date[p-1];
}
int deletesqlist(Sqlist &q,int i)
{
if(q.length==0 || i < 1 ||i > q.length)
{
cout<<"删除失败"<<endl;
return 0;
}
for(int j = i;j < q.length;j++)
{
q.date[j-1] = q.date[j];
}
q.length--;
}
int insertelem(Sqlist &q,int m,int n)
{
if(n > q.length + 1 || n < 1 )
{
cout<<"插入位置不对"<<endl;
return 0;
}
if(q.length == MaxS)
{
cout<<"表结构已经满了,无法插入"<<endl;
return 0;
}
for(int j = q.length - 1; j >= n-1;j --)
{
q.date[j+1] = q.date[j];
}
q.length++;
q.date[n-1] = m;
}
bool searchelem(Sqlist &q,int e)
{
for(int i = 1;i <= q.length; i ++)
{
if(getelem(q,i) == e)
{
return true;
}
}
return false;
}
int main()
{
cout<<"声明我们考虑的都是已经排好次序的线性表"<<endl;
Sqlist q;
cout<<"输入表长:"<<endl;
cin>>q.length;
cout<<"输入线性表:"<<endl;
for(int i = 0; i < q.length;i ++)
{
cin>>q.date[i];
}
// cout<<"------------获取元素---------------"<<endl;
// int p;
// cout<<"元素位置"<<endl;
// cin>>p;
// int res = getelem(q,p);
// cout<<res;
// cout<<"------------删除元素---------------"<<endl;
// cout<<"请输入删除第几位元素:";
// int k;
// cin>>k;
// deletesqlist(q,k);
// printlist(q);//打印
// cout<<endl;
// cout<<"------------插入元素---------------"<<endl;
// int m,n;
// cout<<"数"<<endl;
// cin>>m;
// cout<<"插入第几位"<<endl;
// cin>>n;
// insertelem(q,m,n);
// printlist(q);
// cout<<"------------查找元素---------------"<<endl;
// for(int i = 0; i < 10; i ++)
// {
// int h;
// cout<<"输入查找元素"<<endl;
// cin>>h;
// bool ress = searchelem(q,h);
// cout<<ress;
// }
}
//
//#include<stdio.h>
//#include<stdlib.h>
//#define MAXSIZE 1000//宏定义一个大小为一千万的内存空间。(我个人PTA上最大测试点为一千万)
//typedef struct
//{
// int *elem;
// int length;
//} SqList;//定义线性表。
//void InitList(SqList *l);
//void InitList(SqList *l)
//{
// l->elem = (int*)malloc(sizeof(int)*MAXSIZE);
// //或直接用l.elem=(int*)malloc(MAXSIZE);//因为elem为int型,所以前面用int;
// //关于malloc:申请空间;分配的大小是参数,返回值是指针。
// l->length = 0;
//}//线性表的初始化。
//int main()
//{
// int i = 0, j = 0, k = 0, m = 0, n = 0, z = 0;
// SqList l1, l2, newl,result;
// InitList(&l1);
// InitList(&l2);
// InitList(&newl);
// InitList(&result);
// //传入函数体中,将线性表初始化。
// do {
// scanf("%d", &l1.elem[i]);
// i++; l1.length++;
// } while (l1.elem[i - 1] != -1);
//
// do {
// scanf("%d", &l2.elem[j]);
// j++; l2.length++;
// } while (l2.elem[j - 1] != -1);
为线性表输入数据。
// for (k = 0; l1.elem[m] != -1 && l2.elem[n] != -1; k++)
// {
// if (l1.elem[m] < l2.elem[n])
// {
// newl.elem[k] = l2.elem[n];
// n++;
// }
// else
// {
// newl.elem[k] = l1.elem[m];
// m++;
// }
// newl.length++;
// }
// if (l1.elem[m] == -1)
// {
// while (l2.elem[n] != -1)
// {
// newl.elem[k] = l2.elem[n];
// n++; k++; newl.length++;
// }
// }//线性表的合并,必有其一先截止,所以将未截止的线性表中其余数据放入新表。
// else
// {
// while (l1.elem[m] != -1)
// {
// newl.elem[k] = l1.elem[n];
// m++; k++; newl.length++;
// }
// }
// if (k == 0)//当两个两表均为空时的判定。此判定可有多种方式,如newl.elem[0]==-1,newl.length==0;
// {
// printf("NULL");
// return 0;
// }
//
// int deng = 0;
// int res = newl.elem[0];
// for(int i = k-1;i >= 0; i--)
// {
// if(res != newl.elem[i])
// {
// res = newl.elem[i];
// result.elem[deng] = newl.elem[i];
// deng++;
// }
//
// }
//
// for (z = 0; z < deng; z++)
// {
// if(z!=deng-1)
// printf("%d,", result.elem[z]);
// else
// printf("%d",result.elem[z]);
// }//新表输出。
//
//
//
// return 0;
//}
单链表
概念分析:
头指针和头节点区别
头指针:
1.头指针是指向,链表的第一个结点的指针,如果链表有头节点,那么就指向头节点
2.无论链表是否为空头指针为不为空,头指针是链表必要元素
头节点:
1.数据域不存放任何东西
2.头节点不是必须元素
在这里插入图片描述
链表
#include<bits/stdc++.h>
using namespace std;
typedef int Status;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef struct node
{
int elem;
struct node *next;
}node,*linklist;
//初始化
Status InitList(linklist &l)
{
l = new node;
l->next = NULL;
return OK;
}
//创建链表
void creatlisthead(linklist &l,int n)
{
linklist p;
l = new node;
l->next=NULL;
for(int i = 0;i < n; i ++)
{
p = new node;
cin>>p->elem;
p->next = l->next;
l->next = p;
}
}
void creatlisttail(linklist &l,int n)
{
node *p,*r;
l = new node;
l->next = NULL;
r = l;
for(int i = 0; i < n; i ++)
{
p = new node;
cin>>p->elem;
r->next=p;
r = p;
}
r->next=NULL;
}
//打印表
void printlist(linklist &l)
{
linklist p = l->next;//头节点没有用嗷,头节点
while(p)
{
cout<<p->elem<<" ";
p = p->next;
}
printf("\n");
}
//删除元素
int delectelem(linklist &l,int i)
{
int j;
linklist p,q;
p = l;
while (p->next && j < i) /* 遍历寻找第i个元素 */
{
p = p->next;
++j;
}
if (!(p->next) || j > i)
{
cout<<"该元素不存在"<<endl;
return 0; /* 第i个元素不存在 */
}
q = p->next;
p->next = q->next; /* 将q的后继赋值给p的后继 */
free(q); /* 让系统回收此结点,释放内存 */
return 1;
}
int main()
{
linklist l;
InitList(l);
cout<<"请输入要输入元素个数"<<endl;
int n;
cin>>n;
// cout<<"----------头插法----------"<<endl;
// creatlisthead(l,n);
// printlist(l);
/*
头插法(B站的视频)
https://www.bilibili.com/video/BV1tE41117id?p=1&share_medium=android&share_plat=android&share_session_id=3acfb478-6fed-4fdc-b6bb-de8c1eb1cb49&share_source=QQ&share_tag=s_i×tamp=1639294659&unique_k=sOcJ8kJ
*/
cout<<"----------尾插法----------"<<endl;
creatlisttail(l,n);
printlist(l);
/*
尾插法(B站的视频)
https://www.bilibili.com/video/BV1VE411B7LG?from=search&seid=15325598745236484152&spm_id_from=333.337.0.0
*/
cout<<"----------删除----------"<<endl;
int k;
cout<<"删除第几个元素"<<endl;
cin>>k;
delectelem(l,k-1);
printlist(l);
}