码迷,mamicode.com
首页 > 编程语言 > 详细

数据结构之C语言实现链表的操作

时间:2015-11-04 19:33:25      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:

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

 

数据结构之C语言实现链表的操作

标签:

原文地址:http://www.cnblogs.com/zeng-jie/p/4936871.html

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