#include "stdafx.h"
#include "stdio.h"
#include <stdlib.h>
#include "string.h"typedef int elemType ;/************************************************************************/
/*             以下是关于线性表链接存储(单链表)操作的18种算法        *//* 1.初始化线性表,即置单链表的表头指针为空 */
/* 2.创建线性表,此函数输入负数终止读取数据*/
/* 3.打印链表,链表的遍历*/
/* 4.清除线性表L中的所有元素,即释放单链表L中所有的结点,使之成为一个空表 */
/* 5.返回单链表的长度 */
/* 6.检查单链表是否为空,若为空则返回1,否则返回0 */
/* 7.返回单链表中第pos个结点中的元素,若pos超出范围,则停止程序运行 */
/* 8.从单链表中查找具有给定值x的第一个元素,若查找成功则返回该结点data域的存储地址,否则返回NULL */
/* 9.把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0 */
/* 10.向单链表的表头插入一个元素 */
/* 11.向单链表的末尾添加一个元素 */
/* 12.向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0 */
/* 13.向有序单链表中插入元素x结点,使得插入后仍然有序 */
/* 14.从单链表中删除表头结点,并把该结点的值返回,若删除失败则停止程序运行 */
/* 15.从单链表中删除表尾结点并返回它的值,若删除失败则停止程序运行 */
/* 16.从单链表中删除第pos个结点并返回它的值,若删除失败则停止程序运行 */
/* 17.从单链表中删除值为x的第一个结点,若删除成功则返回1,否则返回0 */
/* 18.交换2个元素的位置 */
/* 19.将线性表进行快速排序 *//************************************************************************/
typedef struct Node{    /* 定义单链表结点类型 */elemType element;Node *next;
}Node;/* 1.初始化线性表,即置单链表的表头指针为空 */
void initList(Node **pNode)
{*pNode = NULL;printf("initList函数执行,初始化成功\n");
}/* 2.创建线性表,此函数输入负数终止读取数据*/
Node *creatList(Node *pHead)
{Node *p1;Node *p2;p1=p2=(Node *)malloc(sizeof(Node)); //申请新节点if(p1 == NULL || p2 ==NULL){printf("内存分配失败\n");exit(0);}memset(p1,0,sizeof(Node));scanf("%d",&p1->element);    //输入新节点p1->next = NULL;         //新节点的指针置为空while(p1->element > 0)        //输入的值大于0则继续,直到输入的值为负{if(pHead == NULL)       //空表,接入表头{pHead = p1;}else               {p2->next = p1;       //非空表,接入表尾}p2 = p1;p1=(Node *)malloc(sizeof(Node));    //再重申请一个节点if(p1 == NULL || p2 ==NULL){printf("内存分配失败\n");exit(0);}memset(p1,0,sizeof(Node));scanf("%d",&p1->element);p1->next = NULL;}printf("creatList函数执行,链表创建成功\n");return pHead;           //返回链表的头指针
}/* 3.打印链表,链表的遍历*/
void printList(Node *pHead)
{if(NULL == pHead)   //链表为空{printf("PrintList函数执行,链表为空\n");}else{while(NULL != pHead){printf("%d ",pHead->element);pHead = pHead->next;}printf("\n");}
}/* 4.清除线性表L中的所有元素,即释放单链表L中所有的结点,使之成为一个空表 */
void clearList(Node *pHead)
{Node *pNext;            //定义一个与pHead相邻节点if(pHead == NULL){printf("clearList函数执行,链表为空\n");return;}while(pHead->next != NULL){pNext = pHead->next;//保存下一结点的指针free(pHead);pHead = pNext;      //表头下移}printf("clearList函数执行,链表已经清除\n");
}/* 5.返回单链表的长度 */
int sizeList(Node *pHead)
{int size = 0;while(pHead != NULL){size++;         //遍历链表size大小比链表的实际长度小1pHead = pHead->next;}printf("sizeList函数执行,链表长度 %d \n",size);return size;    //链表的实际长度
}/* 6.检查单链表是否为空,若为空则返回1,否则返回0 */
int isEmptyList(Node *pHead)
{if(pHead == NULL){printf("isEmptyList函数执行,链表为空\n");return 1;}printf("isEmptyList函数执行,链表非空\n");return 0;
}/* 7.返回单链表中第pos个结点中的元素,若pos超出范围,则停止程序运行 */
elemType getElement(Node *pHead, int pos)
{int i=0;if(pos < 1){printf("getElement函数执行,pos值非法\n");return 0;}if(pHead == NULL){printf("getElement函数执行,链表为空\n");return 0;//exit(1);}while(pHead !=NULL){++i;if(i == pos){break;}pHead = pHead->next; //移到下一结点}if(i < pos)                  //链表长度不足则退出{printf("getElement函数执行,pos值超出链表长度\n");return 0;}return pHead->element;
}/* 8.从单链表中查找具有给定值x的第一个元素,若查找成功则返回该结点data域的存储地址,否则返回NULL */
elemType *getElemAddr(Node *pHead, elemType x)
{if(NULL == pHead){printf("getElemAddr函数执行,链表为空\n");return NULL;}if(x < 0){printf("getElemAddr函数执行,给定值X不合法\n");return NULL;}while((pHead->element != x) && (NULL != pHead->next)) //判断是否到链表末尾,以及是否存在所要找的元素{pHead = pHead->next;}if((pHead->element != x) && (pHead != NULL)){printf("getElemAddr函数执行,在链表中未找到x值\n");return NULL;}if(pHead->element == x){printf("getElemAddr函数执行,元素 %d 的地址为 0x%x\n",x,&(pHead->element));}return &(pHead->element);//返回元素的地址
}/* 9.把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0 */
int modifyElem(Node *pNode,int pos,elemType x)
{Node *pHead;pHead = pNode;int i = 0;if(NULL == pHead){printf("modifyElem函数执行,链表为空\n");}if(pos < 1){printf("modifyElem函数执行,pos值非法\n");return 0;}while(pHead !=NULL){++i;if(i == pos){break;}pHead = pHead->next; //移到下一结点}if(i < pos)                  //链表长度不足则退出{printf("modifyElem函数执行,pos值超出链表长度\n");return 0;}pNode = pHead;pNode->element = x;printf("modifyElem函数执行\n");return 1;
}/* 10.向单链表的表头插入一个元素 */
int insertHeadList(Node **pNode,elemType insertElem)
{Node *pInsert;pInsert = (Node *)malloc(sizeof(Node));memset(pInsert,0,sizeof(Node));pInsert->element = insertElem;pInsert->next = *pNode;*pNode = pInsert;printf("insertHeadList函数执行,向表头插入元素成功\n");return 1;
}/* 11.向单链表的末尾添加一个元素 */
int insertLastList(Node **pNode,elemType insertElem)
{Node *pInsert;Node *pHead;Node *pTmp; //定义一个临时链表用来存放第一个节点pHead = *pNode;pTmp = pHead;pInsert = (Node *)malloc(sizeof(Node)); //申请一个新节点memset(pInsert,0,sizeof(Node));pInsert->element = insertElem;while(pHead->next != NULL){pHead = pHead->next;}pHead->next = pInsert;   //将链表末尾节点的下一结点指向新添加的节点*pNode = pTmp;printf("insertLastList函数执行,向表尾插入元素成功\n");return 1;
}/* 12.向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0 *//* 13.向有序单链表中插入元素x结点,使得插入后仍然有序 */
/* 14.从单链表中删除表头结点,并把该结点的值返回,若删除失败则停止程序运行 */
/* 15.从单链表中删除表尾结点并返回它的值,若删除失败则停止程序运行 */
/* 16.从单链表中删除第pos个结点并返回它的值,若删除失败则停止程序运行 */
/* 17.从单链表中删除值为x的第一个结点,若删除成功则返回1,否则返回0 */
/* 18.交换2个元素的位置 */
/* 19.将线性表进行快速排序 *//******************************************************************/
int main()
{Node *pList=NULL;int length = 0;elemType posElem;initList(&pList);       //链表初始化printList(pList);       //遍历链表,打印链表pList=creatList(pList); //创建链表printList(pList);sizeList(pList);        //链表的长度printList(pList);isEmptyList(pList);     //判断链表是否为空链表posElem = getElement(pList,3);  //获取第三个元素,如果元素不足3个,则返回0printf("getElement函数执行,位置 3 中的元素为 %d\n",posElem);   printList(pList);getElemAddr(pList,5);   //获得元素5的地址modifyElem(pList,4,1);  //将链表中位置4上的元素修改为1printList(pList);insertHeadList(&pList,5);   //表头插入元素12printList(pList);insertLastList(&pList,10);  //表尾插入元素10printList(pList);clearList(pList);       //清空链表system("pause");}

C语言单链表实现19个功能完全详解相关推荐

  1. c语言编程单向,C语言单向链表的表示与实现实例详解

    1.概述: C语言中的单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 链表中最简单的一种是单向链表,它包含两个域,一个信息域和一个指针域.这个链 ...

  2. 【玩转链表①】单链表动图图解(超详解)

    学习导航 一.前言 二.快速入门链表 ①漫画图解 ②与顺序表的区别 三.链表接口的实现 ①准备函数 ②尾插和头插 ③头删和尾删 ④查找 ⑤向后插入向后删除 ⑥向前插入向前删除 ⑦向前插入pos节点处删 ...

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

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

  4. C语言单链表,能直接运行的代码!

    C语言单链表,实现增删改查 不废话 直接上代码,COPY就能运行 #include <stdio.h> #include <stdlib.h> /** *定义数据元素 */ t ...

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

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

  6. 字符串的冒泡排序c语言,c语言单链表冒泡排序_c语言字符串排序冒泡法_c语言链表排序...

    1. #include 2. 3. struct Node; 4. 5. typedef struct Node *PtrToNode; 6. typedef PtrToNode List; 7. t ...

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

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

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

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

  9. C语言---单链表(详解)---数据结构

    单链表所需要的头文件 重命名类型的意义在于以后还需要用到单链表时,存入的类型不一定时int类型,需要更改类型时,要一个个更改,非常麻烦,我们可以直接在这里修改,更加方便(这里的解释我上一篇也有提到) ...

最新文章

  1. html5移动站点是什么,浅谈移动站点优化之痛-HTML5 什么是html5?
  2. css清除浮动的处理方法
  3. Ubuntu+PHP+Apache+Xdebug 使用方法
  4. cond_resched()
  5. 11月22日弹性计算跟您在广州不见不散
  6. Codeforces Round #734 (Div. 3) (A-D1)
  7. 2018年手机摄像头模组市场调研报告
  8. HttpHandler和ashx使用Session 出现未初始化异常
  9. Oracle数据库使用Navicat premium创建用户时遇到的坑
  10. ip地址切换 线路切换 网吧线路切换器 ip地址切换器
  11. 排序算法总结(Python实现)——(一)
  12. tahoma字体对中文字的影响
  13. 20层的试炼html5,Vue.js-02:新手村的试炼 - 新世界的武器(指令)
  14. DFM文件以及写该文章的原因等等
  15. Linux、git和github的故事
  16. sql注入空格被过滤_SQL注入:各种绕过检测的姿势
  17. 软件测试经典面试题之二
  18. educoder算法设计与分析 实验一扩展 袋鼠过河问题
  19. JAVA JSP javaweb网上订餐系统餐厅点餐系统源码(ssm点餐系统)网上订餐系统在线订餐
  20. 弹出文件夹选择对话框

热门文章

  1. 软工概论第十三周总结
  2. Java发送邮件的简单实现
  3. Tushare的安装
  4. CocoStudio游戏发布后资源加密大致实现思路
  5. 软件设计是怎样炼成的(6)——打造系统的底蕴(数据库设计)(上篇)
  6. gnome Nautilus cannot handle computer locations
  7. SpringCloud-Hytrix
  8. Java并发基础构建模块简介
  9. 由点到面 旅游让丝路明珠敦煌更加智慧
  10. sphinx配置文件继承