数据结构埋坑之链表
链表
当时学数据结构的时候,书上全是伪代码算法,本来c语言底子就差,一看伪代码更是一点兴趣都没有,但是数据结构是基石呀,总归要学的,现在来慢慢的填坑,同时一点一点记录一下。
链表的结构
链表的类型有好多,先学习了一下单链表的结构
单链表主要部分节点和指针,节点用来存储数据,由于链表的存储是离散型的,不是像数组一样可以分配一个完整的地址空间,所以需要用到指针来找寻下一个节点。
一个完整的链表可以分为头节点,首节点,中间节点,尾节点。
其中首节点是只有指针,用于指向头节点,首节点中不保存数据,设置首节点的原因是为了更方便的对链表进行操作。
结构体struct
typedef struct NODE{
int data;
struct NODE *next;
}NODE,*pNODE;
typedef的作用就是相当于定义一个变量,这个变量就和int是一个意思,结尾的NODE以及*pNODE代表着你可以定义一个int型的变量或者int型的指针
从这里开始就要写列表了
我们先来构建一个整体的框架
#include <stdlib.h>
#include <stdio.h>
typedef struct NODE{
int data;
struct NODE *next
}NODE,*pNODE;
int main(){
pNODE pHead=creat_list();//create_list()函数帮我们创建链表,然后返还给我们头指针
show_list(pHead);//这个函数在得到一个头指针以后帮我们展示整个链表
}
creat_list()函数
思路:
- 首先我们要构造一个头节点,作为整个链表的起始节点。
- 通过用户输入与for循环来构造其余的节点。
- 在for循环的末尾我们要将构造的节点依次挂在链表的后端
重要
如果我们只通过构造头节点所返回的头指针是无法将整个链表连接的,此时我们需要再构造一个指针同样指向头节点,pTail=pHead(构造头节点所返回的头指针),
pTail=pNew(for循环所构造的节点返回的指针)
pNew=NULL
pTail=pNew(这一步使得pTail永远指向整个链表的最后一个节点)
pNODE creat_list(){
int len;
int value;
pNODE pHead=(pNODE)malloc(sizeof(NODE));
pNODE pTail=pHead;
if (pHead==NULL){
printf("失败");
exit(-1);
}
printf("the len of the list");
scanf("%d",&len);
for (int i=0;i<len;i++){
pNODE pNew=(pNODE)malloc(sizeof(NODE));
if (pNew==NULL){
printf("失败");
exit(-1);
}
printf("the value of the N.%d",i+1);
scanf("%d",&value);
pNew->data=value ;
pTail->next=pNew;
pNew->next=NULL;
pTail=pNew;
}
return pHead;
}
show_list()函数
通过头节点for循环即可
void show_list(pNODE pHead){
pNODE p;
p=pHead->next;
while (p){
printf("%d",p->data);
p=p->next;
}
}
完整的代码示例:
#include <stdlib.h>
#include <stdio.h>
#define NULL 0
typedef struct NODE{
int data;
struct NODE *next
}NODE,*pNODE;
pNODE creat_list();
void show_list();
int main(){
pNODE pHead=creat_list();
show_list(pHead);
}
pNODE creat_list(){
int len;
int value;
pNODE pHead=(pNODE)malloc(sizeof(NODE));
pNODE pTail=pHead;
if (pHead==NULL){
printf("失败");
exit(-1);
}
printf("the len of the list");
scanf("%d",&len);
for (int i=0;i<len;i++){
pNODE pNew=(pNODE)malloc(sizeof(NODE));
if (pNew==NULL){
printf("失败");
exit(-1);
}
printf("the value of the N.%d",i+1);
scanf("%d",&value);
pNew->data=value ;
pTail->next=pNew;
pNew->next=NULL;
pTail=pNew;
}
return pHead;
}
void show_list(pNODE pHead){
pNODE p;
p=pHead->next;
while (p){
printf("%d",p->data);
p=p->next;
}
}