数据结构作业代码留存
Posted skywalker767
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构作业代码留存相关的知识,希望对你有一定的参考价值。
仅供参考,严禁抄袭!!!
有问题可在csdn评论,有空回
第三次作业
单链表的基本操作
/*
Project: single linkeed list (数据结构 单链表)
Date: 2021-10-7 09:26:57
Author: Frank Wang
InitList(LinkList &L) 参数:单链表L 功能:初始化 时间复杂度 O(1)
ListLength(LinkList L) 参数:单链表L 功能:获得单链表长度 时间复杂度O(n)
ListInsert(LinkList &L,int i,ElemType e)
ListDelete(LinkList &L,int i) 参数:单链表L,位置i 功能:删除位置i元素 时间复杂度O(n)[加入了查找]
若已知p指针指向的删除 最好是O(1),因为可以与后继结点交换数据域,然后删除后继结点。
最坏是O(n),即从头查找p之前的结点,然后删除p所指结点
LocateElem(LinkList L,ElemType e) 参数:单链表L,元素e 功能:查找第一个等于e的元素,返回指针 时间复杂度O(n)
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
#define Status int
#define ElemType int
const int BCKMAXN = 10000;
//单链表结点数据结构
typedef struct LNode
ElemType data;//数据域
struct LNode *next;//指针域
LNode,*LinkList;
//**************************基本操作函数***************************//
//初始化函数
Status InitList(LinkList &L)
L = new LNode;//生成头结点 这样删除等操作就不必分第一个结点和其他了
L->next = NULL;
return 1;
//获取单链表长度 头结点无数据,不算
int ListLength(LinkList L)
LinkList p=L;int sum=0;
while(p)
sum++;
p=p->next;
return sum - 1;//去除头结点
//后插
bool ListInsert(LinkList &L,int i,ElemType e)
LNode* s;LinkList p=L;int j=0;
while(p&&(j<i-1))//j指到i-1位置或者p已经到最后时跳出
p=p->next;
++j;
if(!p||j>i-1)//i<1或者i>ListLength(L)+1时,插入位置无效 不调用ListLength,提高效率
printf("插入位置无效!!!\\n");
return false;
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return true;
//前插
bool ListInsert_2(LinkList &L,int i,ElemType e)
LNode* s;LinkList p = L , last;int j=0;
while(p&&(j<i))//j指到i位置或者p已经到最后时跳出
last = p;
p = p -> next;
++ j;
//出来的时候j = i,或者已经走到最后了
if(!p && j == i - 1) //走到最后,并且在i - 1位置
s = new LNode;
s -> data = e;
s -> next = p -> next;
p -> next = s;
return true;
if (!p && j != i)
printf("插入位置无效!!!\\n");
return false;
s = new LNode;
last -> next = s;
s -> data = e;
s -> next = p;
//删除函数 删除位置i的结点 即删除i-1之后的结点
bool ListDelete(LinkList &L,int i)
LNode* s;LinkList p=L;int j=0;
LinkList q;
while(p&&(j<i-1))//j指到i-1位置
p=p->next;
++j;
if(!(p->next)||j>i-1)//i<1或者i>ListLength(L)时,删除位置无效
printf("删除位置无效!!!\\n");
return false;
q=p->next;
p->next=q->next;
free(q);//释放空间
return true;
//查找函数 按值查找 查找第一个等于e的结点 成功返回该结点指针,否则返回NULL
LNode *LocateElem(LinkList L,ElemType e)
LNode *p=L;
while(p&&(p->data!=e))
p=p->next;
return p;
void sort(LinkList L)
LinkList p = L -> next;//跳过头结点
if(ListLength(L))
for (; p ; p = p -> next)
int mn = p -> data;
int cnt = 0 , pos = 0 , cnt2 = 0;
for (LinkList j = p -> next; j ; j = j -> next)
cnt ++;
if (mn > j -> data)
mn = j -> data;
pos = cnt;
for (LinkList j = p -> next; j ; j = j -> next)
cnt2 ++;
if (cnt2 == pos)
j -> data = p -> data;
break;
// printf("---%d\\n" , mn);
p -> data = mn;
printf("排序成功!\\n");
else
printf("当前单链表没有元素!\\n");
//**************************功能实现函数**************************//
//遍历输出函数
void PrintList(LinkList L)
LinkList p=L->next;//跳过头结点
if(ListLength(L))
printf("当前单链表所有元素:");
while(p)
printf("%d ",p->data);
p=p->next;
printf("\\n");
else
printf("当前单链表已空!\\n");
//插入功能函数 调用ListInsert插入
void Insert(LinkList &L)
int place;ElemType e;bool flag;
printf("请输入要插入的位置(从1开始)及元素:\\n");
scanf("%d%d",&place,&e);
flag=ListInsert(L,place,e);
if(flag)
printf("插入成功!!!\\n");
PrintList(L);
//插入功能函数 调用ListInsert插入
void Insert_2(LinkList &L)
int place;ElemType e;bool flag;
printf("请输入要插入的位置(从1开始)及元素:\\n");
scanf("%d%d",&place,&e);
flag=ListInsert_2(L,place,e);
if(flag)
printf("插入成功!!!\\n");
PrintList(L);
//删除功能函数 调用ListDelete删除
void Delete(LinkList L)
int place;bool flag;
printf("请输入要删除的位置(从1开始):\\n");
scanf("%d",&place);
flag=ListDelete(L,place);
if(flag)
printf("删除成功!!!\\n");
PrintList(L);
//查找功能函数 调用LocateElem查找
void Search(LinkList L)
ElemType e;LNode *q;
printf("请输入要查找的值:\\n");
scanf("%d",&e);
q=LocateElem(L,e);
if(q)
printf("找到该元素!\\n");
else
printf("未找到该元素!\\n");
void p_cnt(LinkList L)
int cnt = 0;
LinkList p=L->next;//跳过头结点
if(ListLength(L))
while(p)
cnt ++;
p=p->next;
printf("当前节点个数为:%d\\n" , cnt);
else
printf("当前单链表已空!\\n");
void printfromback(LinkList L)
int len = 0;
int bck[BCKMAXN];
LinkList p=L->next;//跳过头结点
if(ListLength(L))
printf("链表倒序输出为:");
while(p)
bck[len ++ ] = p -> data;
p=p->next;
for (int i = len - 1;i >= 0;i --)
printf ("%d " , bck[i]);
printf("\\n");
else
printf("当前单链表已空!\\n");
LinkList change(LinkList L)
int back_up;
LinkList p , q;
if(L && L -> next)
q = L;
L = L -> next;
back_up = L -> data;
p = L;
while (p -> next) p = p -> next;
p -> next = q;
q -> next = NULL;
q -> data = back_up;
return L;
//菜单
void menu()
printf("********1.后插 2.删除*********\\n");
printf("********3.查找 4.输出*********\\n");
printf("********5.退出 6.前插*********\\n");
printf("********7.排序 8.节点个数******\\n");
printf("*****9.逆序输出 10.头节点转换成尾节点\\n");
//主函数
int main()
LinkList L;int choice;
InitList(L);
while(1)
menu();
printf("请输入菜单序号:");
scanf("%d",&choice);
if(choice==5) break;
switch(choice)
case 1:Insert(L);break;
case 2:Delete(L);break;
case 3:Search(L);break;
case 4:PrintList(L);break;
case 6:Insert_2(L);break;
case 7:sort(L);break;
case 8:p_cnt(L);break;
case 9:printfromback(L);break;
case 10:L = change(L);break;
default:printf("输入错误!!!\\n");
return 0;
第四次作业
n!递归
#include <bits/stdc++.h>
#define fi first
#define se second
#define PI acos(-1)
#define mk make_pair
#define lowbit(x) (x & (-x))
#define sz(x) (int)(x).size()
#define all(a) a.begin() , a.end()
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define pre(i, b, a) for (int i = (b); i >= (a); --i)
#define debug freopen("1.in", "r", stdin), freopen("1.out", "w", stdout);
using namespace std;
typedef long long LL;
typedef pair<int , int > PII;
const int INF = 0x3f3f3f3f;
LL jiecheng(LL n)
if (n == 0) return 1;
return n * jiecheng(n - 1);
int main()
//ios::sync_with_stdio(false);
//cin.tie(0);
// debug
LL n;cin >> n;
cout << jiecheng(n) << endl;
return 0;
n!非递归
#include <bits/stdc++.h>
#define fi first
#define se second
#define PI acos(-1)
#define mk make_pair
#define lowbit(x) (x & (-x))
#define sz(x) (int)(x).size()
#define all(a) a.begin() , a.end()
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define pre(i, b, a) for (int i = (b); i >= (a); --i)
#define debug freopen("1.in", "r", stdin), freopen("1.out", "w", stdout);
using namespace std;
typedef long long LL;
typedef pair<int , int > PII;
const int INF = 0x3f3f3f3f;
LL jiecheng(LL n)
LL ans = 1;
for (LL i = 1;i <= n;i ++)ans = ans * i;
return ans;
int main()
//ios::sync_with_stdio(false);
//cin.tie(0);
LL n;cin >> n;
cout << jiecheng(n) << endl;
return 0;
斐波那契递归
#include <bits/stdc++.h>
#define fi first
#define se second
#define PI acos(-1)
#define mk make_pair
#define lowbit(x) (x & (-x))
#define sz(x) (int)(x).size()
#define all(a) a.begin() , a.end()
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define pre(i, b, a) for (int i = (b); i >= (a); --i)
#define debug freopen("1.in", "r", stdin), freopen("1.out", "w", stdout);
using namespace std;
typedef long long LL;
typedef pair<int , int > PII;
const int INF = 0x3f3f3f3f;
const int N = 100;
LL f[N];
//递归 + 记忆化
LL fib(LL n)
if (f[n] != -1) return f[n];
if (n == 1) return 1;
if (n == 2) return 1;
return f[n] = fib(n - 1) + fib(n - 2);
int main()
//ios::sync_with_stdio(false);
//cin.tie(0);
for (int i = 1;i <= 60;i ++) f[i] = -1;
f[1] = 1 , f[以上是关于数据结构作业代码留存的主要内容,如果未能解决你的问题,请参考以下文章