当前位置: 代码迷 >> C语言 >> 大家好啊 有几个问题想请教大家
  详细解决方案

大家好啊 有几个问题想请教大家

热度:212   发布时间:2006-08-08 22:48:57.0

#include<stdio.h>
#define N 100
typedef struct {
int key;
int flag;
}list;

int delete_same(list a[],int n)
{
int i,j,k=0;
for(i=1;i<n;i++)
{
for(j=i-1;j>=0;j--)
{
if(a[i].key==a[j].key)
{
a[i].flag=0;//标记置为0表示重复
k++;
}
}
}
return(n-k+1);
}

void pailie(list a[],int n,int m)
{
int i,j,k,min;
for(i=1;i<=m;i++)
{
j=0;
k=0;
min=32767;
while(j<n) //每次选择最小值
{
if(a[j].flag==-1&&a[j].key<min)
{
min=a[j].key;//min保存当前最小值
k=j;//k保存当前最小值的位置
}
j++;
}
a[k].flag=i;//排列大小
//printf("%-3d%-3d\n",k,a[k].flag);
}
}

int main()
{
list data[N];
int i,n,m;
printf("输入元素个数,不超过%d:",N);
scanf("%d",&n);
printf("输入数组元素:");
for(i=0;i<n;i++)
{
scanf("%d",&data[i].key);
data[i].flag=-1;
}
m=delete_same(data, n);//m表示当前数组中互不相同的元素个数
printf("序列:");
for(i=0;i<n;i++)
{
if(data[i].flag!=0)
printf("%-3d",data[i].key);
}
printf("\n");
pailie(data,n,m);//做静态链表的标记
printf("编号:");
for(i=0;i<n;i++)
{
if(data[i].flag!=0)
printf("%-3d",data[i].flag);
}
printf("\n");
return(0);
}


----------------解决方案--------------------------------------------------------
看后有些~~~~~~~~~~~~~~~晕
----------------解决方案--------------------------------------------------------
用於识别大括号("{}")的函数,不用递归的方法,可以尝试改造一下 :)

int quotes(const char *express)
{
unsigned long i;
unsigned long leftquote=0;
unsigned long express_len;
express_len=strlen(express);

for (i=0;i<express_len;i++) {
if (express[i]=='{') {
leftquote++;
}
if (express[i]=='}') {
if (leftquote==0) {return -1;}else{leftquote--;}
}
}
if (leftquote==0){return 0;}else{return -1;}
}

----------------解决方案--------------------------------------------------------
看程序结合我说的思路看,可能更好受点,呵呵,写的程序很垃圾,连我自己看着也难受
----------------解决方案--------------------------------------------------------

nuc 编的程序有没有用到C++啊 有些地方在C书上找不到


----------------解决方案--------------------------------------------------------
以下是引用yangmingym在2006-8-10 8:49:19的发言:

nuc 编的程序有没有用到C++啊 有些地方在C书上找不到

哪里,楼主你指出来一下,我学过C++,不知道会不会加点什么在里面.我查查.
----------------解决方案--------------------------------------------------------
我看一下,前两个程序,是我学数据结构时候写的,那时还没有学C++,第3个,也没有.
只有注释符不是C中的.
还有exit()之类的都是c中的,只是见的少.
----------------解决方案--------------------------------------------------------

以下是引用nuciewth在2006-8-8 22:48:31的发言:

第二题,写的不好,只能想到这样了,望各位想个好方法.

我下午没事做写了个,呵呵,我刚看了下您的程序,下面这个应该比您快些.

#include "Stdio.h"
#include "Conio.h"
#include "stdlib.h"
typedef struct NODE
{
int data; /*数据成员*/
int pos; /*编号成员*/
struct NODE *next;
}node;
/*
函数入口参数:表头,刚输入数据的节点,此时还没和链表建立连接;
函数功能:查找前面节点是否有和即将插入的节点(即第二个参数)data成员相同,
如果有,返回1;如果没有,再次遍历链表,遇到节点data成员大于pt的
data成员的话,则把该节点的pos成员加1,否则把pt->pos++。
函数出口:返回是否找到与pt节点data数据一致的节点情况,找到返回1,否则返回0。
*/
int search(node *head,node *pt)
{
node *p=head;
int tag=1;
for(;p&&tag;p->data==pt->data?(tag=0,p=p->next):(p=p->next));
if(tag)for(p=head;p;(p->data)>(pt->data)?(p->pos++):(pt->pos++),p=p->next);
return (1-tag);
}
node *creat(node *head)
{
node *p=NULL,*q=NULL;
int flag=1;
puts("Input the test datas:");
while(1)
{
if((p=(node *)malloc(sizeof(node)))==NULL)exit(1);
scanf("%d",&p->data);
p->next=NULL;
if(p->data==-1)
{
p=NULL;
return head;
}
else
{
p->pos=1;
flag?(head=p,flag=0,q=head):(search(head,p)?(free(p)):(q->next=p,q=p));
}
}
}
void Print(node *head)
{
node *p=head;
while(p)
printf("%-6d",p->data),p=p->next;
p=head,putchar('\n');
while(p)
printf("%-6d",p->pos),p=p->next;
}
void Free(node **head)
{
node *p=*head;
while(*head)
p=*head,*head=(*head)->next,free(p);
}
int main(void)
{
node *head=NULL;
head=creat(head);
Print(head);
Free(&head);
getch();
return 0;
}
----------------解决方案--------------------------------------------------------
动态链表和静态链表
楼主好好看看楼上的.
----------------解决方案--------------------------------------------------------