C语言链表使用详解

xiaoxiao2021-02-28  106

1. [代码]demo1     

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 #include <stdio.h> #include <stdlib.h>   struct grade {      int score;      struct grade *next; }; typedef struct grade NODE;  //typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。 //使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字, //另一个是简化一些比较复杂的类型声明。 struct grade *create();   //创建链表 void insert(NODE *head,NODE *pnew, int i);   //插入链表 void pdelete(NODE *head, int i);   //删除列表 void display(NODE *head);   //输出链表 void Pfree(NODE *head);    //销毁链表   int main( int argc, char *argv[]) {      struct grade *head,*pnew;      head=create();      if (head==NULL)          return 0;      printf ( "输出创建的链表:" );      display(head);      pnew=(NODE *) malloc ( sizeof (NODE));      if (pnew==NULL) {          printf ( "创建失败!" );          return 0;      }      pnew->score=88;      insert(head,pnew, 3);   //将新节点插入节点3的后面      printf ( "插入后的链表:" );      display(head);      pdelete(head,3);   //删除节点3      printf ( "删除后的链表:" );      display(head);      Pfree(head);      return 0; }   struct grade *create() {      NODE *head,*tail,*pnew;      int score;      head=(NODE *) malloc ( sizeof (NODE));  //创建头节点。      if (head==NULL) { //创建失败返回          printf ( "创建失败!" );          return NULL;      }      head->next=NULL;  //头节点指针域置NULL      tail=head;  // 开始时尾指针指向头节点      printf ( "输入学生成绩:" );      while (1) { //创建链表          scanf ( "%d" ,&score);          if (score<0) //成绩为负是退出循环              break ;          pnew=(NODE *) malloc ( sizeof (NODE));  //创建新节点          if (pnew==NULL) { //创建失败返回              printf ( "创建失败!" );              return NULL;          }          pnew->score=score;  //新节点数据域存放输入的成绩          pnew->next=NULL;   //新节点指针域置NULL          tail->next=pnew;  //新节点插入到表尾          tail=pnew;   //为指针指向当前的尾节点      }      return head;  //返回创建链表的头指针 } void insert(NODE *head,NODE *pnew, int i) {      NODE *p; //当前指针      int j;        p=head;      for (j=0; j<i&&p!=NULL; j++) //p指向要插入的第i个节点          p=p->next;            if (p==NULL) { //节点i不存在          printf ( "与插入的节点不存在!" );          return ;      }        pnew->next=p->next;   //插入节点的指针域指向第i个节点的后继节点      p->next=pnew;    //犟第i个节点的指针域指向插入的新节点 }   void pdelete(NODE *head, int i) {      NODE *p,*q;      int j;      if (i==0) //删除的是头指针,返回          return ;      p=head;      for (j=1; j<i&&p->next!=NULL; j++)          p=p->next;  //将p指向要删除的第i个节点的前驱节点      if (p->next==NULL) { //表明链表中的节点不存在          printf ( "不存在!" );          return ;      }      q=p->next;  //q指向待删除的节点      p->next=q->next;  //删除节点i,也可写成p->next=p->next->next      free (q);   //释放节点i的内存单元 } void display(NODE *head) {      NODE *p;      for (p=head->next; p!=NULL; p=p->next)          printf ( "%d " ,p->score);      printf ( "\n" ); } void pfree(NODE *head) {      NODE *p,*q;        p=head;      while (p->next!=NULL) { //每次删除头节点的后继节点          q=p->next;          p->next=q->next;          free (q);      }      free (head);   //最后删除头节点 } void Pfree(NODE *head) {      NODE *p,*q;      p=head;      while (p->next!=NULL) {          q=p->next;          p->next=q->next;          free (q);      }      free (p); }

2. [代码]demo2     

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 #include <stdio.h> #include <malloc.h> #include <conio.h> #include <stdlib.h>   //链表单元定义,链表相关变量 struct student {      int id;      float score;      struct student *next; } *head,*pthis;   //输入数据创建链表 void input() {      struct student *tmp;      printf ( "\n\n请输入学生的信息以学号为0结束:\n" );      do {          printf ( "ID\t成绩\n" );          if ((tmp=( struct student *) malloc ( sizeof ( struct student)))==NULL) {              printf ( "\n错误!不能申请所需的内存!\n" );              exit (0);          }          scanf ( "%d\t%f" ,&tmp->id,&tmp->score);          tmp->next=NULL;          if (tmp->id!=0) {              if (head==NULL) {                  head=tmp;                  pthis=head;              } else {                  pthis->next=tmp;                  pthis=pthis->next;              }          }      } while (tmp->id!=0);      free (tmp); }   //搜索链表找到第一个符合条件的项目输出 void search( int id) {      printf ( "\n\n查询结果\n" );      printf ( "ID\t成绩\n" );      printf ( "-------------------------------\n" );      if (head==NULL) {          printf ( "\n错误!没有数据!\n" );          return ;      }      pthis=head;      while (pthis!=NULL) {          if (pthis->id==id) {              printf ( "%d\t%.2f\n" ,pthis->id,pthis->score);              return ;          } else {              pthis=pthis->next;          }      }      printf ( "\n没有找到!\n" ); }   //列表输出链表中的所有项 void list() {      printf ( "\n\n数据列表\n" );      printf ( "ID\t成绩\n" );      printf ( "-------------------------------\n" );      if (head==NULL) {          printf ( "错误,没有数据!\n" );          return ;      }      pthis=head;      while (pthis!=NULL) {          printf ( "%d\t%.2f\n" ,pthis->id,pthis->score);          pthis=pthis->next;      } }   //插入数据 void insert() {      int i,p;      struct student *tmp;      if (head==NULL) {          printf ( "\n\n数据不存在,无法插入!\n" );          return ;      }      printf ( "\n请输入插入点:\n" );      scanf ( "%d" ,&p);      if (p<0) {          printf ( "输入不合法!" );          return ;      }      printf ( "\n\n请输入学生的信息:\nID\t成绩\n" );      if ((tmp=( struct student *) malloc ( sizeof ( struct student)))==NULL) {          printf ( "\n错误!不能申请所需的内存!\n" );          exit (0);      }      scanf ( "%d\t%f" ,&tmp->id,&tmp->score);      tmp->next=NULL;      if (tmp->id!=0) {          pthis=head;          if (p==0) {              tmp->next=head;              head=tmp;          } else {              for (i=0; i<p-1; i++) {                  if (pthis->next->next==NULL) {                      printf ( "\n找不到插入点,您输入的数据太大!\n" );                      return ;                  }                  pthis=pthis->next;              }              tmp->next=pthis->next;              pthis->next=tmp;          }      } else {          printf ( "\n数据无效!\n" );          free (tmp);      } }   //追加数据 void append() {      struct student *tmp;      printf ( "\n\n请输入学生的信息:\nID\t成绩\n" );      if ((tmp=( struct student *) malloc ( sizeof ( struct student)))==NULL) {          printf ( "\n错误!不能申请所需的内存!\n" );          exit (0);      }      scanf ( "%d\t%f" ,&tmp->id,&tmp->score);      tmp->next=NULL;      if (tmp->id!=0) {          if (head==NULL) {              head=tmp;          } else {              pthis=head;              while (pthis->next!=NULL) {                  pthis=pthis->next;              }              pthis->next=tmp;          }      } else {          free (tmp);          printf ( "\n数据无效!\n" );      } }   //删除数据 void del() {      int p,i;      struct student *tmp;      if (head==NULL) {          printf ( "\n\n没有数据,无法删除!\n" );          return ;      }      printf ( "\n\n请输入要删除的记录号:\n" );      scanf ( "%d" ,&p);      if (p<0) {          printf ( "\n输入不合法!\n" );          return ;      }      if (p==0) {          pthis=head;          head=pthis->next;          free (pthis);          pthis=head;      } else {          pthis=head;          for (i=0; i<p-1; i++) {              pthis=pthis->next;              if (pthis->next==NULL) {                  printf ( "\n\n指定记录不存在,无法删除!\n" );                  return ;              }          }          tmp=pthis->next;          pthis->next=pthis->next->next;          free (tmp);      } }   //程序主函数 void main() {      char command=0;      int id=0;   //主循环      do {          printf ( "\n\n\t 菜单\n" );          printf ( "-------------------------------\n" );          printf ( "\ta,输入数据\n" );          printf ( "\tb,查询记录\n" );          printf ( "\tc,数据列表\n" );          printf ( "\td,追加记录\n" );          printf ( "\te,插入记录\n" );          printf ( "\tf,删除记录\n" );          printf ( "\tg,退出系统\n" );          printf ( "-------------------------------\n" );          printf ( "\t请选择:" );          command=getch();   //命令处理          switch (command) {          case 'a' :              if (head==NULL) {                  input();                  break ;              } else {                  printf ( "\n\n数据已经存在!\n" );                  break ;              }          case 'b' :              printf ( "\n\n要查询的ID:" );              scanf ( "%d" ,&id);              search(id);              break ;          case 'c' :              list();              break ;          case 'd' :              append();              break ;          case 'e' :              insert();              break ;          case 'f' :              del();              break ;          }      } while (command!= 'g' ); }
转载请注明原文地址: https://www.6miu.com/read-43531.html

最新回复(0)