标题:[求助]我有一个结构体数组,如何写如下删除函数?
只看楼主
pinglideyu
Rank: 3Rank: 3
来 自:武汉工程大学
等 级:论坛游侠
威 望:1
帖 子:735
专家分:140
注 册:2007-1-7
结帖率:100%
 问题点数:0 回复次数:9 
[求助]我有一个结构体数组,如何写如下删除函数?
我有一结构体如下:
const int M=100;
struct members
{
char name[10];
char sex[5];
int money;
int member;
}mem[M];
说明:
name (名字),sex(性别),money(工资),member(工号)
然后呢,我输入了一些数据如下:
1 guwenjie nan 1300
8 lifei nan 1200
5 heben nan 1500
2 lihuifang nv 1000
假设,我现在要删除工号为2的人的信息,该如何写这样一个函数?
正在郁闷中。。。。。。。
搜索更多相关主题的帖子: 结构体 函数 工资 nan name 
2007-10-11 22:01
奔跑的鸟
Rank: 1
等 级:新手上路
帖 子:391
专家分:0
注 册:2006-1-20
得分:0 
保留工人2的信息位置不?保留就赋值清零,不保留就弄个循环,依次把后面的工人信息前移一位(后一个给前一个辅值),这样可以么?

简单的快乐着~
2007-10-11 22:09
pinglideyu
Rank: 3Rank: 3
来 自:武汉工程大学
等 级:论坛游侠
威 望:1
帖 子:735
专家分:140
注 册:2007-1-7
得分:0 
我也知道是这样,关键是我不知道如何表达。还烦请各们指点迷津
删除后应该输出如下:
1 guwenjie nan 1300
8 lifei nan 1200
5 heben nan 1500
的确,不用保留2的位置,但我不想把它清0,就删除就行了。
我用的是顺序表做的,不用链表。

~~我的明天我知道~~
2007-10-11 22:24
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
得分:0 
同上,可用链表来实现如果要保留数据:
用一个指针指向要删除的点,当前指针指向下一个,
当要恢复是在插入该指针

方寸之内,剖天下; 方坛之内,析自我;
2007-10-11 22:27
pinglideyu
Rank: 3Rank: 3
来 自:武汉工程大学
等 级:论坛游侠
威 望:1
帖 子:735
专家分:140
注 册:2007-1-7
得分:0 
我也知道用链表来实现删除操作是很简单的,可关键的是,我现在是用顺序表做的好不好。所以,麻烦在看看吧。

~~我的明天我知道~~
2007-10-11 22:35
wooginluers
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2007-10-10
得分:0 

我给你发一个。教程上的单链表删除函数。
#include <stdio.h>
#include <malloc.h>
#include <string.h> /*包含一些字符串处理函数的头文件*/
#define N 10

typedef struct node
{
char name[20];
struct node *link;
}stud;

stud * creat(int n) /*建立链表的函数*/
{
stud *p,*h,*s;
int i;
if((h=(stud *)malloc(sizeof(stud)))==NULL)
{
printf("不能分配内存空间!");
exit(0);
}
h->name[0]='\0';
h->link=NULL;
p=h;
for(i=0;i<n;i++)
{
if((s= (stud *) malloc(sizeof(stud)))==NULL)
{
printf("不能分配内存空间!");
exit(0);
}
p->link=s;
printf("请输入第%d个人的姓名",i+1);
scanf("%s",s->name);
s->link=NULL;
p=s;
}
return(h);
}

stud * search(stud *h,char *x) /*查找链表的函数,其中h指针是链表的表头指针,x指针是要查找的人的姓名*/
{
stud *p; /*当前指针,指向要与所查找的姓名比较的结点*/
char *y; /*保存结点数据域内姓名的指针*/
p=h->link;
while(p!=NULL)
{
y=p->name;
if(strcmp(y,x)==0) /*把数据域里的姓名与所要查找的姓名比较,若相同则返回0,即条件成立*/
return(p); /*返回与所要查找结点的地址*/
else p=p->link;
}
if(p==NULL)
printf("没有查找到该数据!");
}stud * search2(stud *h,char *x) /*另一个查找函数,返回的是上一个查找函数的直接前驱结点的指针,*/
/*h为表头指针,x为指向要查找的姓名的指针*/
/*其实此函数的算法与上面的查找算法是一样的,只是多了一个指针s,并且s总是指向指针p所指向的结点的直接前驱,*/
/*结果返回s即是要查找的结点的前一个结点*/
{
stud *p,*s;
char *y;
p=h->link;
s=h;
while(p!=NULL)
{
y=p->name;
if(strcmp(y,x)==0)
return(s);
else
{
p=p->link;
s=s->link;
}
}
if(p==NULL)
printf("没有查找到该数据!");
}

void del(stud *x,stud *y) /*删除函数,其中y为要删除的结点的指针,x为要删除的结点的前一个结点的指针*/
{
stud *s;
s=y;
x->link=y->link;
free(s);
}

main()
{
int number;
char fullname[20];
stud *head,*searchpoint,*forepoint;
number=N;
head=creat(number);
printf("请输入你要删除的人的姓名:");/* 将姓名换成你的工号。*/
scanf("%s",fullname);
searchpoint=search(head,fullname);
forepoint=search2(head,fullname);
del(forepoint,searchpoint);

2007-10-11 23:52
pinglideyu
Rank: 3Rank: 3
来 自:武汉工程大学
等 级:论坛游侠
威 望:1
帖 子:735
专家分:140
注 册:2007-1-7
得分:0 
谢谢楼上的同学哦。。。
不过,我说过了,我是用顺序表做的,没有用链表。这个用链表做的,我已经做过了,而且验证是的。
我刚写了一个用顺序表做的删除模块,不过有一点小问题。在看看吧。。。。。。


/*删除信息模块*/
void dele()
{
FILE *fp;
int member,i;
char a[20];
fp=fopen("members.txt","r+");
if(fp==NULL)
{
printf("Can't create file:members.txt\n");
exit(0);
}
printf("请输入要删除的工号:");
scanf("%d",&member);
fflush(stdin);
if (member<0||member>N)
{
printf("\n删除的位置不存在!");exit(-1);
}
for (i=member;i<N-1;i++)
{
mem[i].member=mem[i+1].member;
strcpy(a,mem[i+1].name);
strcpy(mem[i].name,a);
//mem[i].name=mem[i+1].name;
strcpy(a,mem[i+1].sex);
strcpy(mem[i].sex,a);
//mem[i].sex=mem[i+1].sex;
mem[i].money=mem[i+1].money;
}
fwrite(mem,sizeof(struct members),N,fp);
rewind(fp);
fclose(fp);
//printf("*********************\n");
}
说明:
文本里的内容为:
1 guwenjie nan 1300
8 lifei nan 1200
5 heben nan 1500
2 lihuifang nv 1000
要输出的结果应该是:
1 guwenjie nan 1300
8 lifei nan 1200
5 heben nan 1500
哪位能不能用帮我纠正一下我的程序。。。。(还有不明白的地方,看贴子的开头)

~~我的明天我知道~~
2007-10-12 10:37
missiyou
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:531
专家分:218
注 册:2007-10-9
得分:0 
struct members
{
char name[10];
char sex[5];
int money;
int member;
}mem[M];
void del(struct members a[],int n)
{int i;
for(i=0;i<M;i++)
{if(mem[i]->member==2)
{for(j=i;j<M;j++)
mem[j]=mem[j+1];
return 1
}
printf("元素不在表中")
}

}
没经过测试,也不知道对不对,感觉是的就这样写了
2007-10-12 13:35
pinglideyu
Rank: 3Rank: 3
来 自:武汉工程大学
等 级:论坛游侠
威 望:1
帖 子:735
专家分:140
注 册:2007-1-7
得分:0 
哦。。。明白了

~~我的明天我知道~~
2007-10-12 14:33
ondy
Rank: 1
等 级:新手上路
威 望:1
帖 子:88
专家分:0
注 册:2007-9-4
得分:0 

if判断,如果成立,用for实现n+1个无素付给n个无素
用strcopy 函数复制
这个是员工管理系统
思路应该就是这样的吧


2007-10-13 10:33



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-176897-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028408 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved