في ج البرمجة ، هناك عدة طرق لنسخ قائمة (صفيف) إلى قائمة أخرى. واحدة من أبسط الطرق وأكثرها فعالية هي استخدام وظيفة ميمكبي من مكتبة سي القياسية.
ميمكبي هي وظيفة تقوم بنسخ بيانات كتلة الذاكرة من مكان إلى آخر. يستغرق ثلاث حجج: مؤشر إلى المصفوفة المصدر ، ومؤشر إلى المصفوفة الهدف ، وعدد البايتات المراد نسخها.
لنسخ قائمة ، تحتاج أولا إلى تحديد قائمتين - قائمة المصدر المراد نسخها وقائمة الهدف المراد نسخها إليها. يمكنك بعد ذلك استخدام وظيفة ميمكبي لنسخ العناصر من قائمة المصدر إلى قائمة الهدف.
من المهم ملاحظة أنه عند استخدام وظيفة ميمكبي ، يجب تحديد حجم البيانات المراد نسخها بالبايت. للقيام بذلك ، اضرب حجم عنصر القائمة في عدد العناصر التي تحتاج إلى نسخ. على سبيل المثال ، إذا كان حجم عنصر القائمة 4 بايت وكان عدد العناصر 10 ، فيجب عليك تحديد الحجم بالبايت: 4 * 10 = 40.
- نسخ قائمة في ج
- الخطوة 1: إنشاء قائمة
- الخطوة 2: انسخ القائمة
- الخطوة 3: مثال الاستخدام
- شفرة المصدر الكاملة:
- ما هي القائمة في ج?
- كيف يمكنني نسخ قائمة في ج?
- الطريقة 1: باستخدام حلقة
- الطريقة 2: استخدام وظيفة ميمكبي ()
- سؤال وجواب
نسخ قائمة في ج
في لغة البرمجة سي ، يمكن نسخ قائمة باستخدام المؤشرات والذاكرة الديناميكية. يوجد أدناه نموذج رمز يوضح هذه العملية.
الخطوة 1: إنشاء قائمة
قبل نسخ القائمة ، تحتاج إلى إنشائها. في هذا المثال ، سنقوم بإنشاء قائمة بسيطة مرتبطة منفردة بقيم عدد صحيح.
# تشمل
# تشمل
// هيكل عنصر القائمة
عقدة البنية {
بيانات كثافة العمليات;
عقدة البنية * التالي;
};
كثافة العمليات الرئيسية () {
// إنشاء ثلاثة عناصر قائمة
عقدة البنية * الرأس = فارغ;
عقدة البنية * الثانية = فارغة;
عقدة البنية * الثالثة = فارغة;
// تخصيص الذاكرة لثلاث عقد
الرأس = (عقدة البنية*) مالوك (حجم (عقدة البنية));
الثاني = (عقدة البنية*) مالوك (حجم (عقدة البنية));
الثالث = (عقدة البنية*) مالوك (حجم (عقدة البنية));
// Присвоение значения и установка указателей
رئيس - > البيانات = 1;
رئيس - > التالي = الثانية;
ثانيا - > البيانات = 2;
الثاني- > التالي = الثالث;
الثالث - > البيانات = 3;
الثالث- > التالي = لاغية;
العودة 0;
}
Шаг 2: Копирование списка
لنسخ القائمة ، تحتاج إلى إنشاء قائمة جديدة ونسخ القيم من القائمة الأصلية إلى القائمة الجديدة.
// وظيفة لنسخ القائمة
عقدة البنية * قائمة النسخ (عقدة البنية* الرأس) {
// التحقق من القائمة
إذا (رئيس== لاغية) {
العودة فارغة;
}
// إنشاء قائمة جديدة
عقدة البنية * نيوهيد = لاغية;
عقدة الهيكل * الذيل = لاغية;
// التكرار من خلال عناصر القائمة الأصلية
بينما (الرأس != لاغية) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = head->data;
newNode->next = NULL;
// Если это первый элемент нового списка
if (newHead == NULL) {
newHead = newNode;
tail = newNode;
} else {
// Добавление элемента в конец нового списка
tail->next = newNode;
tail = newNode;
}
head = head->next;
}
return newHead;
}
Шаг 3: Пример использования
لاستخدام وظيفة نسخ القائمة ، أضف التعليمة البرمجية التالية بعد إنشاء القائمة:
// نسخ القائمة
عقدة البنية * نيوهيد = كوبيليست(رئيس);
// إخراج قائمة جديدة
عقدة البنية * العقدة الحالية = رأس جديد;
بينما (العقدة الحالية != لاغية) {
برينتف ("٪د " ، كرينتنود- > البيانات);
العقدة الحالية = العقدة الحالية- > التالي;
}
برينتف("
");
سيقوم هذا الرمز بإنشاء قائمة جديدة تحتوي على القيم من القائمة الأصلية وإخراج محتوياتها.
شفرة المصدر الكاملة:
# تشمل
# تشمل
// هيكل عنصر القائمة
عقدة البنية {
بيانات كثافة العمليات;
عقدة البنية * التالي;
};
// وظيفة لنسخ قائمة
عقدة البنية * قائمة النسخ (عقدة البنية* الرأس) {
// التحقق من وجود قائمة
إذا (رئيس== لاغية) {
العودة فارغة;
}
// إنشاء قائمة جديدة
عقدة البنية * نيوهيد = لاغية;
عقدة الهيكل * الذيل = لاغية;
// Перебор элементов оригинального списка
بينما (الرأس != لاغية) {
عقدة البنية * نيونود = (عقدة البنية*) مالوك (حجم (عقدة البنية));
نيونود - > البيانات = الرأس- > البيانات;
نيونود- > التالي = لاغية;
// Если это первый элемент нового списка
إذا (نيوهيد == لاغية) {
نيوهيد = نيونود;
الذيل = نيونود;
} آخر {
// Добавление элемента в конец нового списка
الذيل- > التالي = نيونود;
الذيل = نيونود;
}
رئيس = رئيس- > التالي;
}
عودة نيوهيد;
}
كثافة العمليات الرئيسية () {
// Создание трех элементов списка
عقدة البنية * الرأس = فارغ;
عقدة البنية * الثانية = فارغة;
عقدة البنية * الثالثة = فارغة;
// Выделение памяти для трех узлов
الرأس = (عقدة البنية*) مالوك (حجم (عقدة البنية));
الثاني = (عقدة البنية*) مالوك (حجم (عقدة البنية));
الثالث = (عقدة البنية*) مالوك (حجم (عقدة البنية));
// Присвоение значения и установка указателей
رئيس - > البيانات = 1;
رئيس - > التالي = الثانية;
ثانيا - > البيانات = 2;
الثاني- > التالي = الثالث;
الثالث - > البيانات = 3;
الثالث- > التالي = لاغية;
// Копирование списка
عقدة البنية * نيوهيد = كوبيليست(رئيس);
// إخراج قائمة جديدة
عقدة البنية * العقدة الحالية = رأس جديد;
بينما (العقدة الحالية != لاغية) {
برينتف ("٪د " ، كرينتنود- > البيانات);
العقدة الحالية = العقدة الحالية- > التالي;
}
برينتف("
");
العودة 0;
}
بعد تنفيذ التعليمات البرمجية ، ستكون النتيجة إخراج محتويات القائمة الجديدة المنسوخة من القائمة الأصلية.
ما هي القائمة في ج?
القائمة في لغة البرمجة سي هي بنية بيانات تسمح لك بتخزين وتنظيم سلسلة من العناصر. وهو يختلف عن المصفوفة في أن حجم القائمة يمكن أن يتغير ديناميكيا أثناء تنفيذ البرنامج.
تتكون القائمة من عقد ، يحتوي كل منها على بعض البيانات ورابط للعقدة التالية. تحتوي العقدة الأخيرة من القائمة على مرجع إلى فارغ ، مما يشير إلى نهايته. تتيح لك هذه الميزة إضافة العناصر الموجودة في منتصف القائمة وإزالتها بشكل فعال.
يمكن توصيل القوائم بلغة سي منفردة أو متصلة بشكل مضاعف. في قائمة مرتبطة منفردة ، تحتوي كل عقدة على رابط للعقدة التالية فقط ، وفي قائمة مرتبطة بشكل مضاعف ، تحتوي كل عقدة على روابط لكل من العقد السابقة والتالية.
تتضمن العمليات التي يمكن إجراؤها باستخدام القوائم إضافة عنصر إلى البداية أو النهاية أو موضع معين من القائمة ، وإزالة عنصر من القائمة ، والبحث عن عنصر في القائمة ، والحصول على عنصر حسب الفهرس ، وحساب عدد العناصر ، و اكثر.
استخدام القوائم في ج يجعل من الممكن إدارة البيانات بشكل فعال ، خاصة في الحالات التي يكون فيها عدد العناصر غير معروف مسبقا أو عندما يتغير حجم القائمة بشكل متكرر.
كيف يمكنني نسخ قائمة في ج?
يمكن أن يكون نسخ قائمة في ج مهمة مفيدة عند العمل مع هياكل البيانات الديناميكية. هناك طرق مختلفة لحل هذه المشكلة ، ولكن إحدى الطرق الأكثر شيوعا هي إنشاء قائمة جديدة ونسخ العناصر من القائمة الأصلية إلى القائمة الجديدة.
Вот пример, который показывает, как скопировать список на языке Си:
#include
#include
// Структура списка
struct Node {
int data;
struct Node* next;
};
// Функция для создания новой ноды
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
if(newNode == NULL) {
printf("Ошибка при выделении памяти.");
exit(0);
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// Функция для копирования списка
عقدة البنية * قائمة النسخ (عقدة البنية* الأصل) {
// Проверка на пустой список
إذا (الأصلي == لاغية) {
العودة فارغة;
}
عقدة البنية * الحالي = الأصلي;
عقدة البنية * نيوليست = كريتينود (الحالي- > البيانات);
عقدة البنية * قائمة جديدةالتيار = قائمة جديدة;
// Проходим по оригинальному списку и копируем элементы
بينما (الحالي- > التالي != لاغية) {
الحالي = الحالي- > التالي;
نيوليستكرنت- > التالي = كريتينود (الحالي- > البيانات);
قائمة جديدةالتيار = قائمة جديدةالتيار- > التالي;
}
عودة قائمة جديدة;
}
كثافة العمليات الرئيسية () {
// Создание оригинального списка
عقدة البنية * الأصل = كريتينود (1);
أوريجيناليست - > التالي = كريتينود (2);
القائمة الأصلية- > التالي- > التالي = كريتينود (3);
// Копирование списка
عقدة البنية * قائمة النسخ = قائمة النسخ (القائمة الأصلية);
// Вывод оригинального списка
برينتف ("::");
عقدة البنية * الحالي = الأصل;
بينما (الحالي != لاغية) {
برينتف ("٪د " ، الحالي- > البيانات);
الحالي = الحالي- > التالي;
}
برينتف("
");
// Вывод скопированного списка
برينتف ("القائمة المنسوخة:");
الحالي = قائمة النسخ;
بينما (الحالي != لاغية) {
برينتف ("٪د " ، الحالي- > البيانات);
الحالي = الحالي- > التالي;
}
برينتف("
");
العودة 0;
}
لنسخ العناصر.
ستكون نتيجة تنفيذ البرنامج هي إخراج القائمة الأصلية والقائمة المنسوخة:
القائمة الأصلية: 1 2 3
القائمة المنسوخة: 1 2 3
الآن لديك مثال من شأنها أن تساعدك على نسخ القائمة في ج. يمكنك استخدام هذا النهج في مشاريعك أو تعديله حسب تقديرك.
الطريقة 1: استخدام حلقة
يمكنك استخدام حلقة لنسخ قائمة إلى أخرى في ج.فيما يلي وصف لطريقة تستخدم حلقة لنسخ قائمة.
بادئ ذي بدء ، دعونا إنشاء اثنين من المصفوفات التي سوف تمثل القائمة ونسختها:
| قائمة الباحث [] | = {1, 2, 3, 4, 5}; |
| نسخة الباحث []; | // إنشاء مصفوفة فارغة للنسخة |
في هذا المثال ، يتم تمثيل قائمة المصدر بواسطة 'قائمة' مصفوفة ، والتي تحتوي على عناصر من 1 إلى 5. لنسخ هذه القائمة إلى مصفوفة 'نسخ ` ، سنقوم بإنشاء مصفوفة` نسخ' فارغة تحتوي على نسخة من القائمة الأصلية.
بعد ذلك ، باستخدام حلقة ، نسخ كل عنصر من 'قائمة' إلى`نسخة':
ل (إنت أنا = 0 ؛ أنا < حجم (قائمة) / حجم (قائمة [0]) ؛ أنا++) {
نسخ [أنا] = قائمة [أنا];
}
تستخدم هذه الحلقة المتغير 'أنا' ، مما يزيد في كل تكرار. عدد التكرارات يساوي حجم القائمة. داخل الحلقة ، يتم تعيين كل عنصر من `قائمة` إلى العنصر المقابل في` نسخة 'باستخدام عامل التعيين'='. وهكذا ، سيتم نسخ كل عنصر من `قائمة` إلى `نسخة`.
بعد تنفيذ الحلقة ، ستحتوي قائمة 'نسخ `على نسخة من`القائمة' الأصلية. للتحقق ، يمكنك عرض عناصر كلتا القائمتين على الشاشة باستخدام حلقة والأمر ' برينتف`:
برينتف ("قائمة المصدر: ");
ل (إنت أنا = 0 ؛ أنا < حجم (قائمة) / حجم (قائمة [0]) ؛ أنا++) {
برينتف ("٪د " ، قائمة [ط]);
}
برينتف("
نسخة من القائمة:");
ل (إنت أنا = 0 ؛ أنا < حجم (نسخة) / حجم (نسخة[0]) ؛ أنا++) {
برينتف ("٪د " ، نسخة [ط]);
}
ستكون نتيجة هذا الرمز الإخراج التالي إلى الشاشة:
- القائمة الأصلية: 1 2 3 4 5
- نسخة من القائمة: 1 2 3 4 5
وهكذا ، وذلك باستخدام حلقة ، يمكنك بسهولة نسخ قائمة واحدة إلى أخرى في اللغة ج.
الطريقة 2: استخدام وظيفة ميمكبي ()
لنسخ قائمة إلى قائمة أخرى في ج ، يمكنك استخدام وظيفة ميمكبي (). تتيح لك هذه الوظيفة نسخ كتلة ذاكرة من موقع إلى آخر.
قبل استخدام وظيفة ممكبي () ، تحتاج إلى توصيل سلسلة ملف الرأس.h.
وبادئ ذي بدء ، سوف نعلن قائمتين أننا سوف نسخ:
# تشمل
# تشمل
كثافة العمليات الرئيسية () {
قائمة كثافة العمليات 1[] = {1, 2, 3, 4, 5};
القائمة الدولية 2 [5];
// نسخ القائمة باستخدام ميمكبي()
ميمكبي(قائمة 2 ، قائمة 1 ، حجم (قائمة 1)) وظيفة;
// إخراج النتيجة
برينتف ("القائمة المنسوخة:");
إلى عن على (كثافة العمليات أنا = 0; أنا < 5; أنا i) {
برينتف ("٪د " ، القائمة 2 [ط]);
}
العودة 0;
}
في هذا المثال ، نعلن قائمتين-القائمة 1 والقائمة 2. بعد ذلك ، باستخدام وظيفة ميمكبي () ، ونحن نسخ محتويات القائمة 1 القائمة إلى القائمة 2 القائمة.
وظيفة ميمكبي () لديها بناء الجملة التالي:
باطل * ميمكبي (باطل * ديست ، كونست باطل *سرك ، سيز_ت ن);
أين:
- ديست هو مؤشر إلى الذاكرة حيث سيتم نسخ المحتويات
- سرك هو مؤشر إلى الذاكرة من حيث المحتويات
- من ن سيتم نسخها-عدد البايتات المراد نسخها
في هذا المثال ، تقوم الدالة ميمكبي() بنسخ محتويات القائمة 1 إلى القائمة 2. يتم تمرير عدد البايتات المراد نسخها في وسيطة حجم (القائمة 1) ، حيث يقوم حجم () بإرجاع حجم المصفوفة بالبايت.
بعد النسخ ، نقوم بإخراج محتويات القائمة 2 للتحقق. نتيجة لتنفيذ البرنامج ، سيتم عرض ما يلي:
القائمة المنسوخة: 1 2 3 4 5
وهكذا ، وذلك باستخدام وظيفة ممكبي () ، يمكنك بسهولة نسخ قائمة إلى قائمة أخرى في اللغة ج.