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");
}
実行画面Reference
この問題について(C言語構造体問題2), 我々は、より多くの情報をここで見つけました https://velog.io/@sungmin-choi/C언어-구조체-문제2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol