C/C++-Datenstruktur --- Sequenztabelle --- verkettete Speicherstruktur 2 (ohne Kopfknoten)

 Persönliche Homepage: Es gibt noch Unbekanntes, das darauf wartet, erforscht zu werden_Datenstruktur, kleine Projekte, Luogu-Fragenbürsten-CSDN-Blog

Themenspalte: Datenstruktur_Es gibt noch unbekannte Blogs, die darauf warten, erkundet zu werden – CSDN-Blog 

Link zum vorherigen Artikel: Datenstruktur --- Sequenztabelle --- Kettenspeicherstruktur 1 (ohne Kopfknoten)_Es gibt noch unbekannte Blogs, die darauf warten, erkundet zu werden – CSDN-Blog

Inhaltsverzeichnis

I. Einleitung

2. Grundlegende Operationen verknüpfter Listen 

1. Daten hinzufügen (Knoten hinzufügen)

1) Ideen

2) Code-Präsentation

2. Knoten löschen 

1) Ideen

 2) Code-Implementierung

3. Knotendaten ändern 

1) Ideen

2) Code-Implementierung 

4. Daten finden 

1) Ideen

 2) Code-Implementierung

3. Zusammenfassung


I. Einleitung

        Gemäß der Erklärung im vorherigen Artikel müssen Sie in der Lage sein, die verknüpfte Liste selbst zu erstellen und zu initialisieren. Bei verknüpften Listen können diese Vorgänge jedoch einige Funktionen noch nicht ausführen und reichen nicht aus, um sie auf einige Szenarien anzuwenden. Als nächstes müssen wir Vorgänge wie das Hinzufügen, Löschen, Ändern und Überprüfen der verknüpften Liste implementieren, um die Verwendung der verknüpften Liste für uns komfortabler zu gestalten. Die in diesen beiden Fällen besprochene verknüpfte Liste ist die grundlegendste einfach verknüpfte Liste. Als nächstes gibt es doppelt verknüpfte Listen, zirkulär verknüpfte Listen usw. Sie müssen eine solide Grundlage schaffen, bevor Sie diese lernen.

        Erklären Sie eine Operation und fragen Sie: Warum sollten wir Platz für Knoten zuweisen und wann sollten wir Platz zuweisen? (Das ist etwas, was ich erst kürzlich herausgefunden habe. Wenn ich es falsch verstehe, weisen Sie es bitte darauf hin, dann können wir gemeinsam Fortschritte machen.) Antwort: Zeiger belegen nur 4/8 Bytes im Speicher (bezogen auf Computer). Zeiger können nur Adressen speichern , also Zeiger Das Datenfeld und das Zeigerfeld des Knotens können nicht darin gespeichert werden. Daher muss Platz zum Speichern von Daten im Datenfeld und Zeigerfeld geschaffen werden.

2. Grundlegende Operationen verknüpfter Listen 

1. Daten hinzufügen (Knoten hinzufügen)

1) Ideen

Denken wir wie immer zunächst darüber nach, wie man Knoten hinzufügt.

Zuerst muss es eine verknüpfte Liste geben (nur der Kopfzeiger reicht aus), und dann muss ein einzufügender Knoten p und seine spezifische Position vorhanden sein.

Wenn Position P gefunden wird, müssen Sie auch überlegen, ob Sie sie vor oder hinter Position P einfügen möchten, und schließlich den Einfügevorgang starten. Wie füge ich es ein? Kann dieser Vorgang normal ausgeführt werden, wenn der Kopf leer ist?

        Fügen Sie den p-Knoten wie oben gezeigt in die verknüpfte Liste ein. Es ist nichts anderes als das, was im Bild oben gezeichnet ist. Schneiden Sie die schwarze Linie von Seriennummer 3 ab und verbinden Sie dann die beiden blauen Linien von Seriennummer 1 und Seriennummer 2 . (Ist das der Fall, wenn der Kopf leer ist ? Gilt das auch? Ich werde es später überprüfen, wenn ich den Code schreibe. ) Jetzt gibt es noch eine andere Frage. Soll ich zuerst die Leitung mit der Seriennummer 1 oder den Draht mit der Seriennummer 2 verbinden?  Wenn Sie dann zuerst die Leitung mit der Seriennummer 1 anschließen, müssen Sie das schwarze Kabel mit der Seriennummer 3 trennen und dann das Kabel mit der Seriennummer 1 anschließen. Wenn Sie das Kabel mit der Seriennummer 2 anschließen möchten, stellen Sie fest, dass dies nicht möglich ist Stellen Sie eine Verbindung her, da der Knoten, auf den die vorherige Seriennummer 3 verweist, nicht gefunden werden kann.

        Schließen Sie schließlich gemäß der Schlussfolgerung zuerst die Seriennummer 2 und dann die Seriennummer 1 an.

2) Code-Präsentation

List ListAdd(List head,int X,Position P)
{
	//前插
	List r = head,q;
	q = (List)malloc(sizeof(struct LNode));
	q->next = NULL;
	q->data = X;
	if (r == NULL)
	{
		r = q;
		return head;
	}
	while (r!=NULL)
	{
		if (r->next == P)
		{
			q->next = P;
			r->next = q;
			return head;
		}
		r = r->next;
	}
	return NULL;
}

        Wenn der Kopf leer ist, hat dies keine Auswirkung auf die oben genannten Schritte. Um jedoch im obigen Code die einzufügende Position zu finden, müssen Sie den vorherigen Knoten der einzufügenden Position finden. Beim Durchlaufen müssen Sie das Zeigerfeld verwenden. Wenn head leer ist, wird head->next verwendet außerhalb der Grenzen sein, daher müssen Sie prüfen, ob der Kopf vorhanden ist. Es bleibt keine Zeit, darüber zu diskutieren. 

        Was oben geschrieben wurde, ist das Einfügen von Daten vor den angegebenen Daten. Wie fügt man sie also später ein? Antwort: Post-Insert kann die Daten des eingefügten Knotens mit den Daten des Knotens an einem bestimmten Ort basierend auf der Vorwärtseinfügung austauschen. Entspricht dies der Durchführung eines Post-Insert-Vorgangs?

2. Knoten löschen 

1) Ideen

        Das Löschen eines Knotens erfordert auch einen bestimmten Löschort. Solange das Zeigerfeld des vorherigen zu löschenden Knotens auf den nächsten zu löschenden Knoten zeigt, ist dies gleichbedeutend mit einem direkten Springen über den zu löschenden Knoten? Das Letzte, was zu beachten ist ist Verwenden Sie die Funktion free, um den Speicherplatz des zu löschenden Knotens freizugeben.

 2) Code-Implementierung

List ListDelete(List head, Position P)
{
	List r = head;
	if (r == NULL)
	{
		printf("链表为空,无需删除数据\n");
		return NULL;
	}
	while (r != NULL)
	{
		if (r->next == P)
		{
			if (P->next == NULL)//判断是否P为链表的最后一个
			{
				r->next = NULL;
			}
			else
			{
				r->next = P->next;
			}
			free(P);//释放P的空间
			return head;
		}
        r = r->next;
	}
	printf("未找到\n");
	return NULL;
}

3. Knotendaten ändern 

1) Ideen

Das Wichtigste für die Knotendaten ist, den Knoten zu finden und dann die Daten im Knoten zu finden.

2) Code-Implementierung 

List ListChange(List head, Position P)
{
	if (head == NULL)
	{
		printf("此链表为空\n");
		return NULL;
	}
	else
	{
		List r = head;
		while (r != NULL)
		{
			if (r == P)
			{
				int data;
				scanf("%d", &data);
				P->data = data;
				return head;
			}
			r = r->next;
		}
		printf("未找到\n");
		return NULL;
	}
}

Keine dieser Funktionen ist zu schwierig, Sie müssen lediglich jede Situation umfassend betrachten.

4. Daten finden 

1) Ideen

Durchlaufen Sie die Daten der Knoten, vergleichen Sie sie nacheinander mit den gesuchten Daten und geben Sie dann die Ergebnisse aus.

 2) Code-Implementierung

List ListSearch(List head, int data)
{
	List r = head;
	if (r == NULL)
	{
		printf("此为空链表,未找到\n");
		return NULL;
	}
	else
	{
		while (r->data == data)
		{
			printf("找到了\n");
			return r;
		}
		printf("未找到\n");
		return NULL;
	}
}

3. Zusammenfassung

Die Gesamtschwierigkeit dieser Codeidee ist nicht hoch. Die Hauptsache ist, dass sie vorsichtig ist und alle Situationen berücksichtigt. Abschließend vielen Dank für Ihre Unterstützung!

Supongo que te gusta

Origin blog.csdn.net/qq_73435980/article/details/132943009
Recomendado
Clasificación