C言語構造体問題2


質問です。


給与処理


(1)作成関数:2つの一方向チェーンテーブルがあり、ヘッダポインタはそれぞれlist 1、list 2であり、チェーンテーブルの各ノードには従業員番号(従業員番号はキーフィールドであり、重複しない)、名前、給与の基本情報が含まれている.1つの関数を作成し、2つのチェーンテーブルを1つのチェーンテーブルにまとめ、グループ化後の新しいチェーンテーブルに戻り、従業員番号の昇順に並べ替えてください.
(2)作成関数:ポインタ配列を用いて給与による昇順配列を実現する機能.並べ替え完了したポインタ配列を返す
(3)従業員番号順の新しいチェーンテーブルをそれぞれ出力するプログラムを作成する.
チェーンテーブルlist 1の初期化内容を次のように仮定します.
{002, name002,3000}, {005, name005,2500}, {003, name003,3500}
チェーンテーブルlist 2の初期化内容は次のとおりです.
{006, name006,2800}, {004, name004,3700}, {001, name001,3000}, {007, name007, 3600},
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct _employee {
	struct employee* next;
	int num;
	char name[20];
	int salary;
} employee;

void addNode(employee* target, int num, char name[], int salary) {
	employee* curr = malloc(sizeof(employee));
	curr->next = target->next;
	target->next = curr;
	strcpy_s(curr->name, 20, name);
	curr->num = num;
	curr->salary = salary;
}
void sortList(employee* target, int num,char name[],int salary) {
	employee* curr = malloc(sizeof(employee));
	employee* p = malloc(sizeof(employee));
	curr = target->next;
	p = target;
	if (curr == NULL) {
		addNode(target, num, name, salary);
	}
	else {
		while (1) {
			if (curr == NULL) {
				addNode(p, num, name, salary);
				break;
			}
			if ((curr->num) >num) {
				addNode(p, num, name, salary);
				break;
			}
			else {
				p = curr;
				curr = curr->next;
			}
		}

	}


}
employee *combination(employee* list1,employee*list2) {
	employee* list = malloc(sizeof(employee));
	employee* curr1 = malloc(sizeof(employee));
	employee* curr2 = malloc(sizeof(employee));
	curr1 = list1->next;
	curr2 = list2->next;
	list->next = NULL;
	while (curr1 != NULL) {
		sortList(list,curr1->num,curr1->name,curr1->salary);
		curr1 = curr1->next;
	}

	employee* curr3 = malloc(sizeof(employee));
	curr3 = list->next;
	while (curr2 != NULL) {
		sortList(list, curr2->num, curr2->name, curr2->salary);
		curr2 = curr2->next;
	}
	return list;

}


int main(void) {
	employee* list1 = malloc(sizeof(employee));
	employee* list2 = malloc(sizeof(employee));
	employee* list = malloc(sizeof(employee));
	list1->next = NULL;
	list2->next = NULL;
	list->next = NULL;
	addNode(list1, 2, "name002", 3000);
	addNode(list1, 5, "name005", 2500);
	addNode(list1, 3, "name003", 3500);
	addNode(list2, 6, "name006", 2800);
	addNode(list2, 4, "name004", 3700);
	addNode(list2, 1, "name001", 3000);
	addNode(list2, 7, "name007", 3600);

	list =combination(list1, list2);
	employee* curr = malloc(sizeof(employee));
	curr = list->next;
	while (curr != NULL) {
		printf("%d %s %d\n", curr->num, curr->name, curr->salary);
		curr = curr->next;
	}

	return 0;
}
実行結果

質問です。


チェーン解環


要求に応じて、完成関数プログラムを作成します.
実行可能なプログラムの1つは、関数create()が、チェーンテーブル内のノードをランダムに指す最後のノードのnextポインタを示す長さのランダムなループチェーンテーブル(チェーンテーブル内の各ノードデータドメインもランダム値)を生成することである.

1.解ループ関数openloop()(10点)
パラメータはループテーブルヘッダポインタheadであり、openloop関数はチェーンテーブルをループ解除し、正常な単一チェーンテーブルに戻すように下図に示す.

2.チェーンテーブル関数print()を出力(10点)
ループ解除後の一方向チェーンテーブルを画面に出力します.
#include<stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <time.h>

struct node
{
	int num;
	struct node* next;
};

struct node* create();
void openloop(struct node*);
void print(struct node*);

void main()
{
	struct node* head;
	srand(time(NULL));
	head = create();
	openloop(head);
	print(head);

}

struct node* create()
{
	int n = 0;
	struct node* p1, * p2, * head;
	int i;
	int randomIndex;

	head = NULL;
	p1 = NULL;
	p2 = NULL;
	while (n == 0)         //环链的长度随机
		n = ((int)rand()) % 20;

	for (i = 0; i < n; i++)
	{
		p1 = (struct node*) malloc(sizeof(struct node));
		p1->next = NULL;
		p1->num = ((int)rand());  //每节点内容随机
		if (i == 0)
			head = p1;
		else
			p2->next = p1;
		p2 = p1;
	}


	if (head != NULL)  //当链表不为空时,随机成环
	{
		randomIndex = ((int)rand()) % n;  //随机成环的节点
		p2 = head;
		for (i = 0; i < randomIndex; i++)
			p2 = p2->next;
		p1->next = p2;
	}

	return head;
}

答え:

void openloop(struct node*head) {
	struct node* p[20] = { 0 };
	struct node* curr = malloc(sizeof(struct node));
	curr = head->next;
	int flag = 1;
	int n = 0;
	while (flag) {
		if (n == 0) {
			p[0] = malloc(sizeof(struct node));
			p[0]->next = curr;
			n++;
			curr = curr->next;
		}
		else {
			for (int i = 0; i < n; i++) {
				if ((p[i]->next) == (curr->next)) {
					curr->next = NULL;
					flag = 0;
					break;
				}
				else if (i == n - 1) {
					p[n] = malloc(sizeof(struct node));
					p[n]->next = curr;
					n++;
					curr = curr->next;
					break;
				}
			}
		}
	}

}

void print(struct node* head) {
	struct node* curr = malloc(sizeof(struct node));
	curr = head->next;
	while (curr != NULL) {
		printf("%d ->", curr->num);
		curr = curr->next;
	}
	printf("NULL");
}
実行画面