链表就是带有方向的矢量线,串起来了很多数据方块,顺着头结点可以从前向后访问存储的数据。链表分为,数据域和指针域,数据域储存自己的数据,指针域指向下一个结点,通过指针域可以访问下一个数据。
创建链表
表头的创建
创造结点: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#include 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#include 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#include 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; }



