c语言实现链表的一些相关操作

基本的曾删改查,包括反转(两种方法,头插法和递归),升序排序,去重操作。(都是基本代码,没有复杂的逻辑,看不懂可以私信,有时间看到了会回复)。

main.c

#include "linkList.h"

int main(int argc, const char *argv[])
{
	LinkList list=list_create();
	insert(list,55);
	insert(list,66);
	insert(list,77);
	insert(list,88);
	insert(list,77);
	insert(list,88);
	insert(list,88);
	insert(list,88);
	iterator(list);
    //LinkList p=searchToIndex(list,3);
	//printf("%d\n",p->data);
	//insertToIndex(list,2,67);
	//iterator(list);
	//delete(list);
	//iterator(list);
	//deleteToIndex(list,1);
	//iterator(list);
	//int index=searchToData(list,77);
	//updateToIndex(list,index,22);
	//iterator(list);
	//reverse(list);
	//iterator(list);
	//destory(list);
	//iterator(list);
	//distinct(list);
	//iterator(list);
	//sort(list);
	//iterator(list);
	list->next=recursion_reverse(list->next);
	iterator(list);
	return 0;
}

linkList.c

#include "linkList.h"

LinkList list_create(){
	LinkList list=(LinkList)malloc(sizeof(Node));
	if(list==NULL){
		printf("创建失败\n");
		return NULL;
	}
	list->length=0;
	list->next=NULL;
	printf("链表创建成功\n");
	return list;
}

LinkList apply_node(datatype e){
	LinkList node=(LinkList)malloc(sizeof(Node));
	if(node==NULL){
		printf("创建失败\n");
		return NULL;
	}
	node->data=e;
	node->next=NULL;
	printf("节点创建成功\n");
	return node;
}

int is_empty(LinkList p){
	return p->next==NULL;
}

int insert(LinkList head,datatype e){
	if(head==NULL){
		printf("链表不存在\n");
		return -1;
	}
	LinkList node=apply_node(e);
	node->next=head->next;
	head->next=node;
	head->length++;
	printf("头插法插入成功\n");
	return 0;
}

void iterator(LinkList head){
	if(head==NULL||is_empty(head)){
		printf("链表为空或不存在\n");
		return;
	}
	head=head->next;
	while(head!=NULL){
		printf("%d\t",head->data);
		head=head->next;
	}
	printf("\n");
}

LinkList searchToIndex(LinkList head,int index){
	if(head==NULL||index<0||index>=head->length){
		printf("查找失败\n");
		return NULL;
	}
	head=head->next;
	for(int i=0;i<index;i++){
		head=head->next;
	}
	return head;
}

int insertToIndex(LinkList head,int index,datatype e){
	if(head==NULL||index<0||index>head->length){
		printf("插入失败\n");
		return -1;
	}
	head->length++;
	LinkList p=apply_node(e);
	for(int i=0;i<index;i++){
		head=head->next;
	}
	p->next=head->next;
	head->next=p;
	printf("插入成功\n");
	return 0;
}

int delete(LinkList head){
	if(head==NULL||is_empty(head)){
		printf("删除失败\n");
		return -1;
	}
	head->length--;
	LinkList p=head->next;
	head->next=p->next;
	free(p);
	p=NULL;
	return 0;
}

int deleteToIndex(LinkList head,int index){
	if(head==NULL||index<0||index>=head->length){
		printf("删除失败\n");
		return -1;
	}
	head->length--;
	for(int i=0;i<index;i++){
		head=head->next;
	}
	LinkList p=head->next;
	head->next=p->next;
	free(p);
	p=NULL;
	return 0;
}

int  searchToData(LinkList head,datatype e){
	if(head==NULL||is_empty(head)){
		printf("查找失败\n");
		return -1;
	}
	int index=0;
	head=head->next;
	while(head!=NULL){
		if(head->data==e){
			printf("查找成功\n");
			return index;
		}
		head=head->next;
		index++;
	}
	printf("数据不存在\n");
	return -1;
}

int updateToIndex(LinkList head,int index,datatype e){
	if(head==NULL||index<0||index>=head->length){
		printf("修改失败\n");
		return -1;
	}
	LinkList p=searchToIndex(head,index);
	p->data=e;
	printf("修改成功\n");
	return 0;
}

int reverse(LinkList head){
	if(head==NULL||is_empty(head)){
		return -1;
	}
	LinkList p=head->next;
	LinkList q=NULL;
	head->next=NULL;
	while(p!=NULL){
		q=p->next;
		p->next=head->next;
		head->next=p;
		p=q;
	}
	return 0;
}

void destory(LinkList head){
	if(head==NULL){
		printf("链表为空\n");
		return;
	}

	while(head->next!=NULL){
		delete(head);
	}

	free(head);
}

void distinct(LinkList head){
	if(head==NULL||is_empty(head)){
		printf("链表为空或不存在\n");
		return;
	}
	LinkList p=head->next;
	int i=1;
	while(p!=NULL){
		int flag=searchToData(p,p->data);
		while(flag!=-1){
			deleteToIndex(head,flag+i);
			flag=searchToData(p,p->data);
		}
		p=p->next;
		i++;
	}
	printf("去重成功\n");
}

void sort(LinkList head){
	LinkList p=head->next;
	LinkList q=p;

	for(int i=0;i<head->length-1;i++){
		for(int j=0;j<head->length-(i+1);j++){	
			if(q->data>q->next->data){
				datatype temp= q->data;
				q->data=q->next->data;
				q->next->data=temp;
			}
			q=q->next;
		}
		q=p;
	} 
}
LinkList recursion_reverse(LinkList head){
	if(head->next==NULL){
		return head;
	}
	LinkList new_head=recursion_reverse(head->next);
	head->next->next=head;
	head->next=NULL;
	return new_head;
}





linkList.h

#ifndef LINKLIST
#include <myhead.h>
typedef int datatype;

typedef struct Node{
	union{
		int length;
		datatype data;
	};
	struct Node* next;
}Node,*LinkList;

LinkList list_create();

LinkList apply_node(datatype e);

int insert(LinkList head,datatype e);

void iterator(LinkList head);

LinkList searchToIndex(LinkList head,int index);

int insertToIndex(LinkList head,int index,datatype e);

int delete(LinkList head);

int deleteToIndex(LinkList head,int index);

int searchToData(LinkList head,datatype e);

int updateToIndex(LinkList head,int index,datatype e);

int reverse(LinkList head);

void destory(LinkList head);

void distinct(LinkList head);

void sort(LinkList head);

LinkList recursion_reverse(LinkList head);
#endif

  • 30
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值