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

  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 }
时间: 2024-10-26 13:43:18

数据结构之C语言实现链表的操作的相关文章

数据结构之 线性表---单链表的操作B(先逆序+再删除重复元素)

数据结构上机测试2-2:单链表操作B Time Limit: 1000MS Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个). 输入 第一行输入元素个数n: 第二行输入n个整数. 输出 第一行输出初始链表元素个数: 第二行输出按照逆位序所建立的初始链表: 第三行输出删除重复元素后的单链表元素个数: 第四行输出删除重复元素后的单链表. 示例输入 10 21 30 14 55 32 63

数据结构之---c语言实现栈及其操作

//c语言实现栈及其基本操作 //杨鑫 #include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 typedef int ElementType; typedef struct node { ElementType data; struct node *next; }StackNode, *LinkStack; void init_stack(LinkStack top) { top->next

C语言实现链表及其操作

#include <stdio.h> #include <stdlib.h> //定义节点 typedef struct Node { int data; struct Node * PNext; }*PNode,Node; //初始化函数 PNode create_list();//创建节点 //打印出链表 void traverse_list(PNode); //删除节点pos 从1 开始 void delete_node(PNode,int,int *); //插入节点 po

数据结构上机测试2-1:单链表操作A (顺序建表+关键字删除)

数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除.分别输出建立的初始单链表和完成删除后的单链表. 输入 第一行输入数据个数n: 第二行依次输入n个整数: 第三行输入欲删除数据m. 输出 第一行输出原始单链表的长度: 第二行依次输出原始单链表的数据: 第三行输出完成删除后的单链表长度: 第四行依次输出完成删除后的

【数据结构】两个单循环链表的连接操作

如果在单链表或头指针表示的链表上操作这个比较消耗性能,因为都需要遍历第一个链表,找到an,然后将b1链接到an的后面,时间复杂度是:O(n).若在尾指针表示的单循环链表上实现,则只需改变指针,无需遍历,时间复杂度是:O(1) 现在看算法实现,需要4个主要步骤,都注释了: LinkList Connect(LinkList A,LinkList B){ //假设A,B为非空循环链表的尾指针 LinkList p = A->next;//1.保存A链表的头结点的位置 A->next = B->

数据结构之链表单向操作总结

链表是数据结构的基础内容之一,下面就链表操作中的创建链表.打印链表.求取链表长度.判断链表是否为空.查找结点.插入结点.删除结点.逆转链表.连接链表.链表结点排序等进行总结. 1.创建表示结点的类,因为链表操作中需要比较结点,因此结点需要实现comparable接口. public class Node implements Comparable<Node> { private Object data; private Node next; //构造函数 public Node() { thi

C语言之----面向对象的方法实现链表的操作

1 /* 2 * 详细运行过程: 本程序实现的是对链表的简单的操作,即链表的增 删 改 查 销毁 初始化 3 * 运用面向对象的思想,实现一个类op,op中包括了所有的链表操作方法 4 * 其他的程序调用op类,实现对表链表的操作 5 * 链表包括 6 * 面向对象,简单易学程序更加紧凑,更加健壮,更安全 7 */ 8 #include<string.h> 9 #include<stdlib.h> 10 #include<stdio.h> 11 12 #define o

数据结构之 线性表---单链表操作A (删除链表中的指定元素)

数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除.分别输出建立的初始单链表和完成删除后的单链表. 输入 第一行输入数据个数n: 第二行依次输入n个整数: 第三行输入欲删除数据m. 输出 第一行输出原始单链表的长度: 第二行依次输出原始单链表的数据: 第三行输出完成删除后的单链表长度: 第四行依次输出完成删除后的

数据结构c语言版串的操作

#include<stdio.h> #include<malloc.h> #include<string.h> //定义字符串的结构体 typedef struct { char *str;//字符串 int maxLength;//最大可以存放字符的长度 int length;//目前的字符长度 }DString; //1.初始化操作 //初始化操作用来建立和存储串的动态数组空间以及给相关的数据域赋值 void Initiate(DString *s,int max,