一点C语言小问题
我想弄一个数组,然后保存了些数字,然后我想用一个函数来查找出你想要删除的数字,还有用一个函数来插入你想插入的数字。
比如在main()函数我定义了一个数组,里面有10个元素,有可能10个元素都不一样,也有可能10个元素有些是一样的,然后我用一个函数来删除掉我想删除的数字,比如,数组里有两个5,然后想删除的是5,这样就删除了两个元素,所以数组就只剩8个元素了(记住main函数里的数组空间可要分配10个元素的空间,删除后是8个元素的空间就够了)。插入元素也是一样,比如main函数有10个元素的空间,我想在插入两个元素,所以,main函数的里的数组就要从10个元素空间增加到12个元素的空间。
说白了就是要动态实现数组的增加和减号。而且是不能浪费空间的,比如删除后剩8个元素,我现在就只想要8个元素的空间就够了。大神们最好给个代码吧,要是不行,给个思路也行。最好是代码
[解决办法]
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 listnode *first = NULL;// prototypesvoid delete(void);void find(void);void insert(void);void traverse(void);intmain(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. */voiddelete(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. */voidinsert(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. */voidfind(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. */voidtraverse(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");}
[解决办法]
#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语言版本的了,注意我的删除插入都是针对初始数组的。其实就是需要动态分配内存了。