structure node

Unidirectional list (with a fictitious head). Remove the k-th element from the list (k is entered from the keyboard). Add -1 to the tail of the list.
I made the basis of the code, but I can’t add -1 to the tail.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <iostream>
#include <stdlib.h>
#include <time.h>



struct node {
	
	int value;//значение
	node* next;
	int index;
	//указатель на следубщий элемент списка

}; node* head; node* tail; node fict_head = { -1, head };
//указатель на голову, хвост и фиктивную голову

void add_node_to_tail(int data,int k) {       //функция добавления элемента в хвост
	node* new_node = new node;  //создаём новый элемент
	new_node->value = data;
	

	if (head == NULL)   //если у нас ещё пустой список, то добавляет вый элемент в голову
	{
		
		new_node->next = new_node;
		head = new_node;
		head->index = k;
		
		
		
	}
	else if (tail == 0) {        //Если есть только голова, то инициализируем новым элементом хвост
		new_node->next = new_node;
		tail = new_node;
		tail->index = k;
		head->next = tail;
		
		
		
	}
	else {      //если есть голова и хвост, то создаём новый элемент и присваиваем его хвосту
		node* tmp = new node;
		tmp = tail;
		tmp->next = new_node;
		
		tail = new_node;
		tail->index = k;
		tail->next = tail;
		
		
	
	}
	
}



void print(node* head)
{
	
	if (head->next == head) //если элемент крайний, то закончить вывод на нем
	{
		printf("%d ", head->value);
		
		return;
	}
	else {
		//иначе вывести значениеи рекурсивно вызвать функцию для следующего элемента
		
		printf("%d ", head->value);
		print(head->next);
	}
}


	
	


void delite(int in,int max)
{
	node* new_node = new node;
	node* p = new node;
	node* q = new node;
	q = head;
	p = head->next;
	if (head->index != in)
	{
		while (p->index != in)
		{
			q = p;
			p = p->next;
			
		}
		q->next = p->next;
		delete[] p;
	}
	else
	{
		head = p;
		delete[]p;
		delete[]q;
	}
	
	
	
}


int main()
{
	int max = 10;
	int data;
	srand(time(NULL));
	for (int i = 1; i <= max; ++i)
	{
		data = rand() % 100 + 1;
		add_node_to_tail(data,i);
	}
	print(head);
	printf("\n");
	int b;
	scanf_s("%d", &b);
	delite(b,max);
	
	print(head);
	return 0;
}
Last edited on

I made a code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <iostream>
#include <stdlib.h>
#include <time.h>



struct node {
	
	int value;//значение
	node* next;
	int index;
	//указатель на следубщий элемент списка

}; node* head; node* tail; node fict_head = { -1, head };
//указатель на голову, хвост и фиктивную голову

void add_node_to_tail(int data,int k) {       //функция добавления элемента в хвост
	node* new_node = new node;  //создаём новый элемент
	new_node->value = data;
	

	if (head == NULL)   //если у нас ещё пустой список, то добавляет вый элемент в голову
	{
		
		new_node->next = new_node;
		head = new_node;
		head->index = k;
		
		
		
	}
	else if (tail == 0) {        //Если есть только голова, то инициализируем новым элементом хвост
		new_node->next = new_node;
		tail = new_node;
		tail->index = k;
		head->next = tail;
		
		
		
	}
	else {      //если есть голова и хвост, то создаём новый элемент и присваиваем его хвосту
		node* tmp = new node;
		tmp = tail;
		tmp->next = new_node;
		
		tail = new_node;
		tail->index = k;
		tail->next = tail;
		
		
	
	}
	
}



void print(node* head)
{
	
	if (head->next == head) //если элемент крайний, то закончить вывод на нем
	{
		printf("%d ", head->value);
		
		return;
	}
	else {
		//иначе вывести значениеи рекурсивно вызвать функцию для следующего элемента
		
		printf("%d ", head->value);
		print(head->next);
	}
}


	
	


void delite(int in,int max)
{
	node* new_node = new node;
	node* p = new node;
	node* q = new node;
	q = head;
	p = head->next;
	if (head->index != in)
	{
		while (p->index != in)
		{
			q = p;
			p = p->next;
			
		}
		q->next = p->next;
		delete[] p;
		node* tmp = new node;
		tmp = tail;
		tmp->next = new_node;

		tail = new_node;
		
		tail->next = tail;
		tail->value = -1;

		
	}
	else
	{
		head = p;
		delete[]p;
		delete[]q;
	}
	
	
	
}


int main()
{
	int max = 10;
	int data;
	srand(time(NULL));
	for (int i = 1; i <= max; i++)
	{
		data = rand() % 100 + 1;
		add_node_to_tail(data,i);
	}
	print(head);
	printf("\n");
	int b;
	scanf_s("%d", &b);
	delite(b,max);
	
	print(head);
	return 0;
}
Topic archived. No new replies allowed.