C语言基础入门:链表详解篇

  链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:

  一为用户需要用的实际数据,二为下一个结点的地址。因此,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。

  链表的各类操作包括:学习单向链表的创建、删除、 插入(无序、有序)、输出、 排序(选择、插入、冒泡)、反序等等。

  基本操作

  1. 节点的构造

  #include

  #include

  #include

  #defineLEN sizeof(struct stu)structstu{

  //数据char num[10];char name[20];float score;

  //指针structstu*next;};

  2. 建立链表

  struct stu *create(){

  /structstu*head;structstu*p1, *p2;

  head = (struct stu *)malloc(LEN); head->next =NULL;

  p1 = head;

  p2 = (struct stu *)malloc(LEN);

  printf("输入个人信息:学籍号、姓名和总成绩\n");

  scanf("%s%s%f",p2->num, p2->name, &p2->score); getchar();

  while(strcmp(p2->num,"0") !=0){/*

  执行结束后

  1。p2的next域为NULL.

  2。第一个节点的next域指向第二个节点的数据域

  3。p1指针指向第二个节点的数据域

  p2->next = p1->next; p1->next = p2; p1 = p2;

  p2 = (struct stu *)malloc(LEN);printf("输入个人信息:学籍号、姓名和总成绩\n");

  scanf("%s%s%f",p2->num, p2->name, &p2->score); getchar(); }

  free(p2);returnhead;};

  3. 输出链表

  void print(struct stu * head){structstu*p;

  printf("num name score\n"); p = head->next;

  while(p!=NULL){

  printf("%-10s %-20s %-4.1f\n",p->num, p->name, p->score);

  p=p->next; }}

  4. 插入节点

  void insert(struct stu * head, struct stu * p0)

  { struct stu *p1, *p2; p1 = head->next;p2 = head;

  while((p1!=NULL) && (strcmp(p0->num, p1->num)==1))

  {p2=p1; p1=p1->next; } p0->next = p2->next; p2->next = p0;}

  5. 删除节点

  int delete(struct stu *head,charnum[]){ structstu*p1, *p2;p1 = head->next; p2 = head;

  while(p1!=NULL&&strcmp(num, p1->num)!=0)

  { p2=p1; p1=p1->next; }

  if(!p1){return0; }

  p2->next = p1->next;free(p1);return1;}

  6. 主函数

  //主函数int main()

  {structstu*h, *p0;charnum[10];printf("建立链表\n");

  h = create(); p0 = (struct stu *)malloc(LEN);

  printf("输入待插入的个人信息:学籍号、姓名和总成绩\n");

  scanf("%s%s%f",p0->num, p0->name, &p0->score);

  getchar();if(strcmp(p0->num,"0") !=0){ insert(h, p0); }

  printf("输入待删除个人信息的学号\n");

  scanf("%s",num);if(strcmp(num,"0") !=0){delete(h, num);

  }printf("输出链表\n"); print(h);return0;}郑州不孕不育医院http://jbk.39.net/yiyuanzaixian/zztjyy/

posted @ 2020-11-26 13:09  顾延笙  阅读(1239)  评论(0编辑  收藏  举报