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);
}