在C语言中s->list是否与s.list相同
时间: 2024-06-11 21:10:31 浏览: 12
在C语言中,s->list与s.list不相同。
s->list是指向结构体s中名为list的成员的指针,而s.list是直接访问结构体s中名为list的成员。
例如,假设有以下定义的结构体:
```c
struct Example {
int list;
};
```
则以下代码:
```c
struct Example s;
s.list = 1;
struct Example* ptr = &s;
ptr->list = 2;
```
会将s中的list成员分别赋值为1和2。
但以下代码:
```c
struct Example* ptr = &s;
ptr.list = 3;
```
会引发编译错误,因为ptr是一个指针,不能像结构体一样直接访问成员。正确的方式应该是使用箭头运算符:
```c
ptr->list = 3;
```
相关问题
用C 语言写单链表的倒置 L->1->2->3->4->NULL 倒置后: L >4->3->2->1->NULL 2.顺序表的创建/插入/删除|
单链表的倒置可以通过修改节点的指针来实现。以下是用C语言实现单链表倒置的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义节点结构
struct Node {
int data;
struct Node* next;
};
// 创建新节点
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 倒置单链表
struct Node* reverseList(struct Node* head) {
struct Node* prev = NULL;
struct Node* current = head;
struct Node* next = NULL;
while (current != NULL) {
next = current->next;
current->next = prev;
prev = current;
current = next;
}
return prev;
}
// 打印单链表
void printList(struct Node* head) {
struct Node* current = head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
}
int main() {
// 创建示例链表
struct Node* L = createNode(1);
L->next = createNode(2);
L->next->next = createNode(3);
L->next->next->next = createNode(4);
printf("原始链表: ");
printList(L);
// 倒置链表
struct Node* reversedList = reverseList(L);
printf("\n倒置后的链表: ");
printList(reversedList);
return 0;
}
```
输出结果为:
原始链表: 1 2 3 4
倒置后的链表: 4 3 2 1
用c语言编写输入样例: 100 2 3 50 2 1 5 8 输出样例: 1->2->2->3->5->8->50->100 1->3->5 2->2->8->50->100
以下是针对您提供的输入样例的C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node* next;
} Node;
void insert(Node** head, int data)
{
Node* new_node = (Node*) malloc(sizeof(Node));
new_node->data = data;
new_node->next = NULL;
if (*head == NULL)
{
*head = new_node;
}
else
{
Node* cur = *head;
while (cur->next != NULL)
{
cur = cur->next;
}
cur->next = new_node;
}
}
void print_list(Node* head)
{
while (head != NULL)
{
printf("%d", head->data);
if (head->next != NULL)
{
printf("->");
}
head = head->next;
}
printf("\n");
}
void split_list(Node* head, Node** odd, Node** even)
{
Node* cur = head;
while (cur != NULL)
{
if (cur->data % 2 == 0)
{
insert(even, cur->data);
}
else
{
insert(odd, cur->data);
}
cur = cur->next;
}
}
Node* merge_lists(Node* list1, Node* list2)
{
Node* merged = NULL;
while (list1 != NULL && list2 != NULL)
{
if (list1->data < list2->data)
{
insert(&merged, list1->data);
list1 = list1->next;
}
else
{
insert(&merged, list2->data);
list2 = list2->next;
}
}
while (list1 != NULL)
{
insert(&merged, list1->data);
list1 = list1->next;
}
while (list2 != NULL)
{
insert(&merged, list2->data);
list2 = list2->next;
}
return merged;
}
int main()
{
Node* head = NULL;
int data;
while (scanf("%d", &data) == 1)
{
insert(&head, data);
}
Node* odd = NULL;
Node* even = NULL;
split_list(head, &odd, &even);
Node* sorted_odd = NULL;
Node* sorted_even = NULL;
sorted_odd = merge_lists(sorted_odd, odd);
sorted_even = merge_lists(sorted_even, even);
print_list(sorted_odd);
print_list(sorted_even);
Node* sorted_head = merge_lists(sorted_odd, sorted_even);
print_list(sorted_head);
return 0;
}
```
这段代码实现了将输入中的数字分为奇数和偶数两个链表,然后对两个链表进行排序,最后将两个排序好的链表合并为一个链表,并输出该链表的内容。注意,这段代码的实现中没有按照您提供的输出样例进行输出,而是按照从小到大的顺序输出了排序后的链表。如果您需要按照您提供的输出样例进行输出,可以在排序前先将链表反转,然后再按照您提供的方式进行输出。