c语言结构体删除
A. c语言 结构体元素删除
#include<stdio.h>
structPeople
{
intNo;
intage;
};
intmain()
{
structPeopleStus[5]={{1,34},{2,23},{3,25},{4,28},{5,31}};
inti,id,k=0;
scanf("%d",&id);
for(i=0;i<5;i++)
{
if(id==Stus[i].No)
k=1;
if(k)
Stus[i]=Stus[i+1];
}
k=0;
for(i=0;i<4;i++)
{
printf("%d%d ",Stus[i].No,Stus[i].age);
}
return1;
}//解决请采纳
B. 高分求助,C语言中关于结构体数组中,学生信息的删除
void del(void)
{
FILE *fp;
char a[10];
char ch;
int i,j,k;
system("cls");
printf("请输入要删除的学生姓名:");
scanf("%s",a);
system("cls");
fp=fopen("F:\\x.txt","r");
for(i=0;i<count;i++)//找到删除人所在的位置
{
fscanf(fp,"%s %d %d %d %d\n",s[i].name,&s[i].no,&s[i].score1,&s[i].score2,&s[i].score3);
if(!strcmp(s[i].name ,a))
{
printf("\t\t姓名 %s 学号 %d 成绩1 %d 成绩2 %d 成绩3 %d\n",s[i].name ,s[i].no ,s[i].score1 ,s[i].score2 ,s[i].score3 );
printf(" \t\t\t该同学的信息已成功删除!\n");
printf("\n");
break;
}
}
fclose(fp);
if(i==count)
{
printf("\t\t很抱歉,没有您所要查找的同学记录!\n");
printf("\n");
}
else
{
for(j=i;j<count-1;j++)
{
for(k=0;k<10;k++)
{
s[j].name[k]=s[j+1].name[k];
}
s[j].no=s[j+1].no;
s[j].score1=s[j+1].score1;s[j].score2=s[j+1].score2;s[j].score3=s[j+1].score3;
}
fp=fopen("F:\\x.txt","w");
fclose(fp);
fp=fopen("F:\\x.txt","a");
for(j=0;j<2;j++)
{
fprintf(fp,"%s %d %d %d %d\n",s[j].name,s[j].no,s[j].score1,s[j].score2,s[j].score3);
}
fclose(fp);
}
count=count-1;
}
这是我以前做的时候的代码,基本思想已经有了,将学籍信息从文件载入到结构体中,就是找到要删除的同学所在的位置,然后从该同学后面将其他人的信息依次向前挪一个,实现对该同学信息的覆盖。最后再将修改后的信息在重新存到文件中。
将文件中的内容读到结构体中时一开始就做了。设置了一个全局变量count,用于记录动态变化的学生的人数,每次操作完成后将count的值写到另一个文件夹中。每次程序开始执行时也要读入count 的值。
C. C语言结构数组删除!
对于数组删除,一般就是使用后面数组元素前移的操作,来覆盖前一元素,达到删除的效果。。。。
例如数组a[10],要删除a[5]这个元素,那么只需要把后面的元素前移一位就行了,也就是a[5]=a[6],a[6]=a[7],a[7]=a[8],这样子a[5]这个元素的内容就会被全部抹杀掉了。。。。
不过这里存在一个问题,你一个结构体数组前移的时候,如何判断有多少个元素要前移呢。。。。
所以我的做法是在结构体里面定义一个标示符int flag。。。。
当对这个结构体数组元素赋值时,如a[10].name="KING" 时,那么就是说下标值为10的元素是存在的,赋完值后,来个a[10].flag=1 来标记一下。。。。
这样做的话,我们可以进行这样的删除操作了,如删除下标值为5的元素——
int i=5;
for(int j=i+1;a[j].flag==1;i++,j++)
{
a[i]=a[j];
/* 结构体数组可以直接这样子做,它会自动把a[i]里面的变量等于a[j]里面对应的变量 */
}
a[i].flag=0;
/* 如果你里面原来有10个元素,那么删除了其中一个,那就剩下9个,a[9]那个位置应该为空,一一把里面的元素清空太麻烦,直接把它的标示符flag等于0,就表示该位置为空的 */
D. C语言。怎么删除结构体里的某个成员,就是增删改查里的删我只学到结构体。
例如
struct student s[10];
想要删除s[5],只需将其之后的元素依次往前移将前一个元素覆盖就好了,然后最后一个元素不用就行了!
E. C语言结构体指针 删除函数 为什么删除后会显示0 麻烦各位大神速度指点一下~~
void Delete() { //删除信息函数
FILE *fp;
fp = fopen("student.txt","r");//默认以文本方式打开
char choose;
char name[20];
p = s1;
int i = 0;
fread(p,sizeof(Student),1,fp);// 块状读取文本文件是不合适的
printf("请输入删除学生姓名:");
scanf("%s",&name);
while(strcmp(name,p->Name) && p) //判断该学生信息是否存在
p++;i++; if(p != NULL) {
printf("学号 姓名 性别 语文 数学 英语 体育 C语言 总分 名次\n"); printf("%-6d%6s%6s%6d%6d%6d%6d%6d%7d%6d\n",p->Num,p->Name,p->Sex, p->Chinese,p->Math,p->English,p->PE,p->Clanguage,p->total,p->rank);
fp = fopen("student.txt","w");//默认以文本方式打开,fp已经用作文件student.txt,
printf("\n是否删除(Y/N)");
scanf("%s",&choose); // choose是char变量,应该用"%c"读取
if(choose=='y'||choose=='Y') {
for(i = i;i < N;i++) {
s1[i] = s1[i + 1]; // 这里删除的是第一条记录,不一定是要删除的那一条
} printf("删除成功!\n");
fwrite(p,sizeof(struct Student),1,fp);// 块状写文本文件是不合适的
}
}
else printf("没有此人信息。");
printf("\n1.返回主菜单\n2.继续删除");
scanf("%s",&choose); // 还是老问题
if(choose=='1') Menu();
else if(choose=='2') Delete(); // 递归调用会出问题的,这儿必须改 //
.................
}
F. C语言程序,怎么在结构体链表中插入或者删除某个结构体
没学过数据结构?那你们老师在干嘛?数据结构不应该是和语言同步进行的吗?
struct A //这就是个结构体,包含数据域和指针域
{
int a;//数据域,可以是任何类百型的。
char b;//数据域
A *p;//指针域,就是struct A类型。
};链表,一般是动态的。你要静态的就不用malloc分配就行了。定义N个struct
A就行了。
struct A a1;
struct A a2;
struct A a3;
struct A a4;
//a1作为第一个节点
a1->next = a2;
a2->next = a3;
a3->next = a4;
a4->next = NULL;
//插入,在a2后面插入a5
struct A a5;
a5->next = a2->next;
a2->next = a5;//注意指针的赋值顺序。虽然全部是度静态的问题不大。动态分配的时候不仔细会造成断链,内存溢出。
//删除a5
a2->next = a5->next;//静态不存在释放的问题,动态申请的请释放a5;
G. 在C语言中,怎么删除一个结构体数组中的数据
满意答案null6级2010-12-10你是想单纯的删除 ,还是注销这个结构体的这一项啊 追问: 把结构体中存的所有数据删除 回答: 要是是int型的我们一般把它等于0要是是指针型的一般是把他指向空指针NULLstruct A{int a;char *b;}dd;main(){dd.a=0; dd.b==NULL;}可是这么做好像没事意思,你能告诉我你是想干嘛吗 追问: 学生信息管理系统中有一个结构体数组,存有学生姓名char(20),学号int,等信息,要实现该程序的全部删除功能 回答: 那可以像上面我教的的那样,其实就是用0和NULL把原来的值给覆盖了,原来的数据自然就没有了,也就是实现了你的删除的目的!
H. c语言中如何删除结构体数组中的一个值
结构体同样可以看做一个基本数据类型。
删除结构体数组中的一个值,就像删除一个普通数组中的值一样的。
普通数组的删除是将后面的数据向前移动,达到覆盖掉的效果
比如:a[4]要删除第二个元素。那么把a[1] = a[2];a[2] = a[3];
最后一个不要动,也最好别去访问它,就相当于把第二个元素删除了。
结构体跟上面类似,但是结构体是你自定义的数据,所以在定义中,你要给它重载赋值符号(也就是=),要不然赋值的过程中会出错
I. c语言结构体链表的节点删除问题 求助大佬
这个出错点在行 while() 循环之后的那一句: free(l->tail); 第一段程序,其实在 while() 循环里面已经把全部节点都释放了,包括尾节点,所以第一段程序不需要再释放一次 l->tail,只需要保留 l->tail = NULL; 即可。 第二段程序,因为最后一个...
2019-10-14回答者:隐世高手0074个回答
c语言中删除链表指定节点的一些问题?
问:struct student *Del (struct student *head, int num) { struct studen...
答:你仔细看看 while (p1->num != num && p1->next != NULL) 这一句之前的代码 p2什么时候赋值过? 而且if (p2 == head) //如果要删除的节点是第一个节点 既然是第一个节点,那么 while (p1->num != num && p1->next != NULL) 这个循环一次都没有执...
2015-10-20回答者:知道网友1个回答2
C语言数据结构的链表删除与查找问题~~,实在是被弄...
问:#include "stdlib.h" #include "stdio.h" typedef struct node{ //链表...
答:#include #include typedef struct LNode {char character; struct LNode*next; }LNode,*PLNode; PLNode CreateList()/*创建单链表*/ {PLNode P,head,q; int i; head=(PLNode)malloc(sizeof(LNode)); p=head; p->next=NULL; for(i=0;icharacter=...
2010-11-25回答者:qjbrh532个回答
C语言删除链表结点 结点结构如下
问:#define ELEMTYPE char typdef struct node { ELEMTYPE date; struct no...
答:我提供思路哈,你自己写一下,这个不难的。 分为两种情况: 1、删除的是头结点,这又可以分为两种情况:a)若是链表只有一个头结点,那么删除后头结点为NULL;b)若是链表不止一个节点,那么head指针指向头结点下一个节点。两种情况都要free 之...
J. c语言删除结构体中的某一元素
额。。。我看看。。。
//pil[n] 首先这个数组没有定义。。。。你先看看,是用它来记录文件信息的。。。你定义的应该是个全局变量吧??
void dele_name()
{ FILE *fp;
int i,j,n;
char name[10];
if((fp=fopen("pil","rb"))==NULL){printf("不能打开pil文件\n"); exit(1);}
printf("删除前\n");
printf("记录号: 入住时间 房间号 姓名 性别 床位数 费用 身份证号<Enter>\n");
//将所有的信息“ 都 “写入了pil[n] 数组;都写入了你看到没??
for(n=0;fread(&pil[n],sizeof(struct pilot),1,fp);n++)
printf("%6d%10s%7s%7s%7s%7d%9d%20s\n",n+1,pil[n].time,pil[n].no,pil[n].name,
pil[n].sex,pil[n].shu,pil[n].money,pil[n].id);
printf("要删除的旅客姓名:");scanf("%s",name);
//额。。。。这个for的空循环,通过strcmp(pil[i].name,name来寻找
//要删除的人的信息;如果找到了,就退出,但是此时记录了该项在pil[n]的下标值,即就是该元组是文件里的第 i 项;是个关键;
for(i=0;(strcmp(pil[i].name,name)!=0&&i<n);i++)
fclose(fp);
//这里思想很简单,就是把 前 0 ~ (i-1)项 和 (i +1)~最后一项 重新写入文件。。。相当于删除了第 i 项。。。
fp=fopen("pil","w+"); //以 “W+"方式打开,你看看规则,
//好像是清除了文件里的信息了吧。。这个不是很清除,不过就逻辑来看,应该就是这样的了。。。
for(j=0;j<i;j++)
fwrite(&pil[j],sizeof(struct pilot),1,fp);
for(j=i+1;j<n;j++)
fwrite(&pil[j],sizeof(struct pilot),1,fp);
fseek(fp,0,SEEK_SET);
if(i<n)
printf("删除成功!");
else
//额。。。这里说一下,你这个 判断应该放在上边我觉得。。。因为如果没找到这个人,那么你应该直接退出,而不是将文件重新写一遍。。浪费时间了。。。
printf("没有此人!");
fclose(fp);
}