[应用方案] 单项链表基本操作

[复制链接]
1302|6
 楼主| orangebanana 发表于 2016-2-27 20:49 | 显示全部楼层 |阅读模式
all by chenge
1.初始化链表
2.创建链表,返回头指针
3.打印链表
4.获取长度
5.清空链表(这里有问题,清空之后表头地址变了,待改善)
6.获取第n个结点的data
7.向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0
8.排序单链表,降序,(算法慢,待优化)
其他操作基本上以此类推可得
------------------------------------------------------------------------------------------------------------------*/
  1. #include <stdio.h>
  2. #include<stdlib.h>
  3. typedef int type;
  4. #define  LEN  sizeof(struct node)
  5. typedef struct node
  6. {
  7.     type data;
  8.     struct node *next;
  9. }node;
  10. /*------------------------------------------------------------------------------------------------------------
  11. -------------------------------------初始化链表---------------------------------------------------------*/
  12. void initList(node ** phead){
  13.      *phead = NULL;
  14.      printf("initList函数执行,初始化成功\n");
  15. }
  16. /*------------------------------------------------------------------------------------------------------------------
  17. -------------------------------------创建链表,返回头指针-------------------------------------------------*/
  18. node * creatList(node * head){
  19.         node  *p, *pl;
  20.         head=p=(node * )malloc(LEN);
  21.         printf("creatList函数执行,请输入链表数据成员,以0结束\n");
  22.         scanf("%d",&p->data);/*头结点的数据成员*/
  23.         while(p->data!=0)   /*给出0结束条件,退出循环*/
  24.         {  
  25.                 pl=p;
  26.                 p=(node * )malloc(LEN);
  27.                 scanf("%d",&p->data);/*中间结点数据成员*/
  28.         if(p->data!=0){
  29.             pl->next=p;/*中间结点的指针成员值*/
  30.         }else{
  31.         break;
  32.         }
  33.         }
  34.         pl-> next=NULL;/*尾结点的指针成员值*/
  35.         
  36.          return head;
  37. }
  38. /*--------------------------------------------------------------------------------------------------------
  39. -----------------------------------------------打印链表------------------------------------------------*/
  40. void printList(node *head){
  41. if(NULL == head)   //链表为空
  42.     {
  43.         printf("printList函数执行,链表为空\n");
  44.     }
  45.     else
  46.     {
  47.         while(NULL != head)
  48.         {
  49.             printf("%d ",head->data);
  50.             head = head->next;
  51.         }
  52.         printf("\n");
  53.     }
  54. }
  55. /*------------------------------------------------------------------------------------------------------------
  56. -------------------------------------------------获取长度-------------------------------------------------*/
  57. int getLength(node * head){
  58. int length = 0;
  59. if(NULL == head)   //链表为空
  60.     {
  61.         printf("链表为空\n");
  62.     }
  63.     else
  64.     {
  65.   while(NULL != head)
  66.         {
  67.    length ++ ;
  68.             head = head->next;
  69.         }
  70.     }
  71. printf("length is : %d\n",length);
  72. return length;
  73. }
  74. /*------------------------------------------------------------------------------------------------------------
  75. -------------------------------------------------清空链表-------------------------------------------------*/


 楼主| orangebanana 发表于 2016-2-27 20:49 | 显示全部楼层
  1. void cleanList(node **phead)
  2. {
  3.     node *pNext;            //定义一个与phead相邻节点

  4.     if(*phead == NULL)
  5.     {
  6.         printf("clearList函数执行,链表为空\n");
  7.         return;
  8.     }
  9.     while(*phead != NULL)
  10.     {
  11.         pNext = (*phead)->next;//保存下一结点的指针
  12.         free(*phead);
  13.         *phead = pNext;      //表头下移
  14.     }
  15.     printf("clearList函数执行,链表已经清除\n");
  16. }
  17. /*------------------------------------------------------------------------------------------------------------
  18. ----------------------------------------获取第n个结点的data-----------------------------------------*/

  19. type getdatabyN(node * head,int n){
  20. int i=0;
  21.     if(n <= 0)
  22.     {
  23.         printf("getdatabyN函数执行,n值非法\n");
  24.         return 0;
  25.     }
  26.     if(head == NULL)
  27.     {
  28.         printf("getdatabyN函数执行,链表为空\n");
  29.         return 0;
  30.         //exit(1);
  31.     }
  32.     while(head !=NULL)
  33.     {
  34.         ++i;
  35.         if(i == n)
  36.         {
  37.             break;
  38.         }
  39.         head = head->next; //移到下一结点
  40.     }
  41.     if(i < n)                  //链表长度不足则退出
  42.     {
  43.         printf("getElement函数执行,pos值超出链表长度\n");
  44.         return 0;
  45.     }

  46.     return head->data;
  47. }
  48. /*---------------------------------------------------------------------------------------------------------------
  49. --向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0 ---*/
  50. int insertList(node **pNode, int pos, type elemInserted)
  51. {
  52. int i = 0;
  53. node *pInserted,*pTemp, *pLast;
  54.     if(NULL == *pNode)
  55.     {
  56.         printf("insertList函数执行,链表为空\n");
  57.         return 0;
  58.     }
  59.     if(elemInserted < 1)
  60.     {
  61.         printf("insertList函数执行,elemInserted值非法\n");
  62.         return 0;
  63.     }
  64.     if(pos < 1)
  65.     {
  66.         printf("insertList函数执行,pos值非法\n");
  67.         return 0;
  68.     }
  69.   
  70.     pTemp = *pNode;   //把*pNode先赋值给pTemp,后面的操作(例如循环链表到最后一个节点)主要是对pTemp进行操作,否则返回*pNode的时候,将返回链表*pNode在当前指针后面的部分,而不是整个链表。
  71.     //因为pTemp与*pNode指向同一个链表,所以对pTemp进行节点改动即是对*pNode作改动
  72.     pInserted = (node *)malloc(sizeof(node));
  73.     pInserted->data = elemInserted;
  74.     pInserted->next = NULL;  //先赋值为null
  75.     //循环链表至pos节点
  76.   
  77.     while(pTemp != NULL)
  78.     {
  79.         i++;
  80.         if(i == pos)
  81.         {
  82.             pLast->next = pInserted;  //让上一个节点的next指向插入节点
  83.             pInserted->next = pTemp;  //让插入节点的next指向下一节点
  84.             break;
  85.         }
  86.         pLast = pTemp;  //记住上一个节点的位置
  87.         pTemp = pTemp->next;
  88.     }
  89. printf("在%d插入%d得到",pos,elemInserted);
  90.     return 1;


 楼主| orangebanana 发表于 2016-2-27 20:50 | 显示全部楼层
  1. /*------------------------------------------------------------------------------------------------------------
  2. --------------------------------------------排序单链表,降序--------------------------------------------*/

  3. int sortList(node **pnode)
  4. {
  5. int p,k,i,Listsize;
  6.     node *pTemp;
  7. node *pCurr, *pLast;
  8.     if(NULL == *pnode)
  9.     {
  10.         printf("sortList函数执行,链表为空\n");
  11.         return 0;
  12.     }
  13.     pTemp = *pnode;
  14. Listsize = getLength(*pnode);
  15.     //循环: 用for循环来取代指针循环,因为指针循环一次后,下次起始的指针将自动转到下一节点,而我们还想从第一个元素开始
  16.     for( i=0; i < Listsize; i++)
  17.     {

  18.       
  19.         pCurr = pLast = pTemp;
  20.         for(k=0; k < Listsize-i; k++)
  21.         {
  22.              p = 0;
  23.          
  24.             if(pLast->data < pCurr->data)
  25.             {
  26.                 p = pLast->data;
  27.                 pLast->data = pCurr->data;
  28.                 pCurr->data = p;
  29.             }
  30.             pLast = pCurr;
  31.             pCurr = pCurr->next;
  32.         }
  33.     }
  34. printf("sortList函数执行,排序成功");
  35. }

  36. /*--------------------------------------*/
  37. /*-----------------主函数:测试---------------*/
  38. int main()
  39. {   
  40. node * head;
  41. initList(&head);               //初始化
  42. head = creatList(head);        //建表
  43. printList(head);               //印表
  44. getLength(head);               //多长
  45. insertList(&head,3,15);        //插数
  46. printList(head);               //印表
  47. sortList(&head);               //排序
  48. printList(head);               //印表
  49. cleanList(&head);              //清空
  50. printList(head);               //印表
  51. }
小狗爱吃骨头 发表于 2016-2-28 22:48 | 显示全部楼层
学好链表对于理解操作系统非常有帮助
zwwoshi 发表于 2016-2-29 14:17 | 显示全部楼层
IversonCar 发表于 2016-2-29 15:41 | 显示全部楼层
链表是C语言中最难的部分,学好不容易啊
dentsgot 发表于 2016-3-3 22:25 | 显示全部楼层
链表对于理解堆的概念很有帮助,也能更好的设计操作系统
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

113

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部