user-0 提问: 求助大佬们，我的部分删除模块实在是写不出，要求再代码开头的注释中

回复:
user: user-0
content: #include<stdio.h>//密码，新建，浏览，删除原有数据，删除一条数据，查找，添加 #include<conio.h> #include<stdlib.h> #include<string.h> #define M 20  struct conect//结构体 { 	char name[11]; 	char telnum[12];//电话号码 	char address[100];//地址 	int f;//标签 }; int N=0;//总人数的全局变量 int n; int num;//总人数 struct conect c[10];//结构体数量 struct conect cc;  int main(void) { 	void input(),expl(),meun(), password(), save(),read(),serch(), dele(),dele_all(); 	void dele_menu(),newsave(); 	void dele_save();//部分删除函数  	int choice; 	 	//password(); 	system("pause"); 	system("cls"); 	while (1) 	{ 		meun(); 		printf("\t\t\t\t\t\t"); 		scanf("%d", &choice); 		switch (choice) 		{ 		case 1:input();break; 		case 2:expl();break; 		case 3:save();break; 		case 4:read();break; 		case 5:serch();break; 		case 6:dele_menu();break; 		case 7:newsave();break; 		case 0:exit(0); 		} 		printf("\n"); 		system("pause");//暂停函数  		system("cls");//清屏函数  		 	}  } void input()//输入数据函数 { 	int i; 	printf("\t\t\t\t\t\t输入人数:"); 	scanf("%d", &num); 	n = N; 	for (i = N;i < num+n;i++,N++) 	{ 		printf("\t\t\t\t\t\t姓名："); 		scanf("%s", c[i].name); 		printf("\t\t\t\t\t\t电话："); 		scanf("%s", c[i].telnum); 		printf("\t\t\t\t\t\t地址："); 		rewind(stdin); 		gets(c[i].address); 		printf("\t\t\t\t\t\t标签："); 		scanf("%d", &c[i].f); 		printf("\n"); 		N++; 	} } void expl()//浏览输入为保存信息（时效性） { 	int i; 	printf("%12s%12s%30s%10s\n", "姓名", "电话", "地址", "标签"); 	for (i = 0;i < num+N ;i++) 	{ 		printf("%12s%12s%30s", c[i].name, c[i].telnum, c[i].address); 		switch (c[i].f) 		{ 		case 1:printf("      亲戚\n");break; 		case 2:printf("      同事\n");break; 		case 3:printf("      朋友\n");break; 		} 	} } void meun() { 	printf("\t\t\t\t\t\t1.录入联系人\n"); 	printf("\t\t\t\t\t\t2.浏览通讯录\n"); 	printf("\t\t\t\t\t\t3.保存联系人\n"); 	printf("\t\t\t\t\t\t4.读取文件\n"); 	printf("\t\t\t\t\t\t5.查找联系人\n"); 	printf("\t\t\t\t\t\t6.删除联系人\n"); 	printf("\t\t\t\t\t\t7.新建文件\n"); 	printf("\t\t\t\t\t\t0.退出\n"); 	printf("\t\t\t\t\t\t请输入1-2\n"); 	 } void dele_menu() { 	int a; 	printf("\t\t\t\t\t\t1.删除未保存联系人\n"); 	printf("\t\t\t\t\t\t2.删除已保存联系人\n"); 	printf("\t\t\t\t\t\t3.删除全部联系人\n"); 	scanf("%d",&a); 	switch (a) 	{ 	case 1:dele();break; 	case 2:dele_save();break; 	case 3:dele_all();break; 	default: 		break; 	}  } void password()  { 	char password[10] = "123456";//正确密码 	char ps[10];//定义一个新数组用与正确答案做对比 	int i,j;   	printf("\n\n"); 	printf("\t\t\t\t\t\t================================\n"); 	printf("\t\t\t\t\t\t         用户登录系统\n"); 	printf("\t\t\t\t\t\t================================\n"); 	printf("\n\n"); 	for (j = 0;j < 4;j++) 	{ 		i = 0; 		printf("\t\t\t\t\t\t请输入密码.\n"); 		printf("\t\t\t\t\t\t密码:");     	while ((ps[i] = getch()) != 13)//用于替换*号，且回车结束输入判断 		{ 			if (ps[i] == '\b')//（\b）退格符，在此用于发挥删除功能 			{ 				printf("\b \b");//起删除功能 				i--;//向后减少一位将光标提前 			} 			else 			{ 				printf("*"); 				i++; 			} 			 		} 		ps[i] = '\0'; 		printf("\n"); 		if (strcmp(password, ps) == 0) 		{ 			printf("\n\n"); 			printf("\t\t\t\t\t\t================================\n"); 			printf("\t\t\t\t\t\t           欢迎用户！           \n"); 			printf("\t\t\t\t\t\t================================\n"); 			printf("\n\n"); 			break; 		} 		else 		{ 			printf("\t\t\t\t\t\tNO!\n"); 			if (3 - j == 0) 			{ 				printf("\t\t\t\t\t\t全部错误自动退出！"); 				exit(0); 			} 			printf("\t\t\t\t\t\t还有%d次机会！\n", 3 - j); 		}  	} }  void save()//内容储存函数 { 	FILE* fp; 	int* a; 	int i;  	fp = fopen("conect.dat","wb");//建立一个文件并且打开写入类容 	for (i = 0;i < N;i++) 	{ 		fwrite(&c[i],sizeof(struct conect),1,fp);//写入文件块 	}  	fclose(fp);//关闭文件 	printf("保存成功\n"); } void read()//类容读取函数 { 	FILE *fp;//指针变量的定义 	int i;  	fp = fopen("conect.dat", "ab+");//建立一个文件并且打开写入类容 	printf("%12s%12s%30s%10s\n", "姓名", "电话", "地址", "标签"); 	while(1) 	{ 		fread(&cc, sizeof(struct conect), 1, fp);//读取文件块 		if (feof(fp))//file end of 结束标志 		{ 			break; 		} 		printf("%12s%12s%30s", cc.name, cc.telnum, cc.address); 		switch (cc.f) 		{ 		case 1:printf("      亲戚\n");break; 		case 2:printf("      同事\n");break; 		case 3:printf("      朋友\n");break; 		} 	} 	fclose(fp);//关闭文件   } void serch()//查询函数 { 	int i; 	int flag = 0; 	char t_name[M]; 	FILE* fp;  	fp = fopen("conect.dat", "ab+");//打开原文件 	printf("\n\t\t\t\t\t\t--------------------------------------\n"); 	printf("\t\t\t\t\t\t输入你要查询的姓名="); 	scanf("%s", t_name); 	printf("\n"); 	printf("\n"); 	printf("\n"); 	printf("%12s%12s%30s%10s\n", "姓名", "电话", "地址", "标签"); 	while (1) 	{ 		fread(&cc, sizeof(struct conect), 1, fp);//读取文件块 		if (feof(fp))//file end of 结束标志 		{ 			break; 		} 		printf("%12s%12s%30s", cc.name, cc.telnum, cc.address); 		switch (cc.f) 		{ 		case 1:printf("      亲戚\n");break; 		case 2:printf("      同事\n");break; 		case 3:printf("      朋友\n");break; 		} 	} 	fclose(fp);//关闭文件 } void dele()//删除未保存时效数据函数 { 	int m, j,i; 	int h = 0; 	int flag = 0; 	char t_name[M]; 	printf("\t\t\t\t\t\t输入姓名="); 	scanf("%s", t_name); 	printf("\n"); 	printf("\n"); 	for (i = 0;i < num;i++) 	{  		if (strcmp(t_name, c[i].name) == 0) 		{ 			printf("\t\t\t\t\t\t-----------------------------------\n"); 			printf("\t\t\t\t\t         查找成功,是否删除？\n\n"); 			printf("\t\t\t\t\t\t1.删除                      "); 			printf("2.退出\n"); 			printf("\t\t\t\t\t\t-----------------------------------\n"); 			flag = 1; 			break; 		} 		h++; 	} 	if (flag == 0) 	{ 		printf("\t\t\t\t\t\t无可查找对象"); 		return; 	} 	printf("\t\t\t\t\t\t请输入："); 	scanf("%d", &m); 	if (m == 1) 	{ 		for (j = h;j < num;j++) 		{ 			c[i] = c[i + 1]; 		} 		printf("\n"); 		printf("\t\t\t\t\t\t删除成功!!\n"); 		num--; 	} }  void dele_save()//部分删除函数功能：输入联系人姓名查找相应数据然后删除数据（联系人已保存至文件） { 	 }  void dele_all() { 	FILE* fp; 	int ret, a; 	char filename[] = "conect.dat";//将文件名赋值给一个字符串  	fp = fopen("filename", "rb+");//打开文件以二进制文件读取的方式 	ret = remove(filename);//将删除函数赋值给一个整形，方便if语句判断返回值 	if (ret == 0)//当返回值为-1时报错，当返回值为时执行删除 	{ 		printf("文件删除成功"); 		 	} 	else 	{ 		printf("错误：不能删除该文件");//一般来说可以用perror("remove");打印错误原因，但结果为英文 	}  	 }  void newsave() { 	int i; 	char filename[100];//定义一个字符数组储存文件名 	FILE* fp;  	printf("请输入你要自定义的文件夹"); 	scanf("%s", filename);//输入一个文件名 	fp = fopen(filename, "ab");//创建一个新的二进制文件 	for (i = 0;i <= N;i++) 	{ 		fwrite(&c[i], sizeof(struct conect), 1, fp);//可以用循环写入文件 	} 	fclose(fp);//关闭文件 	printf("保存成功!\n");  }

user: user-1
content: 建议楼主贴全代码吧

user: user-0
content: 引用 3 楼 user-2的回复:不能用链表那就是数组了，数组删除是找到要删除的元素的下标，然后把它之后的元素逐一前移一个位置，再保存到文件中即可。 谢谢你  我解决了  因为要用文件所以不能用数组，我现在用的是把要删除和不删除的分别放到两个空文件里面，然后用remove删除其中要删除数据的那个文件，用rename重命名另一个文件。

user: user-2
content: 不能用链表那就是数组了，数组删除是找到要删除的元素的下标，然后把它之后的元素逐一前移一个位置，再保存到文件中即可。