龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

链表的C语言实现之单链表的插入运算[图]

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
假设在一个单链表中存在2个连续结点p、q(其中p为q的直接前驱),若我们需要在p、q之间插入一个新结点s,那么我们必须先为s分配空间并赋值,然后使p的链域存储s的地址,s的链域存

  假设在一个单链表中存在2个连续结点p、q(其中p为q的直接前驱),若我们需要在p、q之间插入一个新结点s,那么我们必须先为s分配空间并赋值,然后使p的链域存储s的地址,s的链域存储q的地址即可。(p->link=s;s->link=q),这样就完成了插入操作。
  
     下例是应用插入算法的一个例子:
  
   #include <stdio.h>
   #include <malloc.h>
   #include <string.h>
   #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<n;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++进阶技术文档专题,或
  
精彩图集

赞助商链接