1.链表介绍
●链表是一种物理存储单元上非连续、非顺序的存储结构
●链表由一系列结点(链表中每一-个元素称为结点)组成
●每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域
●数据元素的逻辑顺序是通过链表中的指针链接次序实现的
链表可分为,静态链表,动态链表
静态链表举例
#include<stdio.h>
#include<stdlib.h>
struct linknode{
int data;
struct linknode*next;
};
void test(){
struct linknode node1={10,NULL};
struct linknode node2={20,NULL};
struct linknode node3={30,NULL};
struct linknode node4={40,NULL};
struct linknode node5={50,NULL};
struct linknode node6={60,NULL};
node1.next=&node2;
node2.next=&node3;
node3.next=&node4;
node4.next=&node5;
node5.next=&node6;
struct linknode *pc=&node1;
while(pc!=NULL)
{
printf("%d",pc->data);
pc=pc->next;
}
}
int main()
{
test();
return 0;
}
可分为单向链表,双向链表,循环链表,单向循环链表,双向循环链表
链表的创建
1.定义一个新结构体结点(火车车厢)
2.为该结构体结点申请空间
3.将该结构体结点的内存全部清0(让新结点的Next为空)
4.将插入的值传到该结构体结点中对应的值中
5.如果链表为空:头结点和尾结点都指向该结点(结构体的变量名代表该结构体的首地址)
6.如果链表不为空:先将原有链表的头指针,赋给新结点的Next((Next是结构体里自带的指向下-结点地址的指针,已定义),再将新结点作为链表头(如下)
struct linkenode* createlist()
{
struct linkenode* header = (struct linkenode*)malloc(sizeof(struct linkenode));
header->next = NULL;
return header;
}
链表的增删改查
增-新增一段新节点
首先先定义一段结构体
然后分配内存
定义数据域和指针域,注意此时指针最好直接指向空指针
struct linkenode* createnode(int data)
{
struct linkenode* newnode = (struct linkenode*)malloc(sizeof(struct linkenode));
newnode->data = data;
newnode->next = NULL;
return newnode;
删
首先找到被删的位置,运用指针找到对应的data
如果找不到就返回
如果找到了看一下位置
因为要把尾部指针最后调整一下
使被删节点两边可以连上
void shan (struct linknode*header);//删除
{
struct linknode*ppre=header;
struct linknode*prignt=header->next;//定义两个辅助指针
while(pright!=NULL){
if(pright->data=oldval){
break;
}
ppre=pright;
prght=prght->next;
}
if(pright==NULL){
return;
printf("链表中无此数据");
}
ppre=pright->next;
free(pright)
pright=NULL;
}
改
先看头指针是否为空
然后找到data对应数据,将其改为想要的数据n
void gai (struct linknode*header,int data,int n)//改
{
if (header == NULL)
{
printf("此后无链表");
}
else
{
while (header->data != data)
{
header = header->next;
if (header->next == NULL)
{
printf("链表中没有该数据");
}
}
header->data = n;
}
}
查
和修改大致相同不过把修改变成了计数,指针每挪动一位,计数器加一,可得
void cha(struct node* headnode, int data)
{
int p = 0;
if (header == NULL)
{
printf("无链表");
}
else
{
while (header->data != data)
{
header = header->next;
p++;
if (header == NULL)
{
printf("链表中没有该数据");
}
}
printf("这是第%d位",i);
}
}
头插
首先找到插入的位置,运用指针找到对应的data
如果找不到就返回
如果找到了看一下位置
因为要把尾部指针最后调整一下
使插入节点两边可以连上
void toucha (struct linknode*header,int oldval,int newval)//头插
{
struct linknode*ppre=header;
struct linknode*prignt=header->next;//定义两个辅助指针
while(pright!=NULL){
if(pright->data=oldval){
break;
}
ppre=pright;
prght=prght->next;
}
if(pright==NULL){
return;
printf("链表中无此数据");
}
//先创建新节点
struct linknode*newnode=malloc(sizeof(struct linknode) );
newnode->data=newval;
newnode->next=NULL;
newnode->data=pright;
ppre->next=newnode;
}
尾插
先看头指针是否为空,然后将被插入部分地址给NULL,被插入部分尾部指针变成NULL
void weicha (struct linknode*header,int data);//尾插
{
//先创建新节点
struct linknode*newnode=malloc(sizeof(struct linknode) );
newnode->data=newval;
newnode->next=NULL;
if (header == NULL)
{
printf("无链表");
}
else
{
while (header->next != NULL)
{
header = header->next;
}
header->next = newnode;
}
}