知识点四:链表

知识点:

链表

 

1、链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

 

2、链表是线性表的链接存储方式:主要有单链表、静态链表、双向链表、循环链表等。

单向链表或者单链表单向链表,它包含两个域,一个信息域和一个指针域。这个链接指向表中的下一个节点,而最后一个节点则指向一个空值NULL。单向链表只可向一个方向遍历。

双向链表中不仅有指向后一个节点的指针,还有指向前一个节点的指针。第一个节点的"前连接"指向NULL,最后一个节点的"后连接"指向NULL。

循环链表中, 首节点和末节点被连接在一起。这种方式在单向和双向链表中皆可实现。要转换一个循环链表,你开始于任意一个节点然后沿着列表的任一方向直到返回开始的节点。循环链表可以被视为"无头无尾"。

 

3、单链表的有头插,尾插法,还有中间插入等

头插法:

void CreateList(LinkList*L, ElemType a[], int n) //创建单链表

{

  LinkList s;

  int i;

  (*L) = (LinkList)malloc(sizeof(Node));//动态分配节点空间

  (*L)->next = NULL;//赋值为空

  for (i = 0; i < n;i++)

  {

       s = (LinkList)malloc(sizeof(LinkList));

       s->data = a[i];

       s->next = (*L)->next;

       (*L)->next = s; //头指针L->next等于s

  }

}

尾插法:

voidCreateListW(LinkList *L, ElemType a[], int n)    

{

    LinkList s, r;

    int i;

    (*L) = (LinkList)malloc(sizeof(Node));

    (*L)->next = NULL;

    r = (*L);

    for (i = 0; i < n;i++)

    {

         s = (LinkList)malloc(sizeof(Node));

         s->data = a[i];

         r->next = s;//尾指针r,r->next=s

         r = s;

    }

    r->next = NULL;

}

题目分析:N个人围成一个圆圈,每个人都有唯一的一个编号,编号从1到N,从编号为1的人开始报数,依次报到K,报数为K的人出列,他的下一个又从1开始报数,直到所有的人都出列,求这个出列的序列。

注:n为人数,p为要报的数。

考虑:

1、     创建一个单链表,尾指针指向头节点

2、     出列的数据输出,并且将指针指向这个数的下一个节点

题解代码:

// acm1.cpp: 定义控制台应用程序的入口点。

//

 

#include"stdafx.h"

#include"stdlib.h"

#include"stdio.h"

#include<iostream>

usingnamespace std;

 

typedefintdatatype;

 

typedefstructnode {

    datatype data;

    structnode *next;

}node, *LinkList;

 

void Inite(LinkList &first, intn) {

    first = (node*)malloc(sizeof(node));

    node *p = first, *q;

    for (int i = 0; i < n - 1; i++) {

         p->data= i + 1;

         q= (node*)malloc(sizeof(node));

         p->next= q;

         p= q;

    }

    p->data= n;

    p->next= first;

}

 

void Josephus(LinkList &first, intm, ints) {

    node *nowPoint = first, *prePoint = first;

    if (s > 1) {

         for (int i = 0; i < s - 1; i++) {

             prePoint= nowPoint;

             nowPoint= nowPoint->next;

         }

    }

    elseif (s == 1) {

         while (prePoint->next!= nowPoint)

             prePoint= prePoint->next;

    }

    else {

         printf("ERROR!");

    }

    while (nowPoint->next!= nowPoint) {

         for (int i = 0; i < m - 1; i++) {

             prePoint= nowPoint;

             nowPoint= nowPoint->next;

         }

         prePoint->next= nowPoint->next;

         cout<<"Number      "<< nowPoint->data <<" isout"<< endl;

         free(nowPoint);

         nowPoint= prePoint->next;

    }

    cout<<"Number      "<< nowPoint->data <<" isout"<< endl;

}

 

int main() {

    int n, m, s;

    LinkList first;

    cin >> n>> m>> s;

    Inite(first,n); //创建单链表

    Josephus(first,m, s);

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值