单链表
typedef int Elemtype;
typedef struct LinkNode{
Elemtype data;
struct LinkNode * next;
}LinkNode,*LinkList;
头指针和头节点
skip
头插法
#include <iostream>
typedef int Elemtype;
typedef struct LinkNode {
Elemtype data;
struct LinkNode* next;
} LinkNode, *LinkList;
void insert(LinkList L, int enterList[], int listLength) {
int i = 0;
while (i < listLength) {
LinkNode* pNode = (LinkNode*)malloc(sizeof(LinkNode));
pNode->data = enterList[i];
// 插入一个数据结点时,将插入节点的指针改成插入位置的后继
pNode->next = L->next;
L->next = pNode;
i++;
}
}
LinkNode* create(int enterList[], int listLength) {
LinkNode* L = NULL;
L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL; // 创建了一个只带头节点的空链表
insert(L, enterList, listLength);
return L; // 返回头结点的地址,等于返回了整个链表的信息
}
int main() {
int enterList[] = {1, 2, 3, 4, 5};
int listLength = sizeof(enterList) / sizeof(enterList[0]);
LinkNode* L = create(enterList, listLength);
// 遍历链表并输出元素
std::cout << "链表元素: ";
LinkNode* current = L->next; // 跳过头节点
while (current != NULL) {
std::cout << current->data << " ";
current = current->next;
}
// 释放链表的内存
while (current) {
LinkNode* temp = current;
current = current->next;
free(temp);
}
free(L);
return 0;
}
尾插法
#include <stdio.h>
#include <stdlib.h>
typedef int Elemtype;
typedef struct LinkNode {
Elemtype data;
struct LinkNode* next;
} LinkNode, *LinkList;
void create(LinkList &L, int enterList[], int length) {
L = (LinkNode *) malloc(sizeof(LinkNode));
L->next = NULL;
LinkNode *pTail = L;
int i = 0;
while (i < length) {
LinkNode *pNode = (LinkNode *) malloc(sizeof(LinkNode));
pNode->data = enterList[i];
pNode->next = pTail->next; // 先将插入结点指针域修改为pTail的后继
pTail->next = pNode; // 尾结点pTail的后继更新为pNode
pTail = pNode; // 此时pnode为最后一个结点,更新ptail指针,使其指向新的尾结点
++i;
}
}
void printLinkList(LinkList L) {
LinkNode *pNode = L->next;
while (NULL != pNode) {
printf("%d ", pNode->data);
pNode = pNode->next;
}
printf("\n");
}
int main() {
LinkList myList;
int data[] = {1, 2, 3, 4, 5};
int length = sizeof(data) / sizeof(data[0]);
create(myList, data, length);
printf("Created Linked List: ");
printLinkList(myList);
return 0;
}
单链表递归
#include <stdio.h>
#include <stdlib.h>
#include <limits.h> // 为了使用INT_MIN常量
typedef int Elemtype;
typedef struct LinkNode {
Elemtype data;
struct LinkNode* next;
} LinkNode, *LinkList;
// getMax函数的定义
int getMax(LinkNode *pCur) {
if (NULL == pCur) {
return INT_MIN; // 使用INT_MIN来表示负无穷
}
int temp = getMax(pCur->next);
return temp > pCur->data ? temp : pCur->data;
}
// getNodesNum函数的定义
int getNodesNum(LinkNode *pCur) {
if (NULL == pCur) {
return 0;
}
return 1 + getNodesNum(pCur->next);
}
// getAvg函数的定义,接受节点数量作为参数
double getAvg(LinkNode *pCur, int num) {
if (NULL == pCur || num == 0) {
return 0.0; // 如果链表为空或者节点数量为0,返回0.0
}
return (double)pCur->data / num + getAvg(pCur->next, num);
}
// 创建链表函数
LinkList createLinkedList(int data[], int length) {
LinkList myList = (LinkNode *)malloc(sizeof(LinkNode));
myList->next = NULL;
LinkNode *pTail = myList;
for (int i = 0; i < length; ++i) {
LinkNode *pNode = (LinkNode *)malloc(sizeof(LinkNode));
pNode->data = data[i];
pNode->next = pTail->next;
pTail->next = pNode;
pTail = pNode;
}
return myList;
}
// 释放链表内存
void freeLinkedList(LinkList myList) {
LinkNode *pNode = myList;
while (pNode != NULL) {
LinkNode *temp = pNode;
pNode = pNode->next;
free(temp);
}
}
int main() {
int data[] = {1, 2, 3, 4, 5};
int length = sizeof(data) / sizeof(data[0]);
// 创建链表
LinkList myList = createLinkedList(data, length);
// 计算链表中的最大值
int max = getMax(myList->next);
printf("链表中的最大值: %d\n", max);
// 计算链表中的节点数量
int nodeCount = getNodesNum(myList->next);
printf("链表中的节点数量: %d\n", nodeCount);
// 计算链表中节点数据的平均值
double avg = getAvg(myList->next, nodeCount);
printf("链表中节点数据的平均值: %lf\n", avg);
// 释放链表内存
freeLinkedList(myList);
return 0;
}
返回第i个元素
【test】
typedef int Elemtype;
typedef struct LinkNode {
Elemtype data;
struct LinkNode* next;
} LinkNode, *LinkList;
void getIth(LinkList L,int ith,Elemtype e){
int count = 0;
LinkNode * pCur = L->next;//从第一个数据节点开始访问
while(pCur !=NULL){
count+=1;
if(count==ith){
return pCur;
}
pCur=pCur->next;
}
return NULL;
}
int main(){
int enterList[] = {1,2,3,4,5};
int listLength = 5;
LinkList L =create(enterList,listLength);
LinkNode*pNode = getIth(L,3);
if(pNode!=NULL){
printf("%d\n",pNode->data);
}
print(L);
}
第i个结点前插入
typedef int Elemtype;
typedef struct LinkNode {
Elemtype data;
struct LinkNode* next;
} LinkNode, *LinkList;
void insertIth(LinkList L,int ith,Elemtype e){
int count = 0;
LinkNode * preCur = L;//第一个数据节点的前驱
LinkNode * pCur = L->next;//从第一个数据节点开始访问
while(pCur !=NULL){
count+=1;
if(count==ith){
LinkNode * pNode = (LinkNode *)malloc(sizeof(LinkNode));
pNode->data = e;
pNode->next = preCur->next;
preCur->next = pNode;
break;
}
preCur= pCur;
pCur = pCur->next;
}
return NULL;
}
int main(){
int enterList[] = {1,2,3,4,5};
int listLength = 5;
LinkList L =create(enterList,listLength);
print(L);
insertIth(L,3,8);
print(L);
}
查找倒数第m个节点
typedef int Elemtype;
typedef struct LinkNode {
Elemtype data;
struct LinkNode* next;
} LinkNode, *LinkList;
void getData(int m,LinkList L){
//访问链表第m+1个节点
LinkList pCur = L->next;
int count = 0;
while(pCur != NULL){
++count;
if(count==m+1){
break;
}
pCur= pCur->next;
}
//两指针同时移动查找相对位置的节点
LinkNode* pNode = L->next;
while(pCur!=NULL){
pNode= pNode->next;
pCur= pCur->next;
}
printf("%d",pNode->data);
}
查找第j+len个结点
LinkNode* getPre(int ith,LinkList L){
LinkNode* preCur = L;
LinkNode pCur = L->next;
int count = 0;
while(pCur!=NULL){
++count;
if(count==ith){
return preCur;
}
preCur= pCur;
pCur=pCur->next;
}
}
void oper(LinkList &La,LinkList &Lb,int j,int len){
LinkNode* pLa = (LinkNode*)malloc(sizeof(LinkNode));
pLa->next = La;
La = pLa;
LinkNode* pLb = (LinkNode*)malloc(sizeof(LinkNode));
pLb->next = Lb;
Lb = pLb;
LinkNode* preJthLa = getPre(j,La);
LinkNode* preJLenLa = getPre(j+len-1,La);
LinkNode* preJthLb = getPre(j,Lb);
LinkNode* pNode = preJLenLa->next->next;
preJLenLa->next->next= preJLenLb->next;
preJthLb->next = preJthLa ->next;
preJLenLa->next= pNode;
print(La);
print(Lb);
}
前一半,后一半
int isSym(LinkList L,int n){
LinkNode* pCur = L->next;
int count= 0;
while(pCur!=NULL){
++count;
if(n/2==count){
break;
}
pCur = pcur->next;
}
LinkNode* pLast= NULL;
if(n%2!=0){
pLast =pCur->next->next;
}
else{
pLast =pCur->next;
}
pCur=L->next;
while(pLast!=NULL){
if(pCur->data != pLast->data){
return 0;
}
pCur=pCur->next;
pLast= pLast->next;
}
return 1;
}