回顾本周,最重要是是学习链表的建立。
1.链表的核心结构:
typedef struct jiedian
{
int a;
struct link *next;
}lianbiao;
lianbiao *r,*p,*head;
2.链表数据的录入:
首先要申请相同类信的变量指针,同时要对头节点进行初始化(head->next==NULL)。
r=(lianbiao*)malloc(sizeof(lianbiao));
scanf("%d",&r->next);
然后根据新链表的插入位置来选择是头插还是尾插;
头插:r->next=head->next; head->next=r;
尾插:p=head; p->next=r; p=p->next;
3.链表数据的输出”
p = head->next;
while (p != NULL) {
Node* q = NULL;
q = p;
printf("%d ", p->data);
p = p->next;//p变成了p->next
free(q);
}
free(head);
其中,q是用于链表的移动。
上代码:
1.头插法:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//创建一个节点类型
typedef struct jiedian {//typedef的意思是
int data;
struct jiedian* next;//因为我下一个节点的类型是struct node类型,所以next是struct node*类型;
}Node;
Node* head, * p, * r;//头结点是用来找到这个链表的,不能动。
int n;
//创建链表
void create_Linklist() {
head = (Node*)malloc(sizeof(Node));//我要一个Node大小的内存。存的是Node*类型的东西
head->next = NULL;//初始化指针变量
for (int i = 0; i < n; i++) {
r = (Node*)malloc(sizeof(Node));//来了个新节点
scanf("%d", &r->data);
r->next = head->next;//让新节点的next指向(原来接在头结点后面的结点)
head->next = r;//让新节点接在头结点后
}
}
int main()
{
scanf("%d", &n);
create_Linklist();
//头结点永远不要动
p = head->next;//把head下一个节点赋值给p,p代替头结点遍历整个链表
while (p != NULL) {
Node* q = NULL;
q = p;
printf("%d ", p->data);
p = p->next;//p变成了p->next
free(q);
}
free(head);
return 0;
}
2.尾插法:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//创建一个节点类型
typedef struct jiedian {//typedef的意思是
int data;
struct jiedian* next;//因为我下一个节点的类型是struct node类型,所以next是struct node*类型;
}Node;
Node* head, * p, * r;//头结点是用来找到这个链表的,不能动。
int n;
//创建链表
void create_Linklist() {
head = (Node*)malloc(sizeof(Node));//我要一个Node大小的内存。存的是Node*类型的东西
head->next = NULL;//初始化指针变量
p = head;//把head赋值给p,p代替头结点遍历整个链表
for (int i = 0; i < n; i++) {
r = (Node*)malloc(sizeof(Node));//来了一个新结点
r->next = NULL;//初始化
scanf("%d", &r->data);
p->next = r;
p = p->next;//移动p
}
}
int main()
{
scanf("%d", &n);
create_Linklist();
//头结点永远不要动
p = head->next;
while (p != NULL) {
Node* q = NULL;
q = p;
printf("%d ", p->data);
p = p->next;//p变成了p->next
free(q);
}
free(head);
return 0;
}