私はCの新人です。現時点では私にとってロケット科学のようなものなので、もっとよく理解しようとしています。複数のリンクされたリスト
私は、以下のリンクリストの実装があります。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "linked_list.h"
struct Node *head = NULL;
struct Node *current = NULL;
//display the list
void printList() {
struct Node *ptr = head;
printf("\n[ ");
//start from the beginning
while (ptr != NULL) {
printf("(%d,%d) ", ptr->key, ptr->data);
ptr = ptr->next;
}
printf(" ]");
}
//insert link at the first location
void insertFirst(int key, int data) {
//create a link
struct Node *link = (struct Node*) malloc(sizeof(struct Node));
link->key = key;
link->data = data;
//point it to old first Node
link->next = head;
//point first to new first Node
head = link;
}
//delete first item
struct Node* deleteFirst() {
//save reference to first link
struct Node *tempLink = head;
//mark next to first link as first
head = head->next;
//return the deleted link
return tempLink;
}
//is list empty
bool isEmpty() {
return head == NULL;
}
int length() {
int length = 0;
struct Node *current;
for (current = head; current != NULL; current = current->next) {
length++;
}
return length;
}
//find a link with given key
struct Node* find(int key) {
//start from the first link
struct Node* current = head;
//if list is empty
if (head == NULL) {
return NULL;
}
//navigate through list
while (current->key != key) {
//if it is last Node
if (current->next == NULL) {
return NULL;
}
else {
//go to next link
current = current->next;
}
}
//if data found, return the current Link
return current;
}
//delete a link with given key
struct Node* delete(int key) {
//start from the first link
struct Node* current = head;
struct Node* previous = NULL;
//if list is empty
if (head == NULL) {
return NULL;
}
//navigate through list
while (current->key != key) {
//if it is last Node
if (current->next == NULL) {
return NULL;
}
//store reference to current link
previous = current;
//move to next link
current = current->next;
}
//found a match, update the link
if (current == head) {
//change first to point to next link
head = head->next;
}
else {
//bypass the current link
previous->next = current->next;
}
return current;
}
void sort() {
int size = length();
int k = size;
for (int i = 0; i < size - 1; i++, k--) {
struct Node *current = head;
struct Node *next = head->next;
for (int j = 1; j < k; j++) {
if (current->data > next->data) {
int temp_data = current->data;
current->data = next->data;
next->data = temp_data;
int temp_key = current->key;
current->key = next->key;
next->key = temp_key;
}
current = current->next;
next = next->next;
}
}
}
を私が唯一、独自の主な機能には、このコードで1つのリンクリストを作ることができること、しかし実現。
私は別のクラスで使用するためにヘッダーを作成しました(例えば、Javaのように、異なるタイプの複数のリンクリストが必要です)。
#pragma once
typedef struct Node {
int data;
int key;
struct Node *next;
} Node;
void printList();
void insertFirst(int key, int data);
struct Node* deleteFirst();
bool isEmpty();
struct Node* find(int key);
struct Node* delete(int key);
void sort();
しかし、私はそれが複数のリンクされたリストのためにどのくらい正確に動作するかまだよく分かりません。何か案は?
に消費税などの他の機能を残すだけでなく、パラメータとして関数にそれを渡す 'head'変数、各リストのための1つ。そしてそれを関数に渡します。または、リストの構造体(私の助言)を使用して、構造体にリスト関数を渡します(ポインタ)。 –
@Someprogrammerdude可能であれば、いくつかのコードを投稿して、それをよりよく理解できますか?ありがとう – Denki
これは、グローバルを使用しない理由の非常に良い例です。 – klutt