Chinaunix首页 | 论坛 | 博客
  • 博客访问: 40644
  • 博文数量: 8
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 82
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-19 14:23
个人简介

本尊不死,尔等终究为奴...

文章分类

全部博文(8)

文章存档

2016年(1)

2015年(4)

2013年(3)

我的朋友

分类: C/C++

2013-07-20 10:55:20







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

点击(此处)折叠或打开

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

 

阅读(1310) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

鱼门客栈2013-07-22 09:19:46

.   good