数据结构第2天

链表的增删改查

功能函数:创建函数

link* creat_linklist()
{
	link* head=(link*)malloc(sizeof(link));
	if(NULL==head){
		printf("创建链表失败\n");
		return (link*)-1;
	}
	head->text.len=0;
	head->next=NULL;

	return head;
}

功能函数:头部插入数据

void insert_linkDataBefore(link* head,datatype data)
{
	link* temp=(link*)malloc(sizeof(link));
	temp->next=NULL;
	temp->text.data=data;

	temp->next=head->next;
	head->next=temp;

	head->text.len++;

	return;
}

功能函数:尾部插入数据

void insert_linkDataAfter(link* head,datatype data)
{
	link* temp=(link*)malloc(sizeof(link));

	temp->text.data=data;
	temp->next=NULL;

	link* p=head;
	while(p->next!=NULL){
		p=p->next;
	}
	p->next=temp;

	head->text.len++;

	return;
}

功能函数:根据指定位置插入数据

void insert_linkDataByIndex(link* head,int index,datatype data)
{
	if(index>head->text.len+1 || index<0){
		printf("插入位置不合法\n");
		return;
	}
	if(NULL==head){
		printf("链表不合法\n");
		return;
	}
	link* temp=(link*)malloc(sizeof(link));
	temp->next=NULL;
	temp->text.data=data;

	link* p=head;
	for(int i=0;i<index-1;i++){ //找到前一个
		p=p->next;
	}
	temp->next=p->next;
	p->next=temp;
	head->text.len++;
	
	return;
}

功能函数:从头部删除数据

void delete_linkDataBefore(link* head)
{
	if(NULL==head->next||NULL==head){
		printf("链表为空,删除失败\n");
		return;
	}
	link* temp=head->next;
	head->next=head->next->next;
	free(temp);

	head->text.len--;

	return;
}

功能函数:从尾部插入数据

void delete_linkDataAfter(link* head)
{
	if(NULL==head->next||NULL==head){
		printf("链表为空,删除失败\n");
		return;
	}

	link* p=head;
	while(p->next->next!=NULL){
		p=p->next;
	}
	link* temp=p->next;
	p->next=NULL;

	head->text.len--;
	free(temp);

	return;
}

功能函数:从指定位置插入数据

void delete_linkDataByIndex(link* head,int index)
{
	if(index<=0 || index>head->text.len){
		printf("删除位置不合法\n");
		return;
	}
	if(NULL==head){
		printf("链表不合法\n");
		return;
	}

	link* p=head;
	for(int i=0;i<index-1;i++){ //找到前一个
		p=p->next;
	}
	link* temp=p->next;
	p->next=p->next->next;
	head->text.len--;

	free(temp);
	temp=NULL;
	return;
}

功能函数:根据指定位置查询链表数据

void search_linkDataByIndex(link* head,int index)
{
	link* p=head;
	for(int i=0;i<index;i++){
		p=p->next;
	}
	printf("%d\n",p->text.data);
	return;
}

功能函数:遍历链表

void show_linklist(link* head)
{
	if(NULL==head){
		printf("链表错误\n");
	}
	
	link* p=head->next;
	while(p!=NULL){
		printf("%d ",p->text.data);
		p=p->next;
	}
	putchar(10);
	printf("%d\n",head->text.len);

	return;
}

功能函数:按升序排列数据

void insert_linkAndSort(link* head,datatype data)
{
	link* temp=(link*)malloc(sizeof(link));
	temp->next=NULL;
	temp->text.data=data;
	if(NULL==head){
		printf("链表错误\n");
		return;
	}
	link* p=head;
	while(p->next!=NULL){
		if(p->next->text.data>temp->text.data){
			break;//退出做插入
		}
		p=p->next;
	}
	temp->next=p->next; //尾部插入也满足
	p->next=temp;
	head->text.len++;

	return;
}

功能函数:快慢指针查找中间数据

link* find_centerIndex(link* head)
{
	if(NULL==head){
		printf("链表错误\n");
		return NULL;
	}
	link* slow,*fast;
	slow=fast=head->next; //从第一个位置开始
	while( fast !=NULL&&fast->next!=NULL){
		slow=slow->next; //slow一次偏移1位
		fast=fast->next->next; //fast一次偏移两位
	}
	return slow;
}

功能函数:链表翻转

思路:将head头结点独立出来,并将后面的结点一个一个取出来进行头插

由于断链会导致找不到后面的链,需要将后面的第一个存起来,使用p

由于p是移动中的结点,当它头插后,后面的链又找不到了,于是需要再往后存,用q

void rever_link(link* head)
{
	//将head独立出来
	link* p,*q;
	p=head->next; //保存第一个节点
//	q=p->next; //保存第二个节点
	head->next=NULL; //独立head

	while(p!=NULL){//当移动的节点为空时退出
		q=p->next; //往后移动一位
		p->next=head->next;//头插
		head->next=p;
		p=q; //往后移动一位
	}
	return;
}

头文件

#ifndef __LINKLIST_H__
#define __LINKLIST_H__

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

typedef int datatype;
typedef struct Link{
	union{
		int len;
		datatype data;
	} text;
	struct Link* next;
} link;

link* creat_linklist();
void insert_linkDataBefore(link* head,datatype data);
void insert_linkDataAfter(link* head,datatype data);
void insert_linkDataByIndex(link* head,int index,datatype data);

void delete_linkDataBefore(link* head);
void delete_linkDataAfter(link* head);
void delete_linkDataByIndex(link* head,int index);

void search_linkDataByIndex(link* head,int index);
void show_linklist(link* head);

void insert_linkAndSort(link* head,datatype data);
link* find_centerIndex(link* head);
void rever_link(link* head);

#endif

主函数

#include "./03_linklist.h"

int main(int argc, const char *argv[])
{
	link* head=creat_linklist();

	insert_linkAndSort(head,20);
	insert_linkAndSort(head,300);
	insert_linkAndSort(head,25);
	insert_linkAndSort(head,70);
	show_linklist(head);
	link* slow=find_centerIndex(head);
	printf("slow=%d\n",slow->text.data);
	return 0;

	insert_linkDataBefore(head,10);
	insert_linkDataBefore(head,11);
	insert_linkDataBefore(head,12);

	insert_linkDataAfter(head,13);
	insert_linkDataAfter(head,14);
	insert_linkDataAfter(head,15);

	insert_linkDataByIndex(head,3,100);

	delete_linkDataByIndex(head,4);
//	delete_linkDataBefore(head);
//	delete_linkDataAfter(head);
	
	search_linkDataByIndex(head,1);
	show_linklist(head);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值