码迷,mamicode.com
首页 > 其他好文 > 详细

链表测试

时间:2018-11-27 21:03:22      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:alt   lib   div   val   back   分配   bubuko   style   返回   

  1 /*
  2     链表测试
  3 */
  4 
  5 #include <stdio.h>  
  6 //#include <stdlib.h>  
  7 //#include <malloc.h>  
  8 
  9 #define true    1
 10 #define false    0
 11 
 12 /*定义链表中的节点*/  
 13 typedef struct node
 14 {
 15     int member;                /*节点中的成员*/
 16     struct node *pNext;        /*指向下一个节点的指针*/
 17 }Node, *pNode;
 18 
 19 /*创建链表函数*/
 20 pNode CreateList(void);                       
 21 /*遍历链表函数*/
 22 void TraverseList(pNode);               
 23 /*链表节点插入函数*/
 24 unsigned char Insert_Node(pNode pHead, int front, int data);
 25 /*删除链表节点*/
 26 int Del_Node(pNode, int);
 27 
 28 /*主函数*/
 29 int main()
 30 {
 31     pNode pHead = NULL;            /*定义初始化头节点,等价于 struct Node *pHead == NULL*/
 32     int data;                    /*作为Insert_Node函数的第三个参数*/   
 33     int num;                    /*作为Inset_Node函数第二个参数*/      
 34     int choose;
 35     int return_val;
 36     pHead = CreateList();        /*创建一个非循环单链表,并将该链表的头结点的地址付给pHead*/    
 37     
 38     while (1)
 39     {
 40         printf("你输入的数据是:");
 41         TraverseList(pHead);    /*调用遍历链表函数*/
 42         printf("是否还要进行如下操作:\n");
 43         printf("1.插入数据      2.删除数据\n");
 44         printf("请输入:");
 45         scanf_s("%d", &choose);
 46         switch (choose)
 47         {
 48         case 1:
 49         {
 50             printf("请输入要在第几个节点前插入数据:");
 51             scanf_s("%d", &num);
 52             printf("请输入要插入的数据:");
 53             scanf_s("%d", &data);
 54             if (Insert_Node(pHead, num, data) == true)
 55             {
 56                 printf("插入成功\n插入后的数据是:\n");
 57                 TraverseList(pHead);
 58             }
 59             else
 60             {
 61                 printf("插入失败\n");
 62             }
 63             printf("操作完成后的数据是:");
 64             TraverseList(pHead);
 65             break;
 66         }
 67         case 2:
 68         {
 69             printf("请输入要删除第几个节点的数据:");
 70             scanf_s("%d", &num);
 71             return_val = Del_Node(pHead, num);
 72             if (return_val == 0)
 73             {
 74                 printf("删除失败。\n");
 75             }
 76             else
 77             {
 78                 printf("删除成功。删除的元素是:%d\n", return_val);
 79             }
 80             printf("操作完成后的数据是:");
 81             TraverseList(pHead);
 82         }
 83         default: break;
 84         }
 85     }
 86     
 87     return 0;
 88 }
 89 
 90 /*
 91     创建链表
 92 */
 93 pNode CreateList(void)
 94 {
 95     int i;
 96     int len;                                        /*存放节点个数*/ 
 97     int val;                                        /*用于临时存放用户输入的数据*/      
 98     pNode pHead = (pNode)malloc(sizeof(Node));        /*分配一个不存放有效数据的头结点*/
 99     pNode pTail = pHead;                            /*链表的最后一个节点*/
100     pTail->pNext = NULL;                            /*最后一个节点的指针置为空*/
101 
102     printf("请输入节点个数:");
103     scanf_s("%d", &len);
104     for (i = 0; i < len; i++)
105     {
106         printf("第 %d 个节点的数值:", i + 1);
107         scanf_s("%d", &val);
108         pNode pNew = (pNode)malloc(sizeof(Node));    /*为节点分配空间*/    
109         pNew->member = val;                            /*将用户输入的数据赋给节点的成员*/  
110         pTail->pNext = pNew;                        /*将最后一个节点(第一次其实是pHead)的指针指向下一个新的节点*/  
111         pNew->pNext = NULL;                            /*将新节点中的指针置为空*/
112         pTail = pNew;                                /*将新节点赋给最后的一个节点*/
113     }
114     return pHead;                                    /*返回头节点*/
115 }
116 
117 /*
118     遍历链表
119 */      
120 void TraverseList(pNode pHead)
121 {
122     pNode p = pHead->pNext;
123     while (NULL != p)
124     {
125         printf("%d ", p->member);
126         p = p->pNext;
127     }
128     printf("\n");
129     return;
130 }
131 
132 /*
133     链表节点插入函数
134     第一个参数是头节点,第二个参数是要在第几个节点前插入,第三个参数是要插入的数据
135 */
136 unsigned char Insert_Node(pNode pHead, int front, int data)
137 {
138     int i = 0;
139     pNode _node = pHead;
140     pNode pSwap;
141     if ((front < 1) && (NULL != _node))
142     {
143         return false;
144     }
145     while (i < front - 1)                        /*找到要插入的节点,获取该节点的指针,后面用于连接新插入的节点*/    
146     {
147         _node = _node->pNext;
148         ++i;
149     }
150     pNode pNew = (pNode)malloc(sizeof(Node));
151 
152     pNew->member = data;                        /*把输入的数据赋给要插入的节点*/
153     pSwap = _node->pNext;                        /*把下一个节点的地址,给用于交换的pSwap*/  
154     _node->pNext = pNew;                        /*把要插入的节点的地址,给上个节点的指针域*/      
155     pNew->pNext = pSwap;                        /*把插入节点的下一个节点的地址,给插入节点的指针域*/  
156     return true;
157 }
158 /*
159     删除节点,返回被删除节点的数据
160     第一个参数是头节点,第二个参数是要删除第几个节点
161 */
162 int Del_Node(pNode pHead, int back)
163 {
164     int i = 0;
165     int data;
166     pNode _node = pHead;
167     pNode pSwap;
168     if ((back < 1) && (NULL == _node->pNext))
169     {
170         printf("删除失败!\n");
171         return 0;
172     }
173     while (i < back - 1)
174     {
175         _node = _node->pNext;
176         ++i;
177     }
178     pSwap = _node->pNext;
179     data = pSwap->member;
180     _node->pNext = _node->pNext->pNext;
181     free(pSwap);                                /*释放申请的内存*/
182     return data;
183 }
【调试截图】
技术分享图片

【链表结构】

技术分享图片

【参考】

 https://www.cnblogs.com/chenxiaohei/p/6862791.html

 


 

链表测试

标签:alt   lib   div   val   back   分配   bubuko   style   返回   

原文地址:https://www.cnblogs.com/jasming/p/10028545.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!