一般呢,插入和删除函数是分开写的,还有分成两种存储结构,1.顺序表,2.链表,我给你一个我上数据结构时候写的链表的操作,里面全都有,如果不会用,追问我
钦北网站制作公司哪家好,找创新互联建站!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设等网站项目制作,到程序开发,运营维护。创新互联建站自2013年起到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联建站。
#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)//插入数据元素
{
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)//输出函数
{
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;
}
删除列的算法错了,应该紧缩数据把数据按每行col_num数据前移,把空出来的空间放在最后这样计算位置就不会出错了否则总列数并没变,你那个col_num--就会出问题了。行数当然维持不变了!
满意答案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把原来的值给覆盖了,原来的数据自然就没有了,也就是实现了你的删除的目的!
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;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 学号 %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;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;
}
这是我以前做的时候的代码,基本思想已经有了,将学籍信息从文件载入到结构体中,就是找到要删除的同学所在的位置,然后从该同学后面将其他人的信息依次向前挪一个,实现对该同学信息的覆盖。最后再将修改后的信息在重新存到文件中。
将文件中的内容读到结构体中时一开始就做了。设置了一个全局变量count,用于记录动态变化的学生的人数,每次操作完成后将count的值写到另一个文件夹中。每次程序开始执行时也要读入count 的值。
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(); // 递归调用会出问题的,这儿必须改 //
.................
}
没学过数据结构?那你们老师在干嘛?数据结构不应该是和语言同步进行的吗?
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;