博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单向链表程序
阅读量:6339 次
发布时间:2019-06-22

本文共 5178 字,大约阅读时间需要 17 分钟。

 

 

 

/******************************************************************************                                    程序说明*            程序名称:简单单向链表**            功能:    实现单向链表的创建、插入、删除、遍历和查找**            作者:    Veis**            注:此代码已在VC6.0及VS2010环境下编译通过,能正常实现所对应的功能*            程序元素排序与数组下标一样,从0开始。******************************************************************************/#include
#include
#include
#include
//宏定义数组大小,便于修改#define N 10 struct student{ char name[20]; //数据域 struct student *next; //指针域};//判断查找和删除时对应位置的内容是否为空bool judge(struct student *p, int position){ int count; //初始化很重要 count = 0; while( NULL != p ) { p = p->next; count++; } // printf("count:%d\n",count); if( position > (count - 1) ) { return false; }else { return true; }}//创建链表struct student * create(){ // head链表的头指针,即链表的首地址 // current当前处理的元素 //next下一个状态的指针 struct student *current, *head, *next; char str[N]; char flag; //提示用户输入信息 printf("请输入学生姓名:\n"); scanf("%s",str); //动态申请内存 head = (struct student *)malloc(sizeof(struct student)); //字符串之间不能直接复制,需要调用字符串处理函数strcpy,包含在库string.h strcpy( head->name , str ); //把链表的头指针赋给当前状态指针 current = head; //输入y/n printf("是否继续输入?"); scanf("%s",&flag); //排除回车符的干扰 getchar(); while(flag != 'n') { //提示用户输入信息 printf("请输入学生姓名:\n"); scanf("%s",str); //动态申请内存 next = (struct student *)malloc(sizeof(struct student)); //判断是否分配内存成功 if( NULL == next ) { printf("Error:内存分配失败!"); //退出程序,作用和 return 相似 exit(-1); } strcpy( next->name , str ); //把当前状态指针的下一个指向下一个链表 current->next = next; //把当前状态指针指往后移一个 current = next; printf("是否继续输入?"); scanf("%s",&flag); //排除回车符的干扰 getchar(); } //输入完成后把当前状态指针的下一个状态指向NULL current->next = NULL; return head;}// 遍历链表void list(struct student *p){ while(1) { printf("%s \n", p->name); if( p->next != NULL ) { p = p->next; }else { break; } }}//插入元素到链表void insert(struct student *p){ // insert要插入的元素 // current当前处理的元素 struct student *insert, *current; char str[N]; int position; current = p; printf("请输入需要插入的学生姓名:\n"); scanf("%s",str); //动态申请内存 insert = (struct student *)malloc(sizeof(struct student)); //判断是否分配内存成功 if( NULL == insert ) { printf("Error:内存分配失败!"); exit(-1); } strcpy( insert->name , str );loop: printf("请输入需要插入的位置:\n"); scanf("%d",&position); //查询并判断元素插入位置 if( position > 0 ) { while( position > 1 ) { current = current->next; position--; } //插入的元素指向当前元素的下一个 insert->next = current->next; //当前元素的下一个指向插入的元素 current->next = insert; } else if( position == 0 ) { p = insert; insert->next = current; } else { printf("\nError:输入错误!\n"); goto loop; } list(p);}//删除链表元素void delet(struct student *p){ // insert用来保存要删除的元素 // current当前处理的元素 struct student *current, *delet; int position; current = p; delet = current;loop: printf("请输入需要删除的位置:\n"); scanf("%d",&position); if( judge(p,position) == true) { if( position > 0 ) { while( position > 1 ) { current = current->next; position--; } //记录删除的节点 delet = current->next; //使当前指针指向下一个状态 current->next = delet->next; //释放要删除的内存 free(delet); }else if( position == 0 ) { //使当前指针直接指向下一个节点 p = current->next; //释放内存 free(current); } else { printf("\nError:输入错误!\n"); goto loop; } //调用查看效果 list(p); }else { printf("\nError:输入错误!\n"); goto loop; }}//回显查找的元素,可用于以后的拓展,故写成一个函数void display(struct student *p){ printf("%s \n", p->name);}//查找元素void search(struct student *p){ struct student *current; int position; current = p;loop: printf("请输入需要查找的位置:\n"); scanf("%d",&position); if( judge(p,position) == true) { //根据输入查找对应位置 if( position > 0 ) { while( position > 1 ) { current = current->next; position--; } p = current->next; }else if( position == 0 ) { p = current; } else { printf("Error:输入错误!"); goto loop; } //显示查找的内容 display(p); }else { printf("\nError:输入错误!\n"); goto loop; }}void main(){ struct student *p; //创建链表 p = create(); //删除链表// delet(p); //插入元素// insert(p); //查找元素 search(p);}

 

查找功能效果如下图所示:

 

转载于:https://www.cnblogs.com/veis/p/7066366.html

你可能感兴趣的文章
用maven+springMVC创建一个项目
查看>>
linux设备驱动第四篇:以oops信息定位代码行为例谈驱动调试方法
查看>>
redis知识点整理
查看>>
Hello World
查看>>
Spring3全注解配置
查看>>
ThreadLocal真会内存泄露?
查看>>
低版本mybatis不能用PageHeper插件的时候用这个分页
查看>>
javaweb使用自定义id,快速编码与生成ID
查看>>
[leetcode] Add Two Numbers
查看>>
elasticsearch suggest 的几种使用-completion 的基本 使用
查看>>
04-【MongoDB入门教程】mongo命令行
查看>>
字符串与整数之间的转换
查看>>
断点传输HTTP和URL协议
查看>>
redis 数据类型详解 以及 redis适用场景场合
查看>>
mysql服务器的主从配置
查看>>
巧用AJAX技术,通过updatePanel控件实现局部刷新
查看>>
20140420技术交流活动总结
查看>>
SaltStack配置salt-api
查看>>
各种情况下block的类型
查看>>
ThinkPHP 3.2.x 集成极光推送指北
查看>>