数据结构作业代码留存

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[

以上是关于数据结构作业代码留存的主要内容,如果未能解决你的问题,请参考以下文章

数据结构作业代码留存

遗留存储库的 Ivy 依赖项管理

数据仓库 用户留存主题

抢购代码留存

抢红包代码留存

《数据中台实战》:用户留存分析