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;

三楼给的不是这个问题的解答吧?

参考技术A 链表?指针变量?二叉树?
多年不用,忘了。。。
参考技术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语言问题,比较复杂的主要内容,如果未能解决你的问题,请参考以下文章

学习心得------C语言复杂数据类型

题外话:Lua脚本语言存在的意义

C语言10个数字判断问题

如何用C语言将输入的数字转化成英语

C语言操作yaml配置文件通用操作工具

C语言的OOP(面向对象)编程