三木社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 385|回复: 0
打印 上一主题 下一主题

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

[复制链接]

1562

主题

1564

帖子

4904

积分

博士

Rank: 8Rank: 8

积分
4904
跳转到指定楼层
楼主
发表于 2017-9-2 09:23:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "stdio.h"  
  2. #include <stdlib.h>  
  3. #include "string.h"  
  4.    
  5. typedef int elemType ;  
  6.    
  7. /************************************************************************/  
  8. /*             以下是关于线性表链接存储(单链表)操作的18种算法        */  
  9.    
  10. /* 1.初始化线性表,即置单链表的表头指针为空 */  
  11. /* 2.创建线性表,此函数输入负数终止读取数据*/  
  12. /* 3.打印链表,链表的遍历*/  
  13. /* 4.清除线性表L中的所有元素,即释放单链表L中所有的结点,使之成为一个空表 */  
  14. /* 5.返回单链表的长度 */  
  15. /* 6.检查单链表是否为空,若为空则返回1,否则返回0 */  
  16. /* 7.返回单链表中第pos个结点中的元素,若pos超出范围,则停止程序运行 */  
  17. /* 8.从单链表中查找具有给定值x的第一个元素,若查找成功则返回该结点data域的存储地址,否则返回NULL */  
  18. /* 9.把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0 */  
  19. /* 10.向单链表的表头插入一个元素 */  
  20. /* 11.向单链表的末尾添加一个元素 */  
  21. /* 12.向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0 */  
  22. /* 13.向有序单链表中插入元素x结点,使得插入后仍然有序 */  
  23. /* 14.从单链表中删除表头结点,并把该结点的值返回,若删除失败则停止程序运行 */  
  24. /* 15.从单链表中删除表尾结点并返回它的值,若删除失败则停止程序运行 */  
  25. /* 16.从单链表中删除第pos个结点并返回它的值,若删除失败则停止程序运行 */  
  26. /* 17.从单链表中删除值为x的第一个结点,若删除成功则返回1,否则返回0 */  
  27. /* 18.交换2个元素的位置 */  
  28. /* 19.将线性表进行快速排序 */  
  29.    
  30.    
  31. /************************************************************************/  
  32. typedef struct Node{    /* 定义单链表结点类型 */  
  33.     elemType element;  
  34.     Node *next;  
  35. }Node;  
  36.    
  37.    
  38. /* 1.初始化线性表,即置单链表的表头指针为空 */  
  39. void initList(Node **pNode)  
  40. {  
  41.     *pNode = NULL;  
  42.     printf("initList函数执行,初始化成功\n");  
  43. }  
  44.    
  45. /* 2.创建线性表,此函数输入负数终止读取数据*/  
  46. Node *creatList(Node *pHead)  
  47. {  
  48.     Node *p1;  
  49.     Node *p2;  
  50.    
  51.     p1=p2=(Node *)malloc(sizeof(Node)); //申请新节点  
  52.     if(p1 == NULL || p2 ==NULL)  
  53.     {  
  54.         printf("内存分配失败\n");  
  55.         exit(0);  
  56.     }  
  57.     memset(p1,0,sizeof(Node));  
  58.    
  59.     scanf("%d",&p1->element);    //输入新节点  
  60.     p1->next = NULL;         //新节点的指针置为空  
  61.     while(p1->element > 0)        //输入的值大于0则继续,直到输入的值为负  
  62.     {  
  63.         if(pHead == NULL)       //空表,接入表头  
  64.         {  
  65.             pHead = p1;  
  66.         }  
  67.         else                 
  68.         {  
  69.             p2->next = p1;       //非空表,接入表尾  
  70.         }  
  71.         p2 = p1;  
  72.         p1=(Node *)malloc(sizeof(Node));    //再重申请一个节点  
  73.         if(p1 == NULL || p2 ==NULL)  
  74.         {  
  75.         printf("内存分配失败\n");  
  76.         exit(0);  
  77.         }  
  78.         memset(p1,0,sizeof(Node));  
  79.         scanf("%d",&p1->element);  
  80.         p1->next = NULL;  
  81.     }  
  82.     printf("creatList函数执行,链表创建成功\n");  
  83.     return pHead;           //返回链表的头指针  
  84. }  
  85.    
  86. /* 3.打印链表,链表的遍历*/  
  87. void printList(Node *pHead)  
  88. {  
  89.     if(NULL == pHead)   //链表为空  
  90.     {  
  91.         printf("PrintList函数执行,链表为空\n");  
  92.     }  
  93.     else  
  94.     {  
  95.         while(NULL != pHead)  
  96.         {  
  97.             printf("%d ",pHead->element);  
  98.             pHead = pHead->next;  
  99.         }  
  100.         printf("\n");  
  101.     }  
  102. }  
  103.    
  104. /* 4.清除线性表L中的所有元素,即释放单链表L中所有的结点,使之成为一个空表 */  
  105. void clearList(Node *pHead)  
  106. {  
  107.     Node *pNext;            //定义一个与pHead相邻节点  
  108.    
  109.     if(pHead == NULL)  
  110.     {  
  111.         printf("clearList函数执行,链表为空\n");  
  112.         return;  
  113.     }  
  114.     while(pHead->next != NULL)  
  115.     {  
  116.         pNext = pHead->next;//保存下一结点的指针  
  117.         free(pHead);  
  118.         pHead = pNext;      //表头下移  
  119.     }  
  120.     printf("clearList函数执行,链表已经清除\n");  
  121. }  
  122.    
  123. /* 5.返回单链表的长度 */  
  124. int sizeList(Node *pHead)  
  125. {  
  126.     int size = 0;  
  127.    
  128.     while(pHead != NULL)  
  129.     {  
  130.         size++;         //遍历链表size大小比链表的实际长度小1  
  131.         pHead = pHead->next;  
  132.     }  
  133.     printf("sizeList函数执行,链表长度 %d \n",size);  
  134.     return size;    //链表的实际长度  
  135. }  
  136.    
  137. /* 6.检查单链表是否为空,若为空则返回1,否则返回0 */  
  138. int isEmptyList(Node *pHead)  
  139. {  
  140.     if(pHead == NULL)  
  141.     {  
  142.         printf("isEmptyList函数执行,链表为空\n");  
  143.         return 1;  
  144.     }  
  145.     printf("isEmptyList函数执行,链表非空\n");  
  146.    
  147.     return 0;  
  148. }  
  149.    
  150. /* 7.返回单链表中第pos个结点中的元素,若pos超出范围,则停止程序运行 */  
  151. elemType getElement(Node *pHead, int pos)  
  152. {  
  153.     int i=0;  
  154.    
  155.     if(pos < 1)  
  156.     {  
  157.         printf("getElement函数执行,pos值非法\n");  
  158.         return 0;  
  159.     }  
  160.     if(pHead == NULL)  
  161.     {  
  162.         printf("getElement函数执行,链表为空\n");  
  163.         return 0;  
  164.         //exit(1);  
  165.     }  
  166.     while(pHead !=NULL)  
  167.     {  
  168.         ++i;  
  169.         if(i == pos)  
  170.         {  
  171.             break;  
  172.         }  
  173.         pHead = pHead->next; //移到下一结点  
  174.     }  
  175.     if(i < pos)                  //链表长度不足则退出  
  176.     {  
  177.         printf("getElement函数执行,pos值超出链表长度\n");  
  178.         return 0;  
  179.     }  
  180.    
  181.     return pHead->element;  
  182. }  
  183.    
  184. /* 8.从单链表中查找具有给定值x的第一个元素,若查找成功则返回该结点data域的存储地址,否则返回NULL */  
  185. elemType *getElemAddr(Node *pHead, elemType x)  
  186. {  
  187.     if(NULL == pHead)  
  188.     {  
  189.         printf("getElemAddr函数执行,链表为空\n");  
  190.         return NULL;  
  191.     }  
  192.     if(x < 0)  
  193.     {  
  194.         printf("getElemAddr函数执行,给定值X不合法\n");  
  195.         return NULL;  
  196.     }  
  197.     while((pHead->element != x) && (NULL != pHead->next)) //判断是否到链表末尾,以及是否存在所要找的元素  
  198.     {  
  199.         pHead = pHead->next;  
  200.     }  
  201.     if((pHead->element != x) && (pHead != NULL))  
  202.     {  
  203.         printf("getElemAddr函数执行,在链表中未找到x值\n");  
  204.         return NULL;  
  205.     }  
  206.     if(pHead->element == x)  
  207.     {  
  208.         printf("getElemAddr函数执行,元素 %d 的地址为 0x%x\n",x,&(pHead->element));  
  209.     }  
  210.    
  211.     return &(pHead->element);//返回元素的地址  
  212. }  
  213.    
  214. /* 9.把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0 */  
  215. int modifyElem(Node *pNode,int pos,elemType x)  
  216. {  
  217.     Node *pHead;  
  218.     pHead = pNode;  
  219.     int i = 0;  
  220.    
  221.     if(NULL == pHead)  
  222.     {  
  223.         printf("modifyElem函数执行,链表为空\n");  
  224.     }  
  225.     if(pos < 1)  
  226.     {  
  227.         printf("modifyElem函数执行,pos值非法\n");  
  228.         return 0;  
  229.     }  
  230.     while(pHead !=NULL)  
  231.     {  
  232.         ++i;  
  233.         if(i == pos)  
  234.         {  
  235.             break;  
  236.         }  
  237.         pHead = pHead->next; //移到下一结点  
  238.     }  
  239.     if(i < pos)                  //链表长度不足则退出  
  240.     {  
  241.         printf("modifyElem函数执行,pos值超出链表长度\n");  
  242.         return 0;  
  243.     }  
  244.     pNode = pHead;  
  245.     pNode->element = x;  
  246.     printf("modifyElem函数执行\n");  
  247.       
  248.     return 1;  
  249. }  
  250.    
  251. /* 10.向单链表的表头插入一个元素 */  
  252. int insertHeadList(Node **pNode,elemType insertElem)  
  253. {  
  254.     Node *pInsert;  
  255.     pInsert = (Node *)malloc(sizeof(Node));  
  256.     memset(pInsert,0,sizeof(Node));  
  257.     pInsert->element = insertElem;  
  258.     pInsert->next = *pNode;  
  259.     *pNode = pInsert;  
  260.     printf("insertHeadList函数执行,向表头插入元素成功\n");  
  261.    
  262.     return 1;  
  263. }  
  264.    
  265. /* 11.向单链表的末尾添加一个元素 */  
  266. int insertLastList(Node **pNode,elemType insertElem)  
  267. {  
  268.     Node *pInsert;  
  269.     Node *pHead;  
  270.     Node *pTmp; //定义一个临时链表用来存放第一个节点  
  271.    
  272.     pHead = *pNode;  
  273.     pTmp = pHead;  
  274.     pInsert = (Node *)malloc(sizeof(Node)); //申请一个新节点  
  275.     memset(pInsert,0,sizeof(Node));  
  276.     pInsert->element = insertElem;  
  277.    
  278.     while(pHead->next != NULL)  
  279.     {  
  280.         pHead = pHead->next;  
  281.     }  
  282.     pHead->next = pInsert;   //将链表末尾节点的下一结点指向新添加的节点  
  283.     *pNode = pTmp;  
  284.     printf("insertLastList函数执行,向表尾插入元素成功\n");  
  285.    
  286.     return 1;  
  287. }  
  288.    
  289. /* 12.向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0 */  
  290.    
  291.    
  292. /* 13.向有序单链表中插入元素x结点,使得插入后仍然有序 */  
  293. /* 14.从单链表中删除表头结点,并把该结点的值返回,若删除失败则停止程序运行 */  
  294. /* 15.从单链表中删除表尾结点并返回它的值,若删除失败则停止程序运行 */  
  295. /* 16.从单链表中删除第pos个结点并返回它的值,若删除失败则停止程序运行 */  
  296. /* 17.从单链表中删除值为x的第一个结点,若删除成功则返回1,否则返回0 */  
  297. /* 18.交换2个元素的位置 */  
  298. /* 19.将线性表进行快速排序 */  
  299.    
  300. /******************************************************************/  
  301. int main()  
  302. {  
  303.     Node *pList=NULL;  
  304.     int length = 0;  
  305.    
  306.     elemType posElem;  
  307.    
  308.     initList(&pList);       //链表初始化  
  309.     printList(pList);       //遍历链表,打印链表  
  310.    
  311.     pList=creatList(pList); //创建链表  
  312.     printList(pList);  
  313.       
  314.     sizeList(pList);        //链表的长度  
  315.     printList(pList);  
  316.    
  317.     isEmptyList(pList);     //判断链表是否为空链表  
  318.       
  319.     posElem = getElement(pList,3);  //获取第三个元素,如果元素不足3个,则返回0  
  320.     printf("getElement函数执行,位置 3 中的元素为 %d\n",posElem);     
  321.     printList(pList);  
  322.    
  323.     getElemAddr(pList,5);   //获得元素5的地址  
  324.    
  325.     modifyElem(pList,4,1);  //将链表中位置4上的元素修改为1  
  326.     printList(pList);  
  327.    
  328.     insertHeadList(&pList,5);   //表头插入元素12  
  329.     printList(pList);  
  330.    
  331.     insertLastList(&pList,10);  //表尾插入元素10  
  332.     printList(pList);  
  333.    
  334.     clearList(pList);       //清空链表  
  335.     system("pause");  
  336.       
  337. }  
复制代码


回复

使用道具 举报

Archiver|手机版|小黑屋|三木电子社区 ( 辽ICP备11000133号-4 )

辽公网安备 21021702000620号

GMT+8, 2025-10-22 00:36 , Processed in 0.028306 second(s), 22 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表