1.单链表的分类;
2.单链表的操作;
3.代码详解;
4.完整代码展示;
总体上来说,单链表可以分为两大类,一种是带头结点的,另一种是不带头结点的(由于带头结点的链表实用性更强,所以以下讲解和代码均为带头结点的链表);如果分细来讲,链表的插入可以分为两种:头插法和尾插法。
1.单链表的初始化;
2.单链表的头插法;
3.单链表的尾插法;
4.删除元素;
5.遍历链表;
1.首先应该列出需要用的头文件:
#include<stdio.h>
#include<stdlib.h> //可以用#include<malloc.h>代替
因为需要分配动态存储空间,所以要用到stdlib函数;
2.定义结构体;
typedef struct Node
{
int data;
struct Node *next;
}node;
3.初始化链表:
node *listcreat()
{
node *list=(node *)malloc(sizeof(node));
list->data=0; //头结点的数据域存储的是该链表中的结点的个数
list->next=NULL;
return list;
}
建立一个返回值为node类型的指针函数,定义一个node类型的list指针并分配内存空间,
list的数据域为该链表的结点数,使头结点的next指向空,并返回该头结点的地址。
4头插法增加一个结点:
void addlist(node *list,int data)
{
node *p=(node *)malloc(sizeof(node));
p->data=data;
p->next=list->next;
list->next=p;
list->data++;
}
建立一个新的结点p,使p的next指向原来list的next指向的位置,并使list的next指向p,list的data加一。
5.尾插法增加一个结点:
void tailadd(node *list,int data)
{
node *p=list->next;
while(p->next!=NULL)
{
p=p->next;
}
node *q=(node *)malloc(sizeof(node));
q->data=data;
q->next=p->next;
p->next=q;
list->data++;
}
先使p指向该链表的最后一个结点,增加一个结点,使p的next指向新的结点,list的data加一。
6.删除一个结点:
void deletee(node *list,int n)
{
int flag=1;
node *p=list,*q;
while(p->next!=NULL)
{
q=p;
p=p->next;
if(n==p->data)
{
q->next=p->next;
free(p);
list->data--;
flag=0;
break;
}
}
if(flag)
printf("未找到该数据,请重新输入.\n");
}
这一步的难点为while循环中的q指针和p指针的纠缠,总之,q一直指向p的上一个结点,这样就好理解了。
7.遍历链表:
void print(node *list)
{
node *p=list;
while(p!=NULL)
{
printf("%d->",p->data);
p=p->next;
}
printf("NULL");
}
遍历链表就是输出链表中的所有结点的数据,只需使p指向list然后while循环让p指向链表的下一个节点就OK了。注:输出的第一个数是list->data,也就是链表结点的个数。
8.main函数:
int main()
{
node *list=listcreat();
addlist(list,3);
addlist(list,2);
addlist(list,1);
tailadd(list,4);
tailadd(list,5);
tailadd(list,6);
deletee(list,4);
print(list);
return 0;
}
main函数中对所有函数功能都检查一遍,确保没有错误。
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
}node;
node *listcreat()
{
node *list=(node *)malloc(sizeof(node));
list->data=0; //头结点的数据域存储的是该链表中的结点的个数
list->next=NULL;
return list;
}
void addlist(node *list,int data)
{
node *p=(node *)malloc(sizeof(node));
p->data=data;
p->next=list->next;
list->next=p;
list->data++;
}
void tailadd(node *list,int data)
{
node *p=list->next;
while(p->next!=NULL)
{
p=p->next;
}
node *q=(node *)malloc(sizeof(node));
q->data=data;
q->next=p->next;
p->next=q;
list->data++;
}
void deletee(node *list,int n)
{
int flag=1;
node *p=list,*q;
while(p->next!=NULL)
{
q=p;
p=p->next;
if(n==p->data)
{
q->next=p->next;
free(p);
list->data--;
flag=0;
break;
}
}
if(flag)
printf("未找到该数据,请重新输入.\n");
}
void print(node *list)
{
node *p=list;
while(p!=NULL)
{
printf("%d->",p->data);
p=p->next;
}
printf("NULL");
}
int main()
{
node *list=listcreat();
addlist(list,3);
addlist(list,2);
addlist(list,1);
tailadd(list,4);
tailadd(list,5);
tailadd(list,6);
deletee(list,4);
print(list);
return 0;
}
*注:本文完全是自己敲出来的,如果有些许错误还请谅解!!!
有帮助的话还请点个免费的赞和关注,后面还有数据结构其他部分的讲解,谢谢大家。