删除信息,我感觉写的思路还算清晰,拿出来与大家共享,链表的删除(结构体的嵌套)
程序代码:
#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; }其实还可以在此基础上做更多的改进,比如输入学号的限制(限定在一个范围内),性别的输入限制,等等。我感觉删除链表的中的节点
书上写的有的太笼统了。我是新手,勿喷!