单链表相关的问题

呆威 2016-02-16 02:38:07
有N份简历,每份简历有一个对应的ID,编号从1开始。BOSS会从简历里抽掉M份。每次他会念一个他认为不吉利的数字num,然后从第一份简历开始数,数到第num份时,就会把该简历抽掉。然后念下一个数字,重复上述动作。抽掉M份简历后,BOSS从剩余简历中,取出最中间的简历。问这份简历的ID号。
输入格式:第一行输入两个正整数N和M(1<=M<N),第二行输入M个整数(num1,num2...numM).输入时会保证N-M是奇数,保证输入的num小于等于当前剩余简历的数量。

我的代码,请高手指出一下错误,要求程序运行时间在1000ms以内。


#include <iostream>
using namespace std;

class Node{
public:
int data;
Node* next;
Node(int _data){
data=_data;
next=NULL;
}

};

class Linklist{
private:
Node* head;
public:
Linklist(){
head=NULL;
}

void insert(Node *node, int index) {
if (head == NULL) {
head = node;
head->next = head;
return;
}
if (index == 0) {
node->next = head->next;
head->next = node;
return;
}
Node *current_node = head->next;
int count = 0;
while (current_node != head && count < index - 1) {
current_node = current_node->next;
count++;
}
if (count == index - 1) {
node->next = current_node->next;
current_node->next = node;
}
if (node == head->next) {
head = node;
}
}

void delete_node(int index)
{
if(head==NULL)
{
return;
}
Node* current_node=head;
int count=0;
if(index==0)
{
head=head->next;
delete current_node;
return;
}
while(current_node->next != NULL && count<index-1)
{
current_node=current_node->next;
count++;
}
if(count==index-1 && current_node->next != NULL)
{
Node* delete_node=current_node->next;
current_node->next=delete_node->next;
delete delete_node;
}
}

int get_len(Node *head)
{
Node *p=head->next;
int len=0;
while ( p )
{
len++;
p=p->next;
}
return len; //返回长度;
}
void output_node(){
if(head==NULL){
return;
}
Node* current_node=head;
int count=-1;
int length = get_len(head);
while(current_node!=NULL){
count++;
if(count == length/2){
cout << current_node->data;
}
current_node = current_node->next;
}
}

};

int main(){
Linklist linklist;
int n,m,k;
cin>>n>>m;
for (int i = 1; i <= n; i++) {
Node *node = new Node(i);
linklist.insert(node, i - 1);
}
for(int i=1;i<=m;i++){
cin>>k;
linklist.delete_node(k-1);
}
linklist.output_node();
return 0;
}

...全文
147 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-02-16
  • 打赏
  • 举报
回复
仅供参考:
//假设有n个人团团围做,从第1个人开始数数,数到第m个人时候,第m个人出列,
//然后继续从1开始数数,数到第m个人退出
#include <stdio.h>
#include <conio.h>
int i,k,t;
int n,m;
static char f[1001];//0该座位未出圈,1该座位已出圈
void main() {
    while (1) {
        printf("Input n m(1000>=n>=m>=1):");
        fflush(stdout);
        rewind(stdin);
        if (2==scanf("%d%d",&n,&m)) {
            if (1000>=n && n>=m && m>=1) break;
        }
    }
    t=0;//已出圈总人数
    i=1;//座位编号
    k=1;//当前要数的数
    while (1) {
        if (0==f[i]) {
            if (m==k) {
                t++;
                f[i]=1;
                printf("%3d ",i);
                if (0==t%10) printf("\n");
                if (t>=n) break;
            }
            k++;if (k>m) k=1;
        }
        i++;if (i>n) i=1;
    }
    cprintf("Press any key ...");
    getch();
}
lm_whales 2016-02-16
  • 打赏
  • 举报
回复
最简单的是 链表表示,简历ID作为数据 从头开始计数num[i]; 每次从头数起
单链表实验报告 1. 实验目的与要求 1、实现单链表的建立; 2、掌握单链表的插入、删除和查找运算; 3、熟练进行C语言源程序的编辑调试。 2. 实验内容 (1)建立带表头结点的单链表; 首先输入结束标志,然后建立循环逐个输入数据,直到输入结束标志。 数据输入的函数为: LNode *createtail() { LNode *s,*r; int x,tag; printf("input the sign of ending:"); /*输入结束标志*/ scanf("%d",&tag); h=(LNode * )malloc(sizeof(LNode)); /*建立表头结点*/ h->data=tag; r=h; printf("input the data:"); scanf("%d",&x); while(x!=tag) /*建立循环逐个输入数据*/ { s=(LNode * )malloc(sizeof(LNode)); s->data=x; r->link=s; r=s; scanf("%d",&x); } r->link=NULL; return h; } (2)输出单链表中所有结点的数据域值; 首先获得表头结点地址,然后建立循环逐个输出数据,直到地址为空。 数据输出的函数为: void output(LNode *h) { LNode *r; int i; r=h; for(i=1;r->link!=NULL;i++) { printf("%d.%d\n",i,r->link->data); r=r->link; } } (3)输入x,y在第一个数据域值为x的结点之后插入结点y,若无结点x,则在表尾插 入结点y; 建立两个结构体指针,一个指向当前结点,另一个指向当前结点的上一结点,建立循 环扫描链表。当当前结点指针域不为空且数据域等于x的时候,申请结点并给此结点 数据域赋值为y,然后插入当前结点后面,退出函数;当当前结点指针域为空的时候 ,申请结点并给此结点数据域赋值为y,插入当前结点后面,退出函数。 数据插入函数为: void insert(LNode *h) { LNode *r,*s; int x,y; printf("Input the data that you want to insert:\n"); printf("x="); scanf("%d",&x); /*输入x值*/ printf("y="); scanf("%d",&y); /*输入y值*/ r=h; r=r->link; for(;;r=r->link) { if(r->data==x) /*当当前结点指针域不为空且数据域等于x的时候…*/ { s=(LNode *)malloc(sizeof(LNode)); s->data=y; s->link=r->link; r->link=s; break; } if(r->link==NULL) /*当当前结点指针域为空的时候*/ { s=(LNode *)malloc(sizeof(LNode)); s->data=y; s->link=NULL; r->link=s; break; } } } (4)输入k,删除单链表中所有的结点k,并输出被删除结点的个数。 建立三个结构体指针,一个指向当前结点,另一个指向当前结点的上一结点,最后一 个备用;建立整形变量l=0;建立循环扫描链表。当当前结点指针域为空的时候,如 果当前结点数据域等于k,删除此结点,l++,跳出循环,结束操作;如果当前结点数 据域不等于k,跳出循环,结束操作。当当前结点指针域不为空的时候,如果当前结 点数据域等于k,删除此结点,l++,继续循环操作;如果当前结点数据域不等于k, 指针向后继续扫描。循环结束后函数返回变量l的值,l便是删除的结点的个数。 数据删除函数为: int del(LNode *h) { LNode *r,*s,*t; int k,l=0; printf("Input the data that you want to delete:"); scanf("%d",&k); r=h; s=r; r=r->link; for(;;) { if(r->link==NULL) /*当当前结点指针域为空的时候*/ { if(r->data==k) /*如果当前结点数据域不等于k…*/ { l++; s->link=NULL; free(r); break; } else break; /*如果当前结点数据域等于k…*/ } else /*当当前结点指针域不为空的时候*/ { if(r->data==k) /*如果当前结点数据域不等于k…*/ { l++; t=r; s->link=t->link; r=t->lin

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧