链表的c语言实现(四)
2、插入(后插)
假设在一个单链表中存在2个连续结点p、q(其中p为q的直接前驱),若我们需要在p、q之间插入一个新结点s,那么我们必须先为s分配空间并赋值,然后使p的链域存储s的地址,s的链域存储q的地址即可。(p->link=s;s->link=q),这样就完成了插入操作。
下例是应用插入算法的一个例子:
#include
#include
#include
#define N 10
typedef strUCt node
{
char name[20];
struct node *link;
}stud;
stud * creat(int n) /*建立单链表的函数*/
{
stud *p,*h,*s;
int i;
if((h=(stud *)malloc(sizeof(stud)))==NULL)
{
printf("不能分配内存空间!");
exit(0);
}
h->name[0]='\0';
h->link=NULL;
p=h;
for(i=0;i { if((s= (stud *) malloc(sizeof(stud)))==NULL) { printf("不能分配内存空间!"); exit(0); } p->link=s; printf("请输入第%d个人的姓名:",i+1); scanf("%s",s->name); s->link=NULL; p=s; } return(h); } stud * search(stud *h,char *x) /*查找函数*/ { stud *p; char *y; p=h->link; while(p!=NULL) { y=p->name; if(strcmp(y,x)==0) return(p); else p=p->link; } if(p==NULL) printf("没有查找到该数据!"); } void insert(stud *p) /*插入函数,在指针p后插入*/ { char stuname[20]; stud *s; /*指针s是保存新结点地址的*/ if((s= (stud *) malloc(sizeof(stud)))==NULL) { printf("不能分配内存空间!"); exit(0); } printf("请输入你要插入的人的姓名:"); scanf("%s",stuname); strcpy(s->name,stuname); /*把指针stuname所指向的数组元素拷贝给新结点的数据域*/ s->link=p->link; /*把新结点的链域指向原来p结点的后继结点*/ p->link=s; /*p结点的链域指向新结点*/ } main() { int number; char fullname[20]; /*保存输入的要查找的人的姓名*/ stud *head,*searchpoint; number=N; head=creat(number); /*建立新链表并返回表头指针*/ printf("请输入你要查找的人的姓名:"); scanf("%s",fullname); searchpoint=search(head,fullname); /*查找并返回查找到的结点指针*/ insert(searchpoint); /*调用插入函数*/ }
- 上一篇:链表的c语言实现(三)
- 下一篇:高质量C++/C编程指南 -- 第3章 命名规则