C语言问题,比较复杂
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言问题,比较复杂相关的知识,希望对你有一定的参考价值。
从标准输入上读入N(1<= N <= 200000)个由空白符分隔的整数。对这N个数从小到大连续编号,相同的数应具有相同的编号。在标准输出上按这N个数输入时的顺序输出它们的编号序列。例如,设输入数据为 5 3 4 7 3 5 6,则输出数据为3 1 2 5 1 3 4。
我的思想是生成两个链表,一个按输入顺序排列,一个按从小到大排列,按第二个链表生成序号,再将第二个链表的序号复制到第一个链表,结果程序在DEBUG时运行正常,结果也正确,但一旦start without debug 就会出错.麻烦给看一下
#include<stdio.h>
#include<stdlib.h>
typedef struct list
int num;
int serial;
struct list *next;
LIST;
LIST *insert(LIST *input,int in);
LIST *compose(LIST *temp,int in);
LIST *sequence(LIST *input,LIST *temp);
int main()
LIST *input=NULL,*temp=NULL,*p,*q;
char c;
int in;
while((c=getchar())!='\n')
ungetc(c,stdin);
scanf("%d",&in);
input=insert(input,in);
temp=compose(temp,in);
/*数据输入*/
input=sequence(input,temp);
p=input;
while(p!=NULL)
if(p->next!=NULL)
printf("%d ",p->serial);
else
printf("%d\n",p->serial);/*数据输出*/
q=p;
p=p->next;
return 0;
LIST *insert(LIST *input,int in)/*生成未排序的链表*/
LIST *p,*q;
p=(LIST *)malloc(sizeof(LIST *));
p->num=in;
p->serial=0;
p->next=NULL;
if(input==NULL)
return p;
else
q=input;
while(q->next!=NULL)
q=q->next;
q->next=p;
return input;
LIST *compose(LIST *temp,int in)/*生成排序后的链表*/
LIST *p,*q,*r;
p=(LIST *)malloc(sizeof(LIST *));
p->num=in;
p->serial=0;
p->next=NULL;
if(temp==NULL||in<temp->num)
p->next=temp;
temp=p;
return temp;
else
q=temp;
while(q!=NULL&&in>=q->num)
r=q;
q=q->next;
p->next=q;
r->next=p;
return temp;
LIST *sequence(LIST *input,LIST *temp)/*生成数据的序号*/
LIST *p,*q,*r;
int i=0;
p=temp;
q=NULL;
while (p!=NULL)
if(q==NULL||p->num>q->num)
p->serial=++i;
q=p;
p=p->next;
r=input;
while(r!=NULL)
p=temp;
while(p!=NULL)
if(r->num==p->num)
r->serial=p->serial;
break;
p=p->next;
r=r->next;
return input;
三楼给的不是这个问题的解答吧?
多年不用,忘了。。。 参考技术B zhe ge wen ti hen nan 参考技术C #include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
class op
public:
op(vector<int>& _seq) : seq(_seq)
void operator ()(int elems)
cout << count(seq.begin(), seq.end(), elems) << ' ';
private:
vector<int>& seq;
;
int main()
vector<int> seq;
cout << "输入任意数以空格格开, ctrl + z结束:\n";
copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter(seq));
cin.clear();
cin.ignore(1);
cout << "输入一个数N: ";
int input;
cin >> input;
for_each(seq.begin(), seq.begin() + input + 1, op(seq));
输入任意数以空格格开, ctrl + z结束:
1 2 2 3 4^Z
输入一个数N: 4
1 2 2 1 1
学习心得------C语言复杂数据类型
---恢复内容开始---
在学习c语言的过程中,最复杂的知识便是标题中的复杂数据类型了,因为包括了数组,字符串,指针等多种数据类型,在这一环节中,我们不免要接触到内存,分析出该数据类型的在内存中的存储方法,就可以比较明确的认识到该类型的运行原理,下面就分析一下我在学习该视频中的学习心得吧。
一、数组
1.数组,从字面上看,就是一组数据的意思,是的,数组的作用就是用来存储一组数据的。数组的特点是只能存放同一类型的数据,比如int 比如double。
2.数组的格式,元素类型 数组名[元素个数] 比如 int age[3];
3.数组的简单使用,数组的初始化为:int age[3]={0,1,2}; 值得注意的是,数组的下标是从0开始而不是1,所以数组的最后一个元素的下标永远是数组元素-1。
1 #include<studio.h> 2 int main() 3 { 4 int age[3]={1,2,3}; 5 int age[3]={1,2};// 可以只赋值前面部分元素 6 int age[]={1,2,3};//可以不写清元素个数,系统自动根据元素个数定义 7 int age[3]={[1]=1,[2]=2}; //这是直接给第2和3个元素赋值 8 //这几种都是正确写法 9 10 /*常见错误 11 int a[]; 12 int[3] a; 13 int a[b]; 14 a = {10, 11}; 15 a[3] = {10,9,8,}; 16 17 18 */ 19 return 0; 20 }
4.(1)数组的内存分析,数组分配的空间大小是根据数据类型所占据的字节数*元素个数来决定的。
(2)存储空间的划分(内存的分配是从高地址到低地址进行的,但一个数组内部元素又是从低到高进行的)
(3)数组名就是数组的地址
(4)如果计算数组元素的个数:可以用sizeof(数组名)/sizeof(数组元素的数据类型)即可得到元素个数
5数组作为函数传递时,因为是地址的传递,所以与以前的基本数据类型的值传递有很大区别,我们可以通过下面的代码来认识一下。
1 void change(int array[]) 2 { 3 printf("array==%p\n",array); //输出数组的地址不用&,数组名就代表数组的地址 4 array[0]=100; 5 } 6 7 void change2(int n) 8 { 9 n= 100; 10 } 11 12 int main 13 { 14 int age[5]={1,2,3,4,5}; 15 int a=10; 16 change(age); 17 change2(a); 18 printf("age[0]==d%",age[0]);//此处输出100,因为数组的传递是地址传递,函数内更改的数据值相当于更改了该地址的数据值 19 printf("a==d%",a);//此处输出为10,基本数据类型的数据传递村纯粹是值传递。 20 21 return 0; 22 }
下面是一个关于数组的综合练习例子,设计一个函数,找出整型数组的最小值
// 设计一个函数,找出整型数组元素的最小值 #include <stdio.h> /* * 定义函数需要两个参数,一个是数组,一个是数组长度 */ int minOfArray (int array[], int length) { // 定义一个变量存储最小值(默认是首元素) int min = array[0]; // 遍历所有元素,找出最小值 for(int i = 1; i<length; i++) { if(array[i] < min) // 判断当前元素是否小于min { min = array[i];// 如果当前元素小于min,就用当前元素覆盖min。 } } // 返回最小值 return min; } int main() { // 整型的数组 int ages[] = {43, 12, 103, 69, 76, 25, 16}; int len = sizeof(ages)/sizeof(int); // 计算数组长度 int min = minOfArray(ages, len);// 调用minOfArray函数 printf("最小值是:%d\n", min); // 输出最小值 return 0; }
---恢复内容结束---
以上是关于C语言问题,比较复杂的主要内容,如果未能解决你的问题,请参考以下文章