c语言链表的复制,c 语言 复杂链表的复制

//头文件

#pragma once

typedef int DataType;

typedef struct ComplexNode

{

DataType _data;// 数据

struct ComplexNode* _next;// 指向下一个节点的指针

struct ComplexNode* _random;// 指向随机节点

}ComplexNode,*pComplexNode;

void BuyNode(pComplexNode& pNode,DataType x);

void PushBack(pComplexNode& pHead,DataType x);

void CopyCplexList(pComplexNode pHead,pComplexNode& NewpHead);

pComplexNode Find(pComplexNode pHead, DataType Data);

void PrintLinkList(pComplexNode pHead);

//函数文件

#include

#include"ComplexList.h"

#include

#include

//创建节点

void BuyNode(pComplexNode& pNode, DataType x)

{

pNode = (pComplexNode)malloc(sizeof(ComplexNode));

pNode->_data = x;

pNode->_next = NULL;

pNode->_random = NULL;

}

//头插

void PushBack(pComplexNode& pHead,DataType x)

{

pComplexNode tmp = pHead;

if (pHead == NULL)

{

BuyNode(pHead, x);

return;

}

while (tmp->_next != NULL)

{

tmp = tmp->_next;

}

BuyNode(tmp->_next, x);

}

//复杂链表复制

void CopyCplexList(pComplexNode pHead, pComplexNode& NewpHead)

{

pComplexNode tmp = pHead;

pComplexNode head = pHead;

if (pHead == NULL)

return;

while (head != NULL)

{

tmp = head->_next;

BuyNode(NewpHead, head->_data);

head->_next = NewpHead;

NewpHead->_next = tmp;

head = tmp;

}

head = pHead;

while (head != NULL)

{

tmp = head->_next;

if (head->_random == NULL)

tmp->_random == NULL;

else

tmp->_random = head->_random->_next;

head = head->_next->_next;

}

head = pHead;

NewpHead = head->_next;

while (head!=NULL)

{

tmp = head->_next;

head->_next = tmp->_next;

head = tmp->_next;

if (head == NULL)

return;

tmp->_next = head->_next;

}

}

//查找

pComplexNode Find(pComplexNode pHead, DataType Data)

{

pComplexNode tmp = pHead;

assert(pHead);

while (tmp)

{

if (tmp->_data == Data)

return tmp;

tmp = tmp->_next;

}

return NULL;

}

//输出

void PrintLinkList(pComplexNode pHead)

{

pComplexNode tmp = pHead;

if (pHead == NULL)

{

printf("链表为空!\n");

}

while (tmp)

{

printf("%d ", tmp->_data);

tmp = tmp->_next;

}

printf("\n");

}

//测试用例 主函数

#include

#include"ComplexList.h"

void test1()

{

pComplexNode pHead=NULL,NewpHead=NULL;

PushBack(pHead, 1);

PushBack(pHead, 2);

PushBack(pHead, 3);

PushBack(pHead, 4);

PrintLinkList( pHead);

Find(pHead, 1)->_random = Find(pHead, 3);

Find(pHead, 2)->_random = Find(pHead, 4);

Find(pHead, 3)->_random = Find(pHead, 2);

Find(pHead, 4)->_random = Find(pHead, 1);

CopyCplexList(pHead, NewpHead);

PrintLinkList(NewpHead);

}

int main()

{

test1();

return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的影院管理系统的C语言代码,其中包含链表的操作: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME_LEN 20 // 定义影片结构体 typedef struct film { int id; // 影片编号 char name[MAX_NAME_LEN]; // 影片名称 int duration; // 影片时长 float price; // 影片价格 struct film *next; // 指向下一个影片的指针 } Film; // 初始化链表 Film *initList() { Film *head = (Film *)malloc(sizeof(Film)); head->next = NULL; return head; } // 插入影片到链表尾部 void addFilm(Film *head, int id, char *name, int duration, float price) { Film *newFilm = (Film *)malloc(sizeof(Film)); newFilm->id = id; strcpy(newFilm->name, name); newFilm->duration = duration; newFilm->price = price; newFilm->next = NULL; Film *p = head; while (p->next != NULL) { p = p->next; } p->next = newFilm; } // 根据影片编号删除影片 void deleteFilm(Film *head, int id) { Film *p = head->next; Film *prev = head; while (p != NULL) { if (p->id == id) { prev->next = p->next; free(p); printf("影片删除成功!\n"); return; } prev = p; p = p->next; } printf("未找到影片编号为%d的影片!\n", id); } // 根据影片编号查找影片 Film *findFilm(Film *head, int id) { Film *p = head->next; while (p != NULL) { if (p->id == id) { return p; } p = p->next; } return NULL; } // 显示所有影片信息 void showFilms(Film *head) { printf("影片编号\t影片名称\t影片时长\t影片价格\n"); Film *p = head->next; while (p != NULL) { printf("%d\t\t%s\t\t%d\t\t%.2f\n", p->id, p->name, p->duration, p->price); p = p->next; } } int main() { Film *head = initList(); // 初始化链表 // 添加几个影片 addFilm(head, 1, "复仇者联盟", 150, 30.0); addFilm(head, 2, "流浪地球", 125, 25.0); addFilm(head, 3, "哪吒之魔童降世", 110, 20.0); // 显示所有影片 showFilms(head); // 根据影片编号删除影片 deleteFilm(head, 2); // 显示所有影片 showFilms(head); // 查找影片并修改价格 Film *film = findFilm(head, 1); if (film != NULL) { film->price = 35.0; printf("影片价格修改成功!\n"); } else { printf("未找到影片编号为%d的影片!\n", 1); } // 显示所有影片 showFilms(head); return 0; } ``` 在上面的代码中,我们定义了一个`Film`结构体表示影片,其中包含了影片的编号、名称、时长和价格,以及一个指向下一个影片的指针。我们使用`initList()`函数初始化一个空链表,使用`addFilm()`函数将影片插入到链表尾部,使用`deleteFilm()`函数根据影片编号删除影片,使用`findFilm()`函数根据影片编号查找影片,使用`showFilms()`函数显示所有影片信息。 需要注意的是,在使用`strcpy()`函数复制字符串时,需要确保目标字符串的长度足够大,以避免缓冲区溢出的问题。我们在代码中定义了`MAX_NAME_LEN`常量表示影片名称的最大长度为20个字符。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值