DS--顺序表和链表

/****************

Project: List(Sequence List and LinkList)
Data: 2021/09/14,2021/11/11整理完毕
Author: Alex_yrdm

****************/

顺序表的实现

/*****************
Part1: Sequence List
*****************/

/*
 Sequence List dynamic allocation:
 void show(SqList L);                               参数:顺序表L.功能:打印输出表L中所有元素.时间复杂度:O(n)
Status ListInsert_Sq(SqList& L, int i, int e);      参数:顺序表L,位置i,插入元素e.功能:将元素e插入到位置i处.时间复杂度:O(n)
Status InitList_Sq(SqList& L);                      参数:顺序表L.功能:初始化顺序表L.时间复杂度:O(1)
Status ListDelete_Sq(SqList& L, int i, int& e);     参数:顺序表L,位置i,用于接受删除位置值的变量e.功能:删除位置为i的元素并返回该值.时间复杂度:O(n)

*/
//全局默认常量
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define InFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10 
typedef int Status;
typedef int Elemtype;
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
struct SqList {
    Elemtype* elem;
    int length;
    int listsize;
};
void show(SqList L);
Status ListInsert_Sq(SqList& L, int i, Elemtype e);
Status InitList_Sq(SqList& L);
Status ListDelete_Sq(SqList& L, int i, Elemtype& e);
int main() {
    /*








    */
    return 0;
}



void show(SqList L) {
    for (int i = 0; i < L.length; i++) {
        cout << L.elem[i] << " ";
    }
    cout << endl;
}

Status ListInsert_Sq(SqList& L, int i, Elemtype e) {
    if (i<1 || i>L.length - 1) return ERROR;
    if (L.length >= L.listsize) {
        Elemtype* newbase;
        newbase = (Elemtype*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(Elemtype));
        if (!newbase) return OVERFLOW;
        L.elem = newbase;//这样写避免了realloc失败直接将空指针赋值给原地址导致原始数据内存块丢失
        L.listsize += LISTINCREMENT;
    }
    Elemtype* q = &(L.elem[i - 1]);
    for (Elemtype* p = &(L.elem[L.length - 1]); p >= q; p--) {
        *(p + 1) = *p;
    }
    *q = e;
    L.length++;
    return OK;
}

Status InitList_Sq(SqList& L) {
    L.elem = (Elemtype*)malloc(LIST_INIT_SIZE * sizeof(Elemtype));
    if (!L.elem) exit(OVERFLOW);
    L.length = 0;
    L.listsize = LIST_INIT_SIZE;
    return OK;
}


Status ListDelete_Sq(SqList& L, int i, Elemtype& e) {
    if (i<1 || i>L.length + 1) return ERROR;
    Elemtype* p = &(L.elem[i - 1]);
    e = *p;
    Elemtype* q = L.elem + L.length - 1;
    for (++p; p <= q; ++p) {
        *(p - 1) = *p;
    }
    L.length--;
    return OK;
}


链表

/******************
Part2: LinkList
******************/


/*
* 带有头节点链表:
    LinkList functions:
    int InitList(LinkList& L);                          参数:链表L.功能:初始化链表.时间复杂度:O(1)
    int createList(LinkList& L, int n);                 参数:链表L,初始化链表元素数目n.功能:创建n个元素的链表;时间复杂度:O(n)
    int size(LinkList L);                               参数:链表L.功能:返回链表中元素数目.时间复杂度:O(n)
    int ListInsert(LinkList& L, int i,Elemtype e);      参数:链表L,位置i,插入元素e.功能:在位置i处插入e.时间复杂度:O(n)
    int ListDelete(LinkList& L, int i, Elemtype& e);    参数:链表L,位置i,用于接收被删除节点元素的变量e.功能:删除位置i处的节点.时间复杂度:O(n)
    int ListOppose(LinkList& L);                        参数:链表L.功能:实现链表逆转.时间复杂度:O(n)

*/
#include<stdio.h>
#include<stdlib.h> 
typedef int Elemtype;
typedef struct LNode //单向链表
{
    Elemtype data;
    struct LNode* next;
}LNode, * LinkList;
int InitList(LinkList& L);
int createList(LinkList& L, int n);
int size(LinkList L);
int ListInsert(LinkList& L, int i,Elemtype e);
int ListDelete(LinkList& L, int i, Elemtype& e);
int ListOppose(LinkList& L);

int main() {
    return 0;
}
int InitList(LinkList& L) {
    L = NULL;
    return 1;
}
int createList(LinkList& L, int n) //正常顺序创建链表
{
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    LinkList q=L;
    for (int i = n; n > 0; i--) {
        LinkList p;
        p = (LinkList)malloc(sizeof(LNode));
        if (!p)
            return -1;
        scanf("%d", &p->data);
        p->next = NULL;
        q->next = p;
    }
    return 1;
}
/*int createList(LinkList& L, int n)//头插法创建链表
{
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    for (int i = n; i > 0; i--) {
        LinkList p;
        p = (LinkList)malloc(sizeof(LNode));
        if (!p) return -1;
        scanf("%d", &p->data);
        p->next = L->next;
        L->next = p;
    }
    return 1;
}*/
int size(LinkList L) {
    int num = 0;
    while (L->next) {
        num++;
        L = L->next;
    }
    return num;
}
int ListInsert(LinkList& L, int i, Elemtype e) {
    if (!L || i<1 || i>size(L) + 1)
        return -1;
    LinkList p;
    p = L;
    for (int j = 0; j < i - 1; j++) {//找到第i-1个结点
        p = p->next;
    }
    LinkList s;
    s = (LinkList)malloc(sizeof(LNode));
    if (!s) return -1;
    s->data = e;
    s->next = p->next;
    p->next = s;
    return 1;
}
int ListDelete(LinkList& L, int i, Elemtype& e) {
    if (!L || i<1 || i>size(L))
        return -1;
    LinkList p;
    p = L;
    for (int j = 0; j < i - 1; j++) {//找到第i-1个结点
        p = p->next;
    }
    LinkList s;//用s指向即将被删除结点
    s = p->next;
    p = p->next->next;
    free(s);
    return 1;
}


int ListOppose(LinkList& L)//实现链表逆转
{
    LinkList p, q;
    p = L;
    p = p->next;
    L->next = NULL;
    while (p) {
        q = p;
        p = p->next;
        q->next = L->next;
        L->next = q;
    }
    return 1;
}
/*typedef struct DuLNode//双向链表
{
    int data;
    struct DuLNode* prior;
    struct DuLNode* next;
}DuLNode, * DuLinkList;*/
//int ListInsert_DuL(DuLinkList& L, int i, int e);
//int ListDelete_DuL(DuLinkList& L, int i, int& e);
/*
int ListInsert_DuL(DuLinkList& L, int i, int e)//双向链表插入元素
{
    DuLinkList p, q, s;
    p = L;
    for (int j = 1; j < i; j++) {
        p = p->next;
    }
    q = p->next;
    if (!(s = (DuLinkList)malloc(sizeof(DuLNode)))) return -1;
    s->data = e;
    p->next = s;
    s->prior = p;
    s->next = q;
    q->prior = s;
    return 1;
}
int ListDelete_DuL(DuLinkList& L, int i, int& e)//双向链表删除元素并用e返回
{
    DuLinkList p, q;
    p = L;
    for (int j = 1; j < i; j++) {
        p = p->next;
    }
    q = p->next;
    e = q->data;
    p->next = p->next->next;
    p->next->prior = p;
    free(q);
    return 1;
}
*/
约瑟夫环题是一个经典的数学题,它涉及到一个有固定人数的圆圈中的人,每次从圆圈中数到某个特定的数字,然后将该人移出圆圈,接着从下一个人开始重新数数,直到最后只剩下一个人为止。 如果我们要使用循环链表解决约瑟夫环题,我们可以按照以下步骤进行: 1. 首先,我们需要创建一个循环链表,其中每个节点表示一个人。初始化时,将所有人按顺序添加到链表中。 2. 选择一个起始位置,例如从第一个人开始。 3. 开始数数,每次数到指定的数字时,移除当前节点,并将指针移到下一个节点。 4. 重复步骤3,直到只剩下最后一个节点为止。 下面是一个使用Python实现的简单示例代码: ```python class Node: def __init__(self, data): self.data = data self.next = None class CircularLinkedList: def __init__(self): self.head = None def insert(self, data): new_node = Node(data) if not self.head: self.head = new_node self.head.next = self.head else: temp = self.head while temp.next != self.head: temp = temp.next temp.next = new_node new_node.next = self.head def remove(self, node): if not self.head: return temp = self.head prev = None while temp.next != self.head: if temp == node: break prev = temp temp = temp.next if temp == self.head: prev = self.head while prev.next != self.head: prev = prev.next self.head = self.head.next prev.next = temp.next def josephus(self, k): if not self.head: return cur_node = self.head while cur_node.next != cur_node: count = 1 while count != k: cur_node = cur_node.next count += 1 next_node = cur_node.next self.remove(cur_node) cur_node = next_node return cur_node.data # 示例用法 clist = CircularLinkedList() n = 10 # 总人数 k = 3 # 数到3的人出局 for i in range(1, n+1): clist.insert(i) winner = clist.josephus(k) print("胜者是第", winner, "个人") ``` 这段代码创建了一个循环链表类 `CircularLinkedList`,其中的 `insert` 方法用于插入节点,`remove` 方法用于移除节点,`josephus` 方法用于求解约瑟夫环题。在示例中,我们以10个人为例,每次数到3的人出局,最后输出胜者的编号。 希望可以帮助到你!如果有任何疑,请随时提
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怡人蝶梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值