数据结构-链表(C语言)
四种常见的链表结构
结点包括两个域,存储数据信息的是数据域,存储直接后继或前驱存储位置的域的是指针域。指针域中存储的信息称为指针。单链表的指针域只有一个Next指向直接后继而双向链表的指针域有两个Next和Prev分别指向直接后继和直接前驱结点。
使用链表的好处:便于插入和删除,时间复杂度都为O(1)。
下面是关于单链表的创建,插入,删除,查询和遍历的代码
结点的定义
typedef struct LNode
{
int data;
struct LNode* next;
}Node,*LinkList;
其中data为数据域,next为指针域
链表的创建
LinkList create_list()
{
LinkList head,p,q;
int i=0;
head = NULL;
p=(LinkList)malloc(sizeof(Node));
scanf("%d",&p->data);
while(p->data){
if(i==0){
head=p;
p->next=NULL;
q=p;
i++;
}else{
p->next=NULL;
q->next=p;
q=p;
}
p=(LinkList)malloc(sizeof(Node));
scanf("%d",&p->data);
}
return head;
}
采用尾插法创建链表,依次输入链表各个结点的数据(此处为整型),输入0结束。尾结点的指针域为空。
链表结点的插入
void insert_LINKLIST(LinkList L,int index,int data)
{
LinkList p=L,q;
for(int i=0;i<index-1&&p!=NULL;i++){
p=p->next;
}
q=(LinkList)malloc(sizeof(Node));
q->data=data;
q->next=p->next;
p->next=q;
}
L为要插入链表,index为要插入位置,data为要插入的数据。
先找到要插入的位置,然后改变指针的指向。
注意:先1后2,顺序不能改变。(假设先2后1,会导致要插入位置后的结点丢失)。
链表结点的删除
void delete_LINKLIST(LinkList L,int index,int& data)
{
LinkList p=L;
for(int i=0;i<index-1&&p!=NULL;i++){
p=p->next;
}
data=p->next->data;
p->next=p->next->next;
}
L为要进行删除结点操作的链表,index为要删除位置,data为被删除的数据。
同链表插入一样,先找到要删除结点位置,然后改变指针的指向。
链表查询结点
void quary_LINKLIST(LinkList L,int& index,int e)
{
LinkList p=L;
int i;
index=0;
for(i=0;p!=NULL&&p->data!=e;i++){
p=p->next;
}
index=i;
}
L为要执行查询操作的链表,index为被查询位置,e为要查询的数据。
遍历链表
void trverse_LINKLIST(LinkList L)
{
LinkList p=L;
if(p==NULL) return;
while(p){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
依次遍历链表直到尾结点(即指针域为空NULL)。
来源:CSDN
作者:追_光
链接:https://blog.csdn.net/weixin_43527977/article/details/104027850