删除信息,我感觉写的思路还算清晰,拿出来与大家共享,链表的删除(结构体的嵌套)
程序代码:#include<stdio.h>
#include<stdlib.h>
typedef struct Record
{
int number;
char name[20];
char sex[20];
int age;
}Student;
typedef struct node
{
Student p;
struct node *next;
}LNode,*Linklist;
int create_list(Linklist &L,int n)
{
Linklist q,r;
int i;
r=L;
for(i=0;i<n;i++)
{
q=(Linklist)malloc(sizeof(LNode));
if(!q)
return 0;
printf("请输入第%d个学生的信息:\n",i+1);
printf("学号: \n");
scanf("%d",&(q->p.number));
getchar();
printf("姓名:\n");
scanf("%s",q->p.name);
getchar();
printf("性别: \n");
scanf("%s",q->p.sex);
getchar();
printf("年龄: \n");
scanf("%d",&(q->p.age));
getchar();
q->next=NULL;
r->next=q;
r=q;
}
return 1;
}
void print_list(Linklist &L)
{
Linklist q;
q=L->next;
while(q!=NULL)
{
printf("学号:%d 姓名:%s 性别:%s 年龄: %d ",q->p.number,q->p.name,q->p.sex,q->p.age);
printf("\n");
q=q->next;
}
}
int find_list(Linklist &L,int number)
{
Linklist q,s;
int flag=0;
q=L;
while(q->next!=NULL)//当不是最后一个节点时
{
while(q->p.number!=number&&q->next!=NULL)//设定两个指针分别指向当前节点和它的前一个结点,要保证q不是最后一个节点,此时外层循环已不起作用了!
{
s=q;
q=q->next;
}
if(q->p.number==number)
{
if(q==L->next)//如果删除的是第一个元素,要注意它是带头结点的链表,注意是两个等号,if里的判等式是双等号的,数字的时候不会犯错,但是指针的时候很容犯错的!
{
L->next=q->next;
flag=1;
free(q);
break;
}
if(q->next==NULL)//如果是最后的一个元素。
{
s->next=NULL;
flag=1;
free(q);
break;
}
if(q!=L->next&&q->next!=NULL)//如果是中间元素
{
s->next=q->next;
flag=1;
free(q);
break;
}
}
}
return flag;
}
int main()
{
Linklist L;
int n;
int number;
printf("请输入学生人数亲!\n");
scanf("%d",&n);
L=(Linklist)malloc(sizeof(LNode));
printf("请输入学生信息亲!\n");
create_list(L,n);
printf("原有的学生信息是:\n");
print_list(L);
printf("请你输入要查找的学号:\n");
scanf("%d",&number);
if(number==-1)
printf("输入错误!\n");
if(find_list(L,number))
{
printf("找到了亲!\n");
printf("此时剩下的学生信息是:\n");
print_list(L);
}
else
printf("没有找到哦!\n");
return 0;
}
其实还可以在此基础上做更多的改进,比如输入学号的限制(限定在一个范围内),性别的输入限制,等等。我感觉删除链表的中的节点书上写的有的太笼统了。我是新手,勿喷!


