目录
1.q=tail->next与tail->next=q之间的区别
1.q=tail->next与tail->next=q之间的区别
首先我们要知道的是,赋值表达式是将右值赋给左值,那我们再来看。
前者:将tail的指针域的值给了q,即,让q指向tail的下一个节点,前提是tail后面还有节点,
后者:将q的值给了tail的指针域,主要起了一个连接作用,即,把q当作tail的下一个节点,可以理解为插入操作,也可以理解为增加节点的操作。
2.结构体类型作为函数的返回类型
我们对这部分进行剖析一下
该函数的返回类型是一个结构体类型,参数是两个结构体变量
返回值是result,只是一个变量,但是,这个是结构体变量,一个变量中又含有多个数据,所以实质上,它返回了多个数据。
//我们对这部分进行剖析一下
//该函数的返回类型是一个结构体类型,参数是两个结构体变量
//返回值是result,只是一个变量,但是,这个是结构体变量,一个变量中又含有多个数据,所以实质上,它返回了多个数据。
struct complex multiply(struct complex x, struct complex y){
struct complex result;
result.real=x.real*y.real-x.imag*y.imag;
result.imag=x.real*y.imag+x.imag*y.real;
return result;
}
struct complex{
int real;
int imag;
};
int main()
{
struct complex product, x, y;
scanf("%d%d%d%d", &x.real, &x.imag, &y.real, &y.imag);
product = multiply(x, y);
printf("(%d+%di) * (%d+%di) = %d + %di\n",
x.real, x.imag, y.real, y.imag, product.real, product.imag);
return 0;
}
所以我们可以得出一个结论,要想函数不止返回一个值,除了用指针以外,还可以借助结构体。
3.逆序链表
这个地方我反正一直都是有点懵的状态。所以我就讲一下
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
typedef struct tagListNode {
int data;
struct tagListNode* next;
}ListNode, * List;
void PrintList(List head);
List ReverseList(List head);
int main()
{
//分配链表头结点
ListNode* head;
head = (ListNode*)malloc(sizeof(ListNode));
head->next = NULL;
head->data = -1;
//将[1,10]加入链表
int i;
ListNode* p, * q;
p = head;
for (int i = 1; i <= 10; i++)
{
q = (ListNode*)malloc(sizeof(ListNode));
q->data = i;
q->next = NULL;
p->next = q;
p = q;
}
PrintList(head); /*输出原始链表*/
head = ReverseList(head); /*逆序链表*/
PrintList(head); /*输出逆序后的链表*/
return 0;
}
List ReverseList(List head)
{
if (head->next == NULL || head->next->next == NULL)
{
return head; /*链表为空或只有一个元素则直接返回*/
}
ListNode* t = NULL,
* p = head->next,
* q = head->next->next;
while (q != NULL)
{
t = q->next;
q->next = p;
p = q;
q = t;
}
/*此时q指向原始链表最后一个元素,也是逆转后的链表的表头元素*/
head->next->next = NULL; /*设置链表尾*/
//这个地方就是一个知识点了,链表的第一个元素是元节点,即头节点的下一个,故,链表逆序时,头节点不变。
head->next = p; /*调整链表头*/
return head;
}
void PrintList(List head)
{
ListNode* p = head->next;
//或者用个for循环,遍历
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("/n");
}