刘萌150206318

本节内容是为了就C语言的指针,链表原理和各项操作的阐述所撰写;对于C语言我感到既熟悉的同时也感到一丝胆怯;C语言是一门很有趣,又可以说是枯燥的一门学科,但是今天的学习,让我学习到了许多。

指针是一个地址,指向的是个类型:

我们知道,c语言中的类型有int,char,bool(这个不常用),一般我们使用int,char就可以满足一般的类型需求的,如果对于变量的长度过大,就是用long ,float,double,关于各个类型使用的的长度问题,可以使用sizeof(int)或者sizeof(long)来查看各个类型,在系统中的小。(这个东西我并不清楚。。)

而指针就是一个8个字节(64系统)。

链表我的理解要包含以下特征:

1).由n个节点离散分配;(2).每个节点通过指针连接(3)每一个节点由一个前驱节点和一个后驱节点(4).首节点没有前驱节点,尾节点没有后驱节点;

满足上面的4条,我们就称为链表;链表既然由很多个节点,那节点又由什么组成?节点由两个部分组成,一是数据域,用来存放有效数据;二是指针域,用来指向下一个节点;下面用C语言来构建链表数据结构,首先应该构造出节点,然后再把所有的节点连起来,就构成了链表;

源代码:

#include <stdio.h>  
#include <conio.h>  
#include <string.h>  
#include <stdlib.h>
#define N 3
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("没有查找到该数据!");
}


stud * search2(stud *h,char *x) 
/*另一个查找函数,返回的是上一个查找函数的直接前驱结点的指针,
h为表头指针,x为指向要查找的姓名的指针
其实此函数的算法与上面的查找算法是一样的,只是多了一个指针s,并且s总是指向指针p所指向的结点的直接前驱,
结果返回s即是要查找的结点的前一个结点*/
{
   stud *p,*s;
   char *y;
   p=h->link;
   s=h;
   while(p!=NULL)
   {
     y=p->name;
     if(strcmp(y,x)==0)
       return(s);
     else
     {
       p=p->link;
       s=s->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结点的链域指向新结点*/
}


void del(stud *x,stud *y) /*删除函数,其中y为要删除的结点的指针,x为要删除的结点的前一个结点的指针*/
{
  stud *s;
  s=y;
  x->link=y->link;
  free(s);
}



void print(stud *h)
{
   stud *p;
   p=h->link;
   printf("数据信息为:\n");
   while(p!=NULL)
   {
     printf("%s \n",&*(p->name));
     p=p->link;
   }
}



void quit()
{
  exit(0);
}
void menu(void)
{
    system("cls"); 
    printf("\t\t\t单链表C语言实现实例\n");
    printf("\t\t|--------------------|\n");
    printf("\t\t| |\n");
    printf("\t\t| [1] 建 立 新 表 |\n");
    printf("\t\t| [2] 查 找 数 据 |\n");
    printf("\t\t| [3] 插 入 数 据 |\n");
    printf("\t\t| [4] 删 除 数 据 |\n");
    printf("\t\t| [5] 打 印 数 据 |\n");
    printf("\t\t| [6] 退 出 |\n");
    printf("\t\t| |\n");
    printf("\t\t| 如未建立新表,请先建立! |\n");
    printf("\t\t| |\n");
    printf("\t\t|-------------------|\n");
    printf("\t\t 请输入你的选项(1-6):");
}
main()
{
    int choose;
    stud *head,*searchpoint,*forepoint;
    char fullname[20];


    while(1)
    {
      menu();
      scanf("%d",&choose);
      switch(choose)
      {
        case 1:
           head=creat(N);
           break;
        case 2:
     printf("输入你所要查找的人的姓名:");
           scanf("%s",fullname);
           searchpoint=search(head,fullname);
           printf("你所查找的人的姓名为:%s",*&searchpoint->name);
           printf("\n按回车键回到主菜单。");
           getchar();getchar();
           break;
        case 3: printf("输入你要在哪个人后面插入:");
           scanf("%s",fullname);
           searchpoint=search(head,fullname);
           printf("你所查找的人的姓名为:%s",*&searchpoint->name);
           insert(searchpoint);
           print(head);
           printf("\n按回车键回到主菜单。");
           getchar();getchar();
           break;
        case 4:
     print(head);
           printf("\n输入你所要删除的人的姓名:");
           scanf("%s",fullname);
           searchpoint=search(head,fullname);
           forepoint=search2(head,fullname);
           del(forepoint,searchpoint);
           break;
        case 5:
     print(head);
           printf("\n按回车键回到主菜单。");
           getchar();getchar();
           break;
        case 6:quit();
           break;
        default:
     printf("你输入了非法字符!按回车键回到主菜单。");
           system("cls"); 
           menu();
           getchar();
      }
   }
}

心得体会:通过这次学习,我感到许多不足,有很多的地方都是通过同学帮助和网络搜索的方式下完成的;写代码其实就是利用所学的知识,让自己与电脑进行沟通,通过C语言的媒介,将自己的想法传输到电脑,且通过其表达出来;原代码是所有一切程序的基石,万丈高楼从地起正是这个道理。学生信息系统是一个繁杂且庞大的系统,而我们的任务就是通过编写程序将其简单化与人性化,C语言的教学让我学会了很多,也让我要更加努力完成以后的程序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值