一般呢,插入和刪除函數(shù)是分開寫的,還有分成兩種存儲結(jié)構(gòu),1.順序表,2.鏈表,我給你一個我上數(shù)據(jù)結(jié)構(gòu)時候?qū)懙逆湵淼牟僮?,里面全都有,如果不會用,追問?/p>
欽北網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護(hù)。創(chuàng)新互聯(lián)建站自2013年起到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。
#includestdio.h
#includemalloc.h
#includeWindows.h
#includeconio.h
#includestdlib.h
typedef struct
{
int data;
struct LNode *next;
}LNode;
LNode *Listinit(LNode *L)//初始化鏈表返還頭指針
{
L = (LNode *)malloc(sizeof(LNode));
if (!L)return 0;
L-next = NULL;
return L;
}
int GetElem_L(LNode *L, int i, int *e)//取第i個元素
{
int j;
LNode *p;
p=L-next;j=1;
while(pji)
{
p=p-next;++j;
}
if(!p||ji) return 0;//i超過表長
*e=p-data;
return 1;
}
int ListInsert_L(LNode *L, int i, int e)//插入數(shù)據(jù)元素
{
LNode *p1 = L,*p2=L;
int j = 0;
if (i-1 LinkLength(L))
return 2;
while(p1!=NULL ji-1)
{
p1 = p1-next;
j++;
}
p2 = (LNode *)malloc(sizeof(LNode));
if (!p2)
return 0;
p2-data = e;
p2-next = p1-next;
p1-next = p2;
return 1;
}
void ClearList(LNode *L)//重置為空表
{
LNode *p;
while(L-next)
{
p=L-next;
L-next=p-next;
free(p);
}
}
void print_link(LNode *L)//輸出函數(shù)
{
LNode *p = L;
p = p-next;
while (p != NULL)
{
printf("%5d", p-data);
p = p-next;
}
}
int ListDlete_L(LNode *L, int i, int *e)//刪除L中I,并用e返回
{
int j = 0;
LNode *p1 = NULL, *p2 = NULL;
p1 = L;
while (p1-next != NULL j i - 1)
{
p1 = p1-next;
j++;
}
if (p1-next == NULL || j i - 1)
return 0;
p2 = p1-next;
p1-next = p2-next;
free(p2);
return 1;
}
int LinkLength(LNode *L)//鏈表的長度
{
int i = 0;
LNode *p = L-next;
while (p != NULL)
{
i++;
p = p-next;
}
return i;
}
刪除列的算法錯了,應(yīng)該緊縮數(shù)據(jù)把數(shù)據(jù)按每行col_num數(shù)據(jù)前移,把空出來的空間放在最后這樣計算位置就不會出錯了否則總列數(shù)并沒變,你那個col_num--就會出問題了。行數(shù)當(dāng)然維持不變了!
滿意答案null6級2010-12-10你是想單純的刪除 ,還是注銷這個結(jié)構(gòu)體的這一項啊 追問: 把結(jié)構(gòu)體中存的所有數(shù)據(jù)刪除 回答: 要是是int型的我們一般把它等于0要是是指針型的一般是把他指向空指針NULLstruct A{int a;char *b;}dd;main(){dd.a=0; dd.b==NULL;}可是這么做好像沒事意思,你能告訴我你是想干嘛嗎 追問: 學(xué)生信息管理系統(tǒng)中有一個結(jié)構(gòu)體數(shù)組,存有學(xué)生姓名char(20),學(xué)號int,等信息,要實現(xiàn)該程序的全部刪除功能 回答: 那可以像上面我教的的那樣,其實就是用0和NULL把原來的值給覆蓋了,原來的數(shù)據(jù)自然就沒有了,也就是實現(xiàn)了你的刪除的目的!
void del(void)
{
FILE *fp;
char a[10];
char ch;
int i,j,k;
system("cls");
printf("請輸入要刪除的學(xué)生姓名:");
scanf("%s",a);
system("cls");
fp=fopen("F:\\x.txt","r");
for(i=0;icount;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 學(xué)號 %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該同學(xué)的信息已成功刪除!\n");
printf("\n");
break;
}
}
fclose(fp);
if(i==count)
{
printf("\t\t很抱歉,沒有您所要查找的同學(xué)記錄!\n");
printf("\n");
}
else
{
for(j=i;jcount-1;j++)
{
for(k=0;k10;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;j2;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;
}
這是我以前做的時候的代碼,基本思想已經(jīng)有了,將學(xué)籍信息從文件載入到結(jié)構(gòu)體中,就是找到要刪除的同學(xué)所在的位置,然后從該同學(xué)后面將其他人的信息依次向前挪一個,實現(xiàn)對該同學(xué)信息的覆蓋。最后再將修改后的信息在重新存到文件中。
將文件中的內(nèi)容讀到結(jié)構(gòu)體中時一開始就做了。設(shè)置了一個全局變量count,用于記錄動態(tài)變化的學(xué)生的人數(shù),每次操作完成后將count的值寫到另一個文件夾中。每次程序開始執(zhí)行時也要讀入count 的值。
void Delete() { //刪除信息函數(shù)
FILE *fp;
fp = fopen("student.txt","r");//默認(rèn)以文本方式打開
char choose;
char name[20];
p = s1;
int i = 0;
fread(p,sizeof(Student),1,fp);// 塊狀讀取文本文件是不合適的
printf("請輸入刪除學(xué)生姓名:");
scanf("%s",name);
while(strcmp(name,p-Name) p) //判斷該學(xué)生信息是否存在
p++;i++; if(p != NULL) {
printf("學(xué)號 姓名 性別 語文 數(shù)學(xué) 英語 體育 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");//默認(rèn)以文本方式打開,fp已經(jīng)用作文件student.txt,
printf("\n是否刪除(Y/N)");
scanf("%s",choose); // choose是char變量,應(yīng)該用"%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.繼續(xù)刪除");
scanf("%s",choose); // 還是老問題
if(choose=='1') Menu();
else if(choose=='2') Delete(); // 遞歸調(diào)用會出問題的,這兒必須改 //
.................
}
沒學(xué)過數(shù)據(jù)結(jié)構(gòu)?那你們老師在干嘛?數(shù)據(jù)結(jié)構(gòu)不應(yīng)該是和語言同步進(jìn)行的嗎?
struct A //這就是個結(jié)構(gòu)體,包含數(shù)據(jù)域和指針域
{
int a;//數(shù)據(jù)域,可以是任何類百型的。
char b;//數(shù)據(jù)域
A *p;//指針域,就是struct A類型。
};鏈表,一般是動態(tài)的。你要靜態(tài)的就不用malloc分配就行了。定義N個struct
A就行了。
struct A a1;
struct A a2;
struct A a3;
struct A a4;
//a1作為第一個節(jié)點
a1-next = a2;
a2-next = a3;
a3-next = a4;
a4-next = NULL;
//插入,在a2后面插入a5
struct A a5;
a5-next = a2-next;
a2-next = a5;//注意指針的賦值順序。雖然全部是度靜態(tài)的問題不大。動態(tài)分配的時候不仔細(xì)會造成斷鏈,內(nèi)存溢出。
//刪除a5
a2-next = a5-next;//靜態(tài)不存在釋放的問題,動態(tài)申請的請釋放a5;