链表的基本操作

本文详细介绍了一个简单的链表实现,包括创建、打印、插入、删除等基本操作,并提供了链表合并、排序、转置及去重等功能的具体实现方法。
#include<stdio.h>
#include<stdlib.h>

typedef int datatype;

//存储结构定义
typedef struct LNODE
{
	datatype data;
	struct LNODE *next;
}Lnode, *LinkList;

//打印链表
void printlist(const LinkList l)
{
	LinkList p=l->next;
	while(p)
	{
		printf("%d ",p->data);
		p=p->next;
	}
	printf(" \n");
	return;
}

//链表初始化
LinkList initlist()
{
	LinkList l;
	l=(LinkList)malloc(sizeof(Lnode));
	if(l==NULL)
	{
		printf("l failed! \n");
		return NULL;
	}
	l->next=NULL;

	return l;
}

//创建链表
LinkList createlist(LinkList l)
{
	l=initlist();
        
	int x;
	LinkList s,r=l;
	printf("please input the data: \n");
        scanf("%d",&x);
	while(x!=0)
	{
		s=(LinkList)malloc(sizeof(Lnode));
		s->data=x;
		if(l->next==NULL)
			l->next=s;
		else
			r->next=s;
		r=s;
		scanf("%d",&x);
	}
	r->next=NULL;

	return l;
}

//求链表的长度
int lengthlinklist(const LinkList l)
{
	int i=0;
	LinkList p=l;
	while(p->next)
	{
		++i;
		p=p->next;
	}
	return i;
}

//查找第i个元素
LinkList searchlinklist(const LinkList l,int i)
{
	int j=0;
	LinkList p=l;

	if(lengthlinklist(l)<i)
	{
		printf("i is error! \n");
		return 	NULL;
	}
	while(p->next&&j<i)
	{
		++j;
		p=p->next;
	}
	if(j==i)
		return p; 
	else 
		return NULL;
}

//查找值为x的元素
LinkList searchlinklist1(LinkList l, datatype x)
{
	LinkList p=l->next;
	while(p&&p->data!=x)
		p=p->next;
	if(p->data==x)
		return p;
	else
		return NULL;
}


//在链表的第i个位置插入值为x的节点
int insertlinklist(LinkList l,int i, datatype x)
{
	LinkList p,s=searchlinklist(l,i-1);
	if(!p)
	{
		printf("error! \n");
		return 0;
	}
	else
	{
		p=(LinkList)malloc(sizeof(Lnode));
		p->data=x;
		p->next=s->next;
		s->next=p;
		return 1;
	}
}

//删除第i个元素
int deletelinklist(LinkList l, int i)
{
	LinkList p;
	LinkList q=searchlinklist(l,i-1);
	if(!p)
	{
		printf("error! \n");
		return -1;
	}
	else if(!p->next)
	{
		printf("i not exist! \n");
		return 0;
	}
	else
	{
	p=q->next;
	q->next=p->next;
	free(p);
	return 1;
	}
}

//合并两个链表
LinkList guibinglinklist(const LinkList a,const LinkList b,LinkList c)
{
	LinkList h1,h2,h;
	h1=a->next;
	h2=b->next;
	c=a;
	h=c;
	while(h1&&h2)
	{
		if(h1->data<=h2->data)
		{
			h->next=h1;
			h=h1;
			h1=h1->next;
		}
		else
		{
			h->next=h2;
			h=h2;
			h2=h2->next;
		}
	}
	if(h1)
		h->next=h1;
	if(h2)
		h->next=h2;
	printlist(h);
	return c;
}

//链表转置
LinkList zhuanzhilinklist(LinkList l)
{
	LinkList p,q,r;
	p=l->next;
	q=NULL;
	while(p)
	{
		r=p->next;
		p->next=q;
		q=p;
		p=r;
	}
	l->next=q;
	return l;
}

//排序
LinkList sortlist(LinkList l)
{
	if(!l->next||!l->next->next)
		return;
	LinkList p,h,t;
	p=l->next->next;
	l->next->next=NULL;
	
	while(p)
	{
		h=p->next;
		t=l;
		while(t->next&&p->data>t->next->data)
			t=t->next;
		p->next=t->next;
		t->next=p;
		p=h;
	}
	return l;
}

//删除链表中重复的元素
LinkList shanchongfu(LinkList l)
{
	LinkList p,q,r;
	p=l->next;
	if(!p) return NULL;
	while(p)
	{
		q=p;
		while(q->next)
		{
			if(q->next->data==p->data)
			{
				r=q->next;
				q->next=r->next;
				free(r);
			}
			else
				q=q->next;
		}
		p=p->next;
	}
	return l;
}

int main()
{
	LinkList a,b,c;
//	LinkList p;   //打印
	LinkList s;
	int len;

	a=createlist(a);

	printlist(a);
	
	len=lengthlinklist(a);
	printf("length =%d \n",len);

	s=searchlinklist(a,3);
	printf("the third is:%d  \n",s->data);

	if(searchlinklist(a,4))
		printf("exit! \n");
	else 
		printf("not exit! \n");

	if(insertlinklist(a,3,8)==1)
	{
		printf("insert success! \n");
	}
	else
		printf("insert failed! \n");
	if(deletelinklist(a,4)==1)
	{
		printf("delete success! \n");
	}


	b=createlist(b);
	printlist(b);

	c=guibinglinklist(a,b,c);
	if(c)
		printf("guibing chenggong! \n");
	printlist(c);

	c=zhuanzhilinklist(c);
	printlist(c);

	c=sortlist(c);
	printlist(c);

	c=shanchongfu(c);
	printlist(c);
	return 0;
}

链表是一种常见的数据结构,不同编程语言实现链表基本操作的方式有所不同,以下分别介绍C语言和Python中链表基本操作。 ### C语言实现链表基本操作 在C语言中,链表基本操作包括创建链表、插入节点、删除节点和遍历链表等。以下是一个遍历链表的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct Node { int data; struct Node* pNext; } NODE, *PNODE; // 遍历链表 void traverse_list(PNODE pHead) { PNODE p = pHead->pNext; // 用指针p指向第一个结点 while (p != NULL) { printf("%-4d", p->data); p = p->pNext; } printf("\n"); } ``` 上述代码中定义了链表节点结构体,并实现了遍历链表的函数,通过遍历每个节点并输出其数据,直到链表末尾 [^1]。 ### Python实现链表基本操作 在Python中,链表操作通常通过定义节点类和相关方法来实现。以下是一个计算链表长度的示例代码: ```python # 定义链表节点类 class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next class Solution: def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode: def getLength(head: ListNode) -> int: length = 0 while head: length += 1 head = head.next return length dummy = ListNode(0, head) length = getLength(head) cur = dummy for i in range(1, length - n + 1): cur = cur.next cur.next = cur.next.next return dummy.next ``` 上述代码中定义了链表节点类,并实现了计算链表长度的功能,通过遍历链表并计数节点数量得到链表长度 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值