首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一点C语言小疑点

2012-03-02 
一点C语言小问题我想弄一个数组,然后保存了些数字,然后我想用一个函数来查找出你想要删除的数字,还有用一

一点C语言小问题
我想弄一个数组,然后保存了些数字,然后我想用一个函数来查找出你想要删除的数字,还有用一个函数来插入你想插入的数字。
比如在main()函数我定义了一个数组,里面有10个元素,有可能10个元素都不一样,也有可能10个元素有些是一样的,然后我用一个函数来删除掉我想删除的数字,比如,数组里有两个5,然后想删除的是5,这样就删除了两个元素,所以数组就只剩8个元素了(记住main函数里的数组空间可要分配10个元素的空间,删除后是8个元素的空间就够了)。插入元素也是一样,比如main函数有10个元素的空间,我想在插入两个元素,所以,main函数的里的数组就要从10个元素空间增加到12个元素的空间。
说白了就是要动态实现数组的增加和减号。而且是不能浪费空间的,比如删除后剩8个元素,我现在就只想要8个元素的空间就够了。大神们最好给个代码吧,要是不行,给个思路也行。最好是代码

[解决办法]

C/C++ code
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语言版本的了,注意我的删除插入都是针对初始数组的。其实就是需要动态分配内存了。







热点排行