数据结构之链表(C语言)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xnh_565175944/article/details/79994994

链式存储结构:

      链式存储结构是利用结点中的指针来表示数据元素之间的关系。逻辑上相邻的元素其物理位置不一定相邻。

什么是链表?

       链表采用的是链式存储结构.链表是逻辑顺序,但物理地址存储任意的线性表。通俗的讲,链表就是一个长链,链中有很多个结点,这些结点首位相连形成了一条链,每个结点都储存了数据,所以叫链表。

 

链表的内容

链表是由一系列结点组成,而每个结点包括两个部分:一个是存储数据元素的数据域,一个是存储下一个结点地址的指针域。

链表的缺点:

查找速度慢,需要循环遍历链表

链表的优点

插入,删除操作方便,不会导致元素的移动,因为元素增减,只需要调整指针即可。

在空间上,数组是定制,而链表可以在允许的范围内随意扩大。

 

链表存储结构:

#include<stdio.h>
#include<stdlib.h>

typedef struct linklist
{
	int data;
	linklist *next;
}linklist;

void linklist_init(linklist *q); //初始化 
void linklist_build1(linklist* head); //尾插法 
void linklist_build2(linklist* head); //头插法
void linklist_traverse(linklist *head); //遍历 
int linklist_search(linklist* head,int position);  //寻找第一个值为position的位置 
linklist* linklist_reverse(linklist* head);    //链表反转 

int main()
{
	linklist *p;
	int position=5;
//	p = (linklist*)malloc(sizeof(linklist));
//	p->next = NULL;
	linklist_init(p);
	linklist_build1(p);
	linklist_traverse(p);
	position = linklist_search(p,position);
	printf("寻找到的节点为:%d\n",position);
	p = linklist_reverse(p);
	linklist_traverse(p);
	return 0;
}
void linklist_init(linklist *p)
{
	p = (linklist*)malloc(sizeof(linklist));
	p->next = NULL;
}

void linklist_build1(linklist* head)
{
	linklist *p,*tail;
	int length;
	tail = head;
	printf("请输入你要创建的链表长度:");
	scanf("%d",&length);
	printf("请输入你要输入的数据:\n");
	while(length--)
	{
		p = (linklist*)malloc(sizeof(linklist));
		if(p == NULL) return;
		p->next = NULL;
		scanf("%d",&p->data);
		tail->next = p;
		tail = p;
	}	
}

void linklist_build2(linklist* head)
{
	linklist *p;
	head->next=NULL;
	int length;
	printf("请输入你要创建的链表长度:");
	scanf("%d",&length);
	printf("请输入你要输入的数据:\n");
	while(length--){
		p = (linklist*)malloc(sizeof(linklist));
		if(p==NULL) return;
		scanf("%d",&p->data);
		p->next = head->next;
		head->next = p;
	}
} 

void linklist_traverse(linklist *head)
{
	linklist *p;
	p = head->next;
	while(p)
	{
		printf("%d%s",p->data,p->next!=NULL?" ":"\n");
		p = p->next;
	}
}

int linklist_search(linklist* head,int position)
{
	int i = 0;
	linklist *p;
	p = head;
	while(p)
	{
		if(p->data == position){
			position = i;
			return position;
		}
		i++;
		p=p->next;	
	}
	return 0;
}

linklist* linklist_reverse(linklist* head)
{
	linklist *newhead;
	linklist *p;
	newhead = (linklist*)malloc(sizeof(linklist));
	newhead->next=NULL;
	while(head->next!=NULL)
	{
		p = head->next;
		head->next = p->next;
		p->next = newhead->next;
		newhead->next = p;
	}
	free(head);
	return newhead;
}


 

 

 

展开阅读全文

没有更多推荐了,返回首页