链表就是带有方向的矢量线,串起来了很多数据方块,顺着头结点可以从前向后访问存储的数据。链表分为,数据域和指针域,数据域储存自己的数据,指针域指向下一个结点,通过指针域可以访问下一个数据。
创建链表
表头的创建
创造结点:1、头插 2、尾插
遍历链表
链表的增删改查
链表的逆置
无头链表
1、创建链表
typedef struct node //链表
{
int val;//数据域
struct node *next;//指针域
}Node;
2、表头的创建
Node *init () //创造头结点
{
Node *head;
head = (Node*)malloc(sizeof(Node));//给头结点分配空间
head->next = NULL;//令头结点的指针域指向空
return head;
}
3、创建链表
(1)创建链表之头插法
void creatList(Node *head)
{
int val;//要存储的数据
Node *newhead = NULL;//创造一个新结点
while (1)
{
scanf("%d", &val);
if (val == -1)//输入的数据==-1,跳出。
{
break;
}
newhead = (Node *)malloc(sizeof(Node));//给新结点申请空间
newhead->val = val;//第一步,把要存储的数据存入新结点的数据域中
newhead->next = head->next;//第二步,使头结点的指针域赋给新结点的指针域
head->next = newhead;//第三步,使头结点的指针域指向新结点。
//成功在头结点和下一个结点插入一个指针
}
}
(2)创建链表之尾插法
void creatTail(Node *head) //尾插法创建链表
{
int val;//要存储的数据
Node *p = head;//辅助移动指针
Node *q = NULL;
while (1)
{
scanf("%d", &val);
if (val == -1)
{
break;
}
q = (Node*)malloc(sizeof(Node));//给新结点申请空间
q->val = val;//第一步,把要存储的数据存入新结点的数据域中
p->next = q;//开始是把头结点的指针域指向新结点
p = p->next;//移动指针,指向下一个结点
//在下一次循环中,将上一次创建的结点的指针域赋给新结点
}
p->next = NULL;//最后结点的指针域指向空
}
4、遍历链表
void printList(Node *head) //链表遍历
{
Node *p = head;
p = p->next;
while(p) //p不为空,一直循环
{
printf("%d", p->val);
p = p->next;//指向下一个结点,输出下一个结点的指针域
}
}
代码(头插)
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int val;
struct node *next;
}Node;
Node *init ()
{
Node *head;
head = (Node*)malloc(sizeof(Node));
head->next = NULL;
return head;
}
void creatTail(Node *head)
{
int val;
Node *p = head;
Node *q = NULL;
while (1)
{
scanf("%d", &val);
if (val == -1)
{
break;
}
q = (Node*)malloc(sizeof(Node));
q->val = val;
p->next = q;
p = p->next;
}
p->next = NULL;
}
void printList(Node *head)
{
Node *p = head;
p = p->next;
while(p)
{
printf("%d", p->val);
p = p->next;
}
}
int main()
{
Node *head;
head = init();
creatTail(head);
printList(head);
return 0;
}
5、链表的增删改查(查询目标结点的数据)
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int val;
struct node *next;
} Node;
Node *init()
{
Node *head;
head = (Node *)malloc(sizeof(Node));
head->next = NULL;
return head;
}
void creatList(Node *head)
{
int val;
Node *newhead = NULL;
while (1)
{
scanf("%d", &val);
if (val == -1)
{
break;
}
newhead = (Node *)malloc(sizeof(Node));
newhead->val = val;
newhead->next = head->next;
head->next = newhead;
}
}
void printList(Node *head)
{
Node *p = head->next;
while (p)
{
printf("%d", p->val);
p = p->next;
}
}
Node *findList(Node *head) //查,返回的是目标节点的上一个节点
{
Node *k = head;
Node *upk = NULL;
int a;
scanf("%d", &a);
while (k != NULL)
{
if (a == k->val)
{
return upk;
}
upk = k;
k = k->next;
}
return NULL;
}
void deleteList(Node *upk) //删
{
Node *up1k = upk;
Node *k = up1k->next;
Node *outk = k->next;
free(k);
up1k->next = outk;
}
void increase(Node *upk) //增
{
Node *newnode = NULL;
Node *up1k = upk;
newnode = (Node *)malloc(sizeof(Node));
int a;
scanf("%d", &a);
newnode->val = a;
newnode->next = up1k->next;
up1k->next = newnode;
}
void correct(Node *upk)//改
{
Node *k = upk->next;
int a;
scanf("%d", &a);
k->val = a;
}
int main()
{
Node *head = NULL;
head = init();
creatList(head);
printList(head);
return 0;
}
6、链表的逆置
使用头插法就地逆置单链表_C语言_哔哩哔哩_bilibili
强烈建议看看!!!
PNODE p = pHead->pNext;
PNODE q;
pHead->pNext = NULL;
while(p != NULL)
{
q = p;
p = p->pNext;
q->pNext = pHead->pHext;
pHead->pNext = q;
}
7、无头链表
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int val;
struct node *next;
} Node;
Node *creatTail(Node **head)
{
int val;
Node *p = *head;
Node *q = NULL;
while (1)
{
scanf("%d", &val);
if (val == -1)
{
break;
}
q = (Node *)malloc(sizeof(Node));
q->val = val;
if (*head == NULL)
{
*head = q;
p = q;
}
else
{
p->next = q;
p = p->next;
}
}
p->next = NULL;
}
void printList(Node *head)
{
Node *p = head;
while (p)
{
printf("%d", p->val);
p = p->next;
}
}
int main()
{
Node *head = NULL;
creatTail(&head);
printList(head);
return 0;
}