#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)//插入数据元素
int j = 0;
if (i-1 LinkLength(L))
while(p1!=NULL ji-1)
p1 = p1-next;
j++;
return 0;
void ClearList(LNode *L)//重置为空表
while(L-next)
p=L-next;
L-next=p-next;
free(p);
void print_link(LNode *L)//输出函数
LNode *p = L;
p = p-next;
while (p != NULL)
int ListDlete_L(LNode *L, int i, int *e)//删除L中I,并用e返回
p1 = L;
while (p1-next != NULL j i - 1)
if (p1-next == NULL || j i - 1)
int LinkLength(LNode *L)//链表的长度
int i = 0;
LNode *p = L-next;
i++;
return i;
删除列的算法错了,应该紧缩数据把数据按每行col_num数据前移,把空出来的空间放在最后这样计算位置就不会出错了否则总列数并没变,你那个col_num--就会出问题了.行数当然维持不变了!
void del(void)
FILE *fp;
char a[10];
char ch;
int i,j,k;
system("cls");
printf("请输入要删除的学生姓名:");
scanf("%s",a);
fp=fopen("F:\\x.txt","r");
for(i=0;icount;i++)//找到删除人所在的位置
if(!strcmp(s[i].name ,a))
printf(" \t\t\t该同学的信息已成功删除!\n");
printf("\n");
break;
fclose(fp);
if(i==count)
printf("\t\t很抱歉,没有您所要查找的同学记录!\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;
fp=fopen("F:\\x.txt","w");
fp=fopen("F:\\x.txt","a");
count=count-1;
这是我以前做的时候的代码,基本思想已经有了,将学籍信息从文件载入到结构体中,就是找到要删除的同学所在的位置,然后从该同学后面将其他人的信息依次向前挪一个,实现对该同学信息的覆盖.最后再将修改后的信息在重新存到文件中.
将文件中的内容读到结构体中时一开始就做了.设置了一个全局变量count,用于记录动态变化的学生的人数,每次操作完成后将count的值写到另一个文件夹中.每次程序开始执行时也要读入count 的值.
void Delete() { //删除信息函数
fp = fopen("student.txt","r");//默认以文本方式打开
char choose;
p = s1;
fread(p,sizeof(Student),1,fp);// 块状读取文本文件是不合适的
printf("请输入删除学生姓名:");
scanf("%s",name);
while(strcmp(name,p-Name) p) //判断该学生信息是否存在
p++;i++; if(p != NULL) {
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("没有此人信息.");
scanf("%s",choose); // 还是老问题
if(choose=='1') Menu();
.................
没学过数据结构?那你们老师在干嘛?数据结构不应该是和语言同步进行的吗?
struct A //这就是个结构体,包含数据域和指针域
int a;//数据域,可以是任何类百型的.
char b;//数据域
A *p;//指针域,就是struct A类型.
};链表,一般是动态的.你要静态的就不用malloc分配就行了.定义N个struct
A就行了.
struct A a1;
//a1作为第一个节点
以上就是土嘎嘎小编为大家整理的c语言的结构体函数删除相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!