单链表的23个功能
- 前言
- 一. 引用库
- 二. 定义常数啥的
- 三. main 函数
- 三. 23个功能
-
- 1.初始化线性表,即置单链表的表头指针为空
- 2.创建线性表,此函数输入负数终止读取数据
- 3.打印链表,链表的遍历
- 4.清除线性表L中的所有元素,即释放单链表L中所有的结点,使之成为一个空表
- 5.返回单链表的长度
- 6.检查单链表是否为空,若为空则返回1,否则返回0
- 7.返回单链表中第pos个结点中的元素,若pos超出范围,则停止程序运行
- 8.从单链表中查找具有给定值x的第一个元素,若查找成功则返回该结点data域的存储地址,否则返回NULL,并查找多个元素的值
- 9.把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0
- 10.向单链表的表头插入一个元素
- 11.向单链表的末尾添加一个元素
- 12.向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0
- 13.向有序单链表中插入元素x结点,使得插入后仍然有序
- 14.从单链表中删除表头结点,并把该结点的值返回,若删除失败则停止程序运行
- 15.从单链表中删除表尾结点并返回它的值,若删除失败则停止程序运行
- 16.从单链表中删除第pos个结点并返回它的值,若删除失败则停止程序运行 (表头,表中,表尾)
- 17.从单链表中删除值为x的第一个结点,若删除成功则返回1,否则返回0
- 18.交换2个元素的位置
- 19.将线性表进行排序 (3种方法)
- 20.逆转一个链表
- 21.两个非空链表合为一个链表
- 22.两个有序链表合为一个有序链表
- 23.复制链表
前言
参考大佬链接:C语言 数据结构链表的实例(十九种操作).
一. 引用库
//#include "stdafx.h" 是生成预编译头文件!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<algorithm>//用sort要包含这个头文件
二. 定义常数啥的
using namespace std;//使用sort得加上
typedef int elemType ;//就是为int、char等等的数据类型,起了一个别名
三. main 函数
main 函数写在一起实现了;通过注释选择实现功能
int main()
{
Node *pList=NULL;
int length = 0;
elemType posElem;
initList(&pList); //链表初始化.取址运算符: & 用来取得其操作数的地址。如果操作数 x 的类型为 T,则表达式 &x 的类型是 T 类型指针(指向 T 的指针)。
printList(pList); //遍历链表,打印链表
pList=creatList(pList); //创建链表
printList(pList);
// sizeList(pList); //链表的长度
int num = sizeList(pList);
// printList(pList);
// isEmptyList(pList); //判断链表是否为空链表
//
// posElem = getElement(pList); //获取第三个元素,如果元素不足3个,则返回0
// printList(pList);
// getElemAddr(pList); //获得元素X的地址
//
// modifyElem(pList,4,1); //将链表中位置4上的元素修改为1
// printList(pList);
//
// insertHeadList(&pList); //表头插入元素x
// insertHeadList(Node *pNode);
// printList(pList);
// insertLastList(&pList); //表尾插入元素x
// printList(pList);
// insertPosList(&pList,num); //指定位置插入元素
// printList(pList);
// SortList1(&pList,num); //& :一种是取地址符,是单目运算符;另一种是位运算符,表示“按位与”,是双目运算符。
// printList(pList);
// SortList2(pList,num);
// printList(pList);
// Insertsort(&pList,num);
// printList(pList);
// deleteHeadList(&pList);
// printList(pList);
// deleteLastList(&pList);
// printList(pList);
// deletePoslist(&pList,num);
// printList(pList);
// deleteitemList(&pList,num);
// printList(pList);
// exchange2pos(&pList,num);
// printList(pList);
// SortList3(pList,num);
// printList(pList);
// rollback(pList,num);
// printList(pList);
// add_List(pList,num);
// printList(pList);
Node *p1=NULL;
Node *pList1=NULL;
//创建另一个链表
initList(&p1);
printList(p1);
pList1=creatList(p1);
int i = sizeList(pList);
Node * p2 = mergeTwoLists(pList,pList1,num,i);
printList(p2);
//copy_List(&pList,num);
clearList(pList); //清空链表
system("pause");
}
三. 23个功能
1.初始化线性表,即置单链表的表头指针为空
相关函数
//定义单链表
typedef struct Node{
/* 定义单链表结点类型 */
elemType element;
Node *next;
}Node;
lnode 是节点指针,用于单链表的链接操作(指向下一个节点),linklist是定义的结构体的名称,
// 用于表示整个链表(其中包含两个方面,数据域和指针域,当链表中只有一个节点时,
// 指的就是整个节点)
typedef struct LNode
{
ElemTYpe data;
struct LNOde *next;
// }LINklist,*Lnode;
这里的 *lnode 和 linklist 是一样的都指向链表,只不过一个名字,一个用指针表示而已
/* 1.初始化线性表,即置单链表的表头指针为空 */
void initList(Node **pNode)
{
*pNode = NULL;
printf("initList函数执行,初始化成功\n");
}
2.创建线性表,此函数输入负数终止读取数据
相关函数
/* 2.创建线性表,此函数输入负数终止读取数据*/
Node *creatList(Node *pHead)
{
Node *p1; //创建链表并赋值的时候用,刚开始指向表头
Node *p2; //非空表的表尾
p1=p2=(Node *)malloc(sizeof(Node)); //申请新节点
if(p1 == NULL || p2 ==NULL)
{
printf("内存分配失败\n");
exit(0);
}
memset(p1,0,sizeof(Node));
//memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法
printf("请输入链表各值(输入负数终止读取数据):\n");
scanf("%d",&p1->element); //输入新节点
p1->next = NULL; //新节点的指针置为空
while(p1->element > 0) //输入的值大于0则继续,直到输入的值为负
{
if(pHead == NULL) //空表,接入表头
{
pHead = p1;
}
else
{
p2->next = p1; //非空表,接入表尾
}
p2 = p1;
p1=(Node *)malloc(sizeof(Node)); //再重申请一个节点
if(p1 == NULL || p2 ==NULL)
{
printf("内存分配失败\n");
exit(0);
}
memset(p1,0,sizeof(Node));
scanf("%d",&p1->element);
p1->next = NULL;
}
printf("creatList函数执行,链表创建成功\n");
return pHead; //返回链表的头指针
}
3.打印链表,链表的遍历
相关函数
/* 3.打印链表,链表的遍历*/
void printList(Node *pHead)
{
if(pHead == NULL) //链表为空
{
printf("\nPrintList函数执行,链表为空\n");
}
else
{
printf("当前链表为:");
while(pHead != NULL)
{
printf("%d ",pHead->element);
pHead = pHead->next;
}
printf("\n");
}
}
4.清除线性表L中的所有元素,即释放单链表L中所有的结点,使之成为一个空表
相关函数
/* 4.清除线性表L中的所有元素,即释放单链表L中所有的结点,使之成为一个空表 */
void clearList(Node *pHead)
{
Node *pNext; //定义一个与pHead相邻节点
if(pHead == NULL)
{
printf("\nclearList函数执行,链表为空\n");
return;
}
while(pHead != NULL)
{
pNext = pHead->next;//保存下一结点的指针
// printf("%d* ",pHead->element);
free(pHead);
pHead = pNext; //表头下移
// pNext = pHead;
// pHead = pHead->next;
// printf("%d* ",pNext->element );
// free(pNext);
}
printf("\nclearList函数执行,链表已经清除\n");
}
清空:剩头节点;
销毁:啥都没了.
5.返回单链表的长度
相关函数
/* 5.返回单链表的长度 */
int sizeList(Node *pHead)
{
int size = 0;
while(pHead != NULL)
{
size++; //遍历链表size大小比链表的实际长度小1
pHead = pHead->next;
}
printf("sizeList函数执行,链表长度 %d \n",size);
return size; //链表的实际长度
}
6.检查单链表是否为空,若为空则返回1,否则返回0
相关函数
/* 6.检查单链表是否为空,若为空则返回1,否则返回0 */
int isEmptyList(Node *pHead)
{
if(pHead == NULL)
{
printf("\nisEmptyList函数执行,链表为空\n");
return 1;
}
printf("\nisEmptyList函数执行,链表非空\n");
return 0;
}
7.返回单链表中第pos个结点中的元素,若pos超出范围,则停止程序运行
相关函数
/* 7.返回单链表中第pos个结点中的元素,若pos超出范围,则停止程序运行 */
elemType getElement(Node *pHead)
{
int i=<