数据结构-链表的基本操作

我的梦境 提交于 2020-01-19 00:27:40

数据结构-链表(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)。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!