一点C语言小问题

天台的故事 2012-01-11 07:58:55
我想弄一个数组,然后保存了些数字,然后我想用一个函数来查找出你想要删除的数字,还有用一个函数来插入你想插入的数字。
比如在main()函数我定义了一个数组,里面有10个元素,有可能10个元素都不一样,也有可能10个元素有些是一样的,然后我用一个函数来删除掉我想删除的数字,比如,数组里有两个5,然后想删除的是5,这样就删除了两个元素,所以数组就只剩8个元素了(记住main函数里的数组空间可要分配10个元素的空间,删除后是8个元素的空间就够了)。插入元素也是一样,比如main函数有10个元素的空间,我想在插入两个元素,所以,main函数的里的数组就要从10个元素空间增加到12个元素的空间。
说白了就是要动态实现数组的增加和减号。而且是不能浪费空间的,比如删除后剩8个元素,我现在就只想要8个元素的空间就够了。大神们最好给个代码吧,要是不行,给个思路也行。最好是代码
...全文
106 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
JackBurd 2012-01-11
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>

void Print(int *a,int n) //输出
{
for(int i=0;i<n;i++)
printf("%d\t",a[i]);
printf("\n");
}

void Sort(int *a,int n) //排序
{
int temp;
for(int i=0;i<n-1;i++)
for(int j=0;j<n-i-1;j++)
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}

int Search(int *a,int n,int m) //搜索
{
int low=0,high=n-1,mid;
do
{
mid=(low+high)/2;
if(m==a[mid])
return mid;
else if(m<a[mid])
high=mid-1;
else
low=mid+1;
}while(low<=high);
return -1;
}

void Insert(int *a,int n,int *c,int m) //插入m个数字
{
int *b=NULL;
if((b=(int*)malloc((n+m)*sizeof(int)))==NULL)
exit(1);
for(int i=0;i<n;i++)
b[i]=a[i];
for(int k=0;k<m;k++)
{
for(i=0;i<n+k;i++)
if(c[k]<b[i])
{
for(int j=n-1+k;j>=i;j--)
b[j+1]=b[j];break;
}
b[i]=c[k];
}
Print(b,n+m);
free(b);
}

void Delete(int *a,int n,int m)
{
for(int i=0,j=0;i<n;i++)
if(a[i]!=m)
a[j++]=a[i];
if(j)
Print(a,j);
else
printf("您要删除的数字不存在,故无法删除!\n");
}

void main()
{
int *a=NULL,b,*c=NULL,flag=1,m,n,x,i=0,k;
printf("请您输入数组的长度:");
scanf("%d",&b);
if((a=(int*)malloc(b*sizeof(int)))==NULL)
exit(1);
printf("请您输入这%d个数组元素(负数作为结束标志)\n",b);
scanf("%d",&x);
while(x>=0)
{
if(i<b)
{
a[i]=x;
i++;
scanf("%d",&x);
}
}
printf("\n");
Sort(a,b);
Print(a,b);
flag=1;
while(flag)
{
while(flag)
{
printf("请您输入需要查询的数字:");
scanf("%d",&m);
if(Search(a,b,m)==-1)
printf("This number is not available in this Array\n");
else
printf("This is the %dth number\n",Search(a,b,m)+1);
printf("继续查询?Y or N\n");
getchar();
if(getchar()=='Y')
flag=1;
else
flag=0;
}
flag=1;
while(flag)
{
printf("请输入插入数字的个数:");
scanf("%d",&n);
if((c=(int*)malloc(n*sizeof(int)))==NULL)
exit(1);
printf("请您输入需要插入的数字:");
for(int i=0;i<n;i++)
scanf("%d",c+i);
Insert(a,b,c,n);
printf("继续插入?Y or N\n");
getchar();
if(getchar()=='Y')
flag=1;
else
{
printf("查询和插入结束!\n");
flag=0;
}
}
}
printf("请输入您要删除的数字:");
scanf("%d",&k);
Delete(a,b,k);
free(a);
free(c);
}
我改成C语言版本的了,注意我的删除插入都是针对初始数组的。其实就是需要动态分配内存了。







鲤鱼 2012-01-11
  • 打赏
  • 举报
回复
需要动态创建就得用链表吧!每次创建和删除一个元素空间!
gfzeng 2012-01-11
  • 打赏
  • 举报
回复

typedef struct node
{
int n;
struct node *next;
}
node;
#include "cs50.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <windows.h>



// linked list
node *first = NULL;


// prototypes
void delete(void);
void find(void);
void insert(void);
void traverse(void);


int
main(void)
{
int c;
do
{
// print instructions
printf("\nMENU\n\n"
"1 - delete\n"
"2 - find\n"
"3 - insert\n"
"4 - traverse\n"
"0 - quit\n\n");

// get command
printf("Command: ");
c = GetInt();

// try to execute command
switch (c)
{
case 1: delete(); break;
case 2: find(); break;
case 3: insert(); break;
case 4: traverse(); break;
}
}
while (c != 0);

// free list before quitting
node *ptr = first;
while (ptr != NULL)
{
node *predptr = ptr;
ptr = ptr->next;
free(predptr);
}
return 0;
}


/*
* Tries to delete a number.
*/

void
delete(void)
{
// prompt user for number
printf("Number to delete: ");
int n = GetInt();

// get list's first node
node *ptr = first;

// try to delete number from list
node *predptr = NULL;
while (ptr != NULL)
{
// check for number
if (ptr->n == n)
{
// delete from head
if (ptr == first)
{
first = ptr->next;
free(ptr);
}

// delete from middle or tail
else
{
predptr->next = ptr->next;
free(ptr);
}

// all done
break;
}
else
{
predptr = ptr;
ptr = ptr->next;
}
}

// traverse list
traverse();
}


/*
* Tries to insert a number into list.
*/

void
insert(void)
{
// try to instantiate node for number
node *newptr = malloc(sizeof(node));
if (newptr == NULL)
return;

// initialize node
printf("Number to insert: ");
newptr->n = GetInt();
newptr->next = NULL;

// check for empty list
if (first == NULL)
first = newptr;

// else check if number belongs at list's head
else if (newptr->n < first->n)
{
newptr->next = first;
first = newptr;
}

// else try to insert number in middle or tail
else
{
node *predptr = first;
while (true)
{
// avoid duplicates
if (predptr->n == newptr->n)
{
free(newptr);
break;
}

// check for insertion at tail
else if (predptr->next == NULL)
{
predptr->next = newptr;
break;
}

// check for insertion in middle
else if (predptr->next->n > newptr->n)
{
newptr->next = predptr->next;
predptr->next = newptr;
break;
}

// update pointer
predptr = predptr->next;
}
}

// traverse list
traverse();
}


/*
* Tries to find a number in list.
*/

void
find(void)
{
// prompt user for number
printf("Number to find: ");
int n = GetInt();

// get list's first node
node *ptr = first;

// try to find number
while (ptr != NULL)
{
if (ptr->n == n)
{
printf("\nFound %d!\n", n);
Sleep(1000);
break;
}
ptr = ptr->next;
}
}


/*
* Traverses list, printing its numbers.
*/
void
traverse(void)
{
// traverse list
printf("\nLIST IS NOW: ");
node *ptr = first;
while (ptr != NULL)
{
printf("%d ", ptr->n);
ptr = ptr->next;
}

// flush standard output since we haven't outputted any newlines yet
fflush(stdout);

// pause before continuing
Sleep(1000);
printf("\n\n");
}

这个稍稍修改就是你要的了
gfzeng 2012-01-11
  • 打赏
  • 举报
回复
楼上的哥们, 你这个也台复杂了吧。 如果空间是动态的就用指针吧, 应该用链表。
JackBurd 2012-01-11
  • 打赏
  • 举报
回复
#include<iostream>
#include<cassert>
class Array
{
public:
static void Sort(int *a,int n);
static int Search(int *a,int n,int m);
static void Insert(int *a,int n,int *c,int m);
static void Print(int *a,int n);
static void Delete(int *a,int n,int m);
};
void Array::Print(int *a,int n) //输出
{
for(int i=0;i<n;i++)
std::cout<<a[i]<<"\t";
std::cout<<"\n";
}
void Array::Sort(int *a,int n) //排序
{
int temp;
for(int i=0;i<n-1;i++)
for(int j=0;j<n-i-1;j++)
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
int Array::Search(int *a,int n,int m) //搜索
{
int low=0,high=n-1,mid;
do
{
mid=(low+high)/2;
if(m==a[mid])
return mid;
else if(m<a[mid])
high=mid-1;
else
low=mid+1;
}while(low<=high);
return -1;
}
void Array::Insert(int *a,int n,int *c,int m) //删除m个数字
{
int *b=new int[n+m];
for(int i=0;i<n;i++)
b[i]=a[i];
for(int k=0;k<m;k++)
{
for(i=0;i<n+k;i++)
if(c[k]<b[i])
{
for(int j=n-1+k;j>=i;j--)
b[j+1]=b[j];break;
}
b[i]=c[k];
}
Array::Print(b,n+m);
delete[] b;
}
void Array::Delete(int *a,int n,int m)
{
for(int i=0,j=0;i<n;i++)
if(a[i]!=m)
a[j++]=a[i];
if(j)
Array::Print(a,j);
else
std::cout<<"您要删除的数字不存在,故无法删除!\n";
}
void main()
{
int *a,b,*c,flag=1,m,n,x,i=0,k;
std::cout<<"请您输入数组的长度:";
std::cin>>b;
a=new int[b];
assert(a!=NULL);
std::cout<<"请您输入这"<<b<<"个数组元素(负数作为结束标志)\n";
std::cin>>x;
while(x>=0)
{
if(i<b)
{
a[i]=x;
i++;
std::cin>>x;
}
}
std::cout<<"\n";
Array::Sort(a,b);
Array::Print(a,b);
flag=1;
while(flag)
{
while(flag)
{
std::cout<<"请您输入需要查询的数字:";
std::cin>>m;
if(Array::Search(a,b,m)==-1)
std::cout<<"This number is not available in this Array"<<"\n";
else
std::cout<<"This is the "<<(Array::Search(a,b,m)+1)<<"th number"<<"\n";
std::cout<<"继续查询?Y or N\n";
getchar();
if(getchar()=='Y')
flag=1;
else
flag=0;
}
flag=1;
while(flag)
{
std::cout<<"请输入插入数字的个数:";
std::cin>>n;
c=new int[n];
assert(c!=NULL);
std::cout<<"请您输入需要插入的数字:";
for(int i=0;i<n;i++)
std::cin>>c[i];
Array::Insert(a,b,c,n);
std::cout<<"继续插入?Y or N\n";
getchar();
if(getchar()=='Y')
flag=1;
else
{
std::cout<<"查询和插入结束!"<<"\n";
flag=0;
}
}
}
std::cout<<"请输入您要删除的数字:";
std::cin>>k;
Array::Delete(a,b,k);
delete[] a;
delete[] c;
}
我以前写的,完全符合你的要求,还有其他功能。






70,025

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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