C语言单链表,实现增删改查

不废话 直接上代码,COPY就能运行

#include <stdio.h>
#include <stdlib.h>
/**
*定义数据元素
*/
typedef struct{int id;char * name;char * gender;int age;
}ElemType;typedef struct node{ElemType data; //数据域struct Node * next; //指针域
}Node;
/**
*   头结点
*/
typedef struct Head{struct Node * next;int length; //链表长度
}Head;
/** 初始化链表*/
void InitLink(Head * head,ElemType * array,int length){int i;for(i = 0;i<length;i++){InsertLink(head,i+1,array[i]);}
}
/**前插法*/
void PreInsertLink(Head * head,int pos, ElemType data){Node * node = (Node * )malloc(sizeof(Node));node->data = data;node->next = head->next;head->next = node;head->length++;
}
/**尾插法插入元素*/
void InsertLink(Head * head,int pos, ElemType data){Node * node = (Node * )malloc(sizeof(Node));node->data = data;node->next = NULL;if(pos==1){head->next = node;head->length++;return;}Node * p = head->next;int i=1;while(p!=NULL&&i<pos-1){p = p->next;i++;}if(p){node->next = p->next;p->next = node;head->length++;}else{printf("插入位置不存在!\n");}
}
void PrintData(Head * head){Node * p = head->next;if(!p){printf("链表为空!\n");head->length = 0;return;}int i;for(i=0;i<head->length;i++){printf("%d\t%s\t%d\t%s\n",p->data.id,p->data.name,p->data.age,p->data.gender);p = p->next;}
}
Node * GetElementByPosition(Head * head,int pos){Node * p = head->next;int i=1;while(p!=NULL&&i!=pos){p=p->next;i++;}return p;
}
Node * GetElementById(Head * head,int id){Node * p = head->next;while(p!=NULL&&p->data.id!=id){p=p->next;}return p;
}
/**删除指定位置的元素返回该元素地址*/
ElemType  DeleteElemByPos(Head * head,int pos){if(pos<1&&pos>head->length){printf("删除位置不存在!");return;}ElemType elem;Node * p = NULL;if(pos==1){elem = p->data;p = head->next;head->next = p->next;free(p);head->length--;}Node * preNode; //前驱结点p = head->next;int i=1;while(p!=NULL&&i<pos){preNode = p;p=p->next;i++;}if(p){elem = p->data;preNode->next = p->next;//将后继结点的指针域赋值给前驱结点的指针域free(p);//释放内存空间head->length--;}return elem;
}
void menu(){int n;ElemType arrays[4] = {{1001,"张三","男",21},{1003,"刘萌","女",19},{1004,"李强","男",20},{1002,"李瑶","女",18}};Head head;head.length = 0;InitLink(&head,arrays,sizeof(arrays)/sizeof(arrays[0]));while(n!=6){printf("1,遍历输出数据\n");printf("2,按位置查找\n");printf("3,按学号查找\n");printf("4,在位置i处插入元素\n");printf("5,删除位置i处的元素\n");printf("6,退出\n");printf("请选择序号1-5\n");scanf("%d",&n);switch(n){case 1:PrintData(&head);break;case 2:{printf("请输入要查找的位置:\n");int n;scanf("%d",&n);Node * node = GetElementByPosition(&head,n);printf("查询到的数据:\n");printf("%d\t%s\t%s\t%d\n",node->data.id,node->data.name,node->data.gender,node->data.age);}break;case 3:{printf("请输入要查找的学号:\n");int n;scanf("%d",&n);Node * node = GetElementById(&head,n);printf("查询到的数据:\n");printf("%d\t%s\t%s\t%d\n",node->data.id,node->data.name,node->data.gender,node->data.age);}break;case 4:{ElemType newNode;printf("请输入要插入的学生id:\n");scanf("%d",&newNode.id);printf("请输入要插入的学生姓名:\n");newNode.name = (char *)malloc(10);scanf("%s",newNode.name);printf("请输入要插入的学生性别:\n");newNode.gender = (char *)malloc(10);scanf("%s",newNode.gender);printf("请输入要插入的学生年龄:\n");scanf("%d",&newNode.age);printf("请输入要插入的位置\n");int pos;scanf("%d",&pos);InsertLink(&head,pos,newNode);}break;case 5:{printf("请输入你要删除元素的位置:\n");int n;scanf("%d",&n);ElemType data = DeleteElemByPos(&head,n);printf("已经删除的元素为:\n");printf("%d\t%s\t%s\t%d\n",data.id,data.name,data.gender,data.age);}break;case 6:printf("退出成功!\n");exit(1);break;default:printf("输入错误请重新输入1-6!!!");break;}}
}
int main()
{menu();return 0;
}

如果对你有帮助点个赞吧!

路漫漫其修远兮

C语言单链表,能直接运行的代码!相关推荐

  1. C语言单链表初学容易掉的坑

    C语言单链表初学容易掉的坑 结点的指针没有分配内存. 一个链表最基本的操作有建立.增加.删除.查找,几乎所有操作都离不开中间结点p.比如,建立时先检查是否空链表,若是,则令head指向结点p所指向的值 ...

  2. C语言单链表实现初始化、创建、增、删、查等基本操作(详细)

    C语言单链表实现初始化.创建.增.删.查等基本操作 #include <stdio.h> #include <stdlib.h> #include <malloc.h&g ...

  3. C语言一趟冒泡交换最小值,C语言单链表冒泡排序为啥以下代码实现不了?

    struct node *sort(struct node *head)/*排序*/ { struct node *p,*q; struct node *temp; for(p=head;p!=NUL ...

  4. c语言单链表功能,[数据结构]单链表(C语言)的各种功能

    06-03阅读200,000 + 链表是一种常见的基本数据结构,在此充分利用了结构指针. 链表可以动态存储和分配,即链表是一个功能非常强大的数组. 他可以在节点中定义多种数据类型,并可以根据需要随意添 ...

  5. C++语言单链表实现荷兰旗问题

    C++语言单链表实现荷兰旗问题 一.设备及软件 VC6.0 二.语言 C++ 三.涉及的数据结构与算法 单链表.尾插法 四.问题描述 荷兰旗问题亦称三色旗问题. 这里荷兰旗用0,1,2分别表示三种颜色 ...

  6. C语言单链表基本操作总结

    C语言单链表基本操作     本文是参考他人实现的C语言单链表,对多篇博文整理的结果,仅作为学习笔记.文末有参考出处. 1.单链表定义 链表是通过一组任意的存储单元来存储线性表中的数据元素,这些存储单 ...

  7. C语言单链表代码实现

    C语言单链表代码实现 一.头文件.常量以及自定义数据结构 #include<stdio.h> #include<malloc.h> #include<stdlib.h&g ...

  8. c语言单链表倒置(附原理讲解)

    c语言单链表倒置 今天博主,讲一个单链表倒置的例子,事实上 话不多说,我们直接上代码,待会会给大家讲解倒置算法实现原理 #include<stdio.h> #include<stdl ...

  9. C语言 单链表通讯录基础版实现,保证看完都直呼easy

    C语言 单链表实现通讯录基础版,保证看完都大呼简单! --------------------------------- 首先在写通讯录之前,必须明确我们的需求: 因为是基础版,我在这里暂时只实现以下 ...

最新文章

  1. numpy使用[]语法索引二维numpy数组中倒数N列数据列的数值内容(accessing the last N columns in numpy array)
  2. 文字如何实现完美UI?文本排版设计告诉你
  3. 【Redis】Redis分布式集群几点说道
  4. ios 推送消息 php推送
  5. android 两个客户端间的通信(Socket通信)
  6. 程序员过关斩将--要想获取我的用户信息,就得按照规矩来
  7. 暗黑破坏神(ssl 2295)
  8. kotlin 复制对象属性_Kotlin 怎么学 ?遇到过哪些坑?
  9. 如何在Java中针对XSD验证XML
  10. TCP数据报结构以及三次握手(图解)
  11. 机械制造技术基础【3】
  12. Electron客户端的自动升级方案-2022版
  13. Maple中solve和dsolve的区别:solve方程解,dsolve常微分方程解
  14. 应用程序无响应的原因
  15. python中类似对象吗_关于性能:什么是Python中最快的(访问)类似结构的对象?
  16. 有线以太网RJ45网口转无线WiFi,网卡转wifi,有线转无线,RJ45转wifi方案
  17. 农历公历万年历互查系统
  18. Android移动应用程序开发
  19. Vim位置标记mark详解
  20. 夏季来临,警惕蜱虫叮咬感染疾病——莱姆病

热门文章

  1. 反问疑问_反问疑问句的语法
  2. 使用后羿采集器采集数据,并导出到MySql数据库中
  3. 计算机专业补课,计算机老师坚持五年每天免费为孩子补习语数外
  4. Matlab在win10运行不出图片,win10系统网页图片加载不出来的六种原因及解决方法...
  5. 《基于Android微博整合客户端的设计与实现》毕业设计论文任务书
  6. 使用机器学习模型预测贷款资格
  7. Andriod studio 学习 之打包
  8. 【沐风老师】3DMAX实线转虚线插件DashedShape使用教程
  9. python下载酷狗音乐源码
  10. 视频流媒体播放器EasyPlayer-RTSP-Android 如何随意切换播放视频流?