C 语⾔数据结构线性表基本操作
⼀、实验⽬的
1、掌握的定义;
2、掌握线性表的基本操作,如建⽴、查、插⼊和删除等。
⼆、实验内容
定义⼀个包含学⽣信息(学号,姓名,成绩)的顺序表和链表(⼆选⼀),使其具有如下功能:
(1) 根据指定学⽣个数,逐个输⼊学⽣信息;
(2) 逐个显⽰学⽣表中所有学⽣的相关信息;
(3) 根据姓名进⾏查,返回此学⽣的学号和成绩;
(4) 根据指定的位置可返回相应的学⽣信息(学号,姓名,成绩);
(5) 给定⼀个学⽣信息,插⼊到表中指定的位置;
(6) 删除指定位置的学⽣记录;
(7) 统计表中学⽣个数。
三、实验环境
Dev C++
四、代码展⽰#include <stdio.h>#include <stdlib.h> #include <string.h> typedef  struct  Student { char  name [40]; char  no [8]; float  score ; }Studet ;typedef  struct  LNode //定义单链表节点类型,typedef ⽤来起别名 { Student data ;//每个节点存放⼀个数据元素 LNode *next ;//指针指向下⼀个节点 } LNode ,*LinkList ;bool InitList (LinkList *L );//初始化⼀个空的单链表(带头结点) //此时应该是指针的指针,因为链表名字就是指针L bool Empty (LinkList L ); bool InitList (LinkList *L ){ *L = (LNode *)malloc (sizeof (LNode ));//分配⼀个头结点 //传⼊的是指向单链表的指针的指针,所以先解引⽤,就是只想单链表的指针,让他指向头结点  if (*L == NULL )  return  false ; (*L )->next = NULL ;//头结点之后的结点还没有结点,所以让头结点⾥⾯指向下⼀个结点的指针变成空指针  //这⾥写*L->是错的,因为优先级的问题,因为*优先级⽐->要低,要写成(*L )->或者(**L ).  return  true ; } bool Empty (LinkList L )//此处传⼊的值是指向头结点的指针的复制品,但是其值也是头结点的指针,此处⽤于检验不需要进⾏传址 { if (L ->next == NULL )  return  true ; else  return  false ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
c语言指针实验总结22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
return  false ;}//显⽰学⽣表信息(本质是按位查,从第⼀个遍历到最后⼀个) LNode *GetElem (LinkList *L ,int  i ){ if (i <0)  return  NULL ; LNode *p ;//指针p 指向当前扫描到的结点 int  j = 0;//当前p 指向的是第⼏个节点 p = *L ; while (p != NULL  && j <i ) {  p = p ->next ;  j ++; }  return  p ;}//按照姓名
查(本质就是根据特定元素实现按值查)LNode *LocateElem (LinkList *L ,char  str []){ LNode *p = (*L )->next ; while  (p != NULL ) {  if  (strcmp (p ->data .name ,str ) == 0)  return  p ;  p = p ->next ; } return  NULL ; } //指定位置插⼊学⽣信息(本质上是指定节点的后插操作) bool InsertNextNode (LinkList *L ,int  i ,Student e ) { LinkList p ,s ;//设定两个指针p 和s  p =*L ; int  j =0; while (p &&j <i -1) {  p =p ->next ;//⽤p 指针来遍历从⽽指向第i-1个位置  ++j ; } if (!p ||j >i -1)//如果i 值不合法或者p 指向的是NULL 返回报错      return  0; s =new LNode ; s ->data =e ; s ->next =p ->next ;//把新节点s 结点街道p 后⾯也就是i 的位置  p ->next =s ; return  1;}//删除学⽣信息(本质就是按位删除) bool ListDelete (LinkList *L ,int  i ){ if (i <1)  return  false ; LNode *p ;//指针p 指向当前扫描到的结点 int  j = 0;//当前p 指向第⼏个结点 p = *L ;//让p 和L ⼀样指向头结点,也就是第0个结点  while (p != NULL  && j <i -1)//循环到i-1个结点,当j=i-1就跳出循环 此时p 指向第i-1个  {  p = p ->next ;  j ++;42434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
j ++; }  if (p ==NULL )  return  false ; if (p ->next == NULL )//第i-1个结点之后没有其他节点  return  false ; LNode *q = p ->next ;//令q 指向被删除的结点也就是p 的后⼀项  p ->next = q ->next ;//将*q 结点从链中断开,也就是将q 的指针给p ,若q 是最后⼀个那就吧NULL 给p  free (q ); return  true ;  }void  Output (Student *e ){ printf ("姓名:%-10s\n 学号:%-10s\n 成绩:%-10.2lf\n\n",e ->name ,e ->no ,e ->score );} void  Input (Student *e ){ printf ("姓名:"); scanf ("%s",e ->name ); printf ("学号:"); scanf ("
%s",e ->no ); printf ("成绩:"); scanf ("%f",&e ->score ); printf ("输⼊完成\n\n");} int  main (void ){ Student a ,b ; LNode *x ; LNode *c ; int  n ,ch ; LinkList L ;//声明⼀个指向单链表的指针 printf ("1.输⼊学⽣信息\n"); printf ("2.显⽰学⽣表信息\n"); printf ("3.根据姓名进⾏查\n"); printf ("4.显⽰指定的位置学⽣信息\n"); printf ("5.在指定位置插⼊学⽣信息\n"); printf ("6.删除指定位置的学⽣记录\n"); printf ("7.统计学⽣⼈数\n"); printf ("8.退出\n\n"); if (InitList (&L ))    printf ("已成功建⽴链表\n"); while (1) {  printf ("请选择:");  scanf ("%d",&ch );  if (ch ==8) break ;    switch (ch )  {  case  1: printf ("请输⼊要录⼊的学⽣⼈数:");    scanf ("%d",&n );    for (int  i =1;i <=n ;i ++)    {      printf ("第%d 个学⽣:\n",i );      Input (&a );      InsertNextNode (&L ,i ,a );    }    break ;  case  2:for (int  i =1;i <=n ;i ++)//⽤for 循环打印所有信息      {      LNode *d = GetElem (&L ,i );
107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
LNode *d = GetElem (&L ,i );      Output (&(d ->data ));    }    break ;  case  3: char  str [20];    printf ("请输⼊要查的学⽣姓名:");    scanf ("%s",str );    c = LocateElem (&L ,str );    if (c != NULL )    {      Output (&(c ->data ));    }    else      {      printf ("查⽆此⼈\n");      }    break ;  case  4: printf ("请输⼊要查询的位置:");    int  d1;    scanf ("%d",&d1);    x = GetElem (&L ,d1);    Output (&(x ->data ));    break ;    case  5: printf ("请输⼊要插⼊的位置:");    int  d2;    scanf ("%d",&d2);    printf ("请输⼊学⽣信息:\n");    Input (&b );    if (InsertNextNode (&L ,d2,b ))    {      n ++;      printf ("插⼊成功");    }    else     
{      printf ("插⼊失败");      }    break ;  case  6:printf ("请输⼊要删除的位置:");    int  d3;    scanf ("%d",&d3);    if (ListDelete (&L ,d3))    {      n --;      puts ("删除成功");    }    else      {      puts ("删除失败");    }    break ;        case  7:printf ("已录⼊的学⽣个数为:%d\n\n",n );      break ;    }    } return  0;}172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。