单链表的基本操作(c语言)

单链表的基本操作

解释说明

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。这组存储单元可以是连续的,也可以是不连续的。链表中的数据是以结点来表示的,一个结点包含数据域data和指针域next,数据域用来存储结点的值,指针域用来存储数据域的直接后继的地址,单链表结点的而结构如下图:

Alt

代码展示

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

typedef struct node
{
	int data;
	struct node *next;
}LNode;
//创建单链表
LNode *CreatLinkList()
{
	int i,value,len;
	LNode *head=(LNode *)malloc(sizeof(LNode));
	LNode *p,*q;
	head->next=NULL;
	p=head;
	printf("输入单链表初始的长度:");
	scanf("%d",&len);
	for (i=0;i<len;i++) {
		printf("请输入第%d个节点的值:",i+1);
		scanf("%d",&value);
		q=(LNode *)malloc(sizeof(LNode));
		q->data=value;
		q->next=NULL;
		p->next=q;
		p=p->next;
	}
	
	return head;
} 
//遍历单链表
void Trave_LinkList(LNode *head)
{
	LNode *p=head->next;
	while (p!=NULL) {
		printf("%d ",p->data);
		p=p->next;        //你要往循环终止的方向走 
	}	
	printf("\n");
} 
//查找位置,返回指针
LNode *Loc_LinkList(LNode *head,int index)
{
	int i=0;
	LNode *p=head->next;

	if (p!=NULL) {
		for (i=1;i<index;i++) {
			p=p->next;
		}
	}
	
	return p; 
} 
//插入元素
void Insert_LinkList(LNode *head,int index,int x)
{
	LNode *p=Loc_LinkList(head,index-1);
	LNode *q,*pNew;

	if (p==NULL) {
		printf("第%d个位置不存在!",index);
	} else {
		q=p->next;
		pNew=(LNode *)malloc(sizeof(LNode));//一定要为新节点分配空间 
		pNew->data=x;
		pNew->next=q;
		p->next=pNew;
	}
}
//删除元素
int Delet_LinkList(LNode *head,int index)
{
	int x; 
	LNode *p=Loc_LinkList(head,index-1);
	LNode *q;

	if (p==NULL) {
		printf("第%d个位置不存在!",index-1);
	} else if(p->next==NULL) {
		printf("第%d个节点不存在!\n",index);
	} else {
		q=p->next;
		x=q->data;
		p->next=q->next;
		free(q);
	}
	
	return x;
} 
//查找指定位置上的值并修改
void Select_LinkList(LNode *head,int index)
{
	int x;
	LNode *p=Loc_LinkList(head,index);
	if (p==NULL) {
		printf("指定位置不存在!\n");
		return;
	} else {
		printf("第%d个位置上的值是:%d\n",index,p->data);
		printf("请输入要修改的值:");
		scanf("%d",&x);
		p->data=x;
	}
} 
//求链表的长度
int Lenth_LinkList(LNode *head)
{
	int len=0;
	LNode *p=head->next;
	while (p!=NULL) {
		len++;
		p=p->next;
	}
	
	return len;
}
//链表排序(冒泡排序) 
void Sort_LinkList(LNode *head)
{
	int i,j,temp;
	LNode *p;
	LNode *q;
	int len=Lenth_LinkList(head);
	
	for (i=0,p=head->next;i<len;i++,p=p->next) {
		for (j=i+1,q=p->next;j<len-i;j++,q=q->next) {
			if (p->data>q->data) {
				temp=p->data;
				p->data=q->data;
				q->data=temp;
			}
		}
	}
} 
//查找值返回指定位置 
int Get_LinkList(LNode *head,int x)
{
	LNode *p=head->next;
	int index=1;
	while (p!=NULL&&p->data!=NULL) {//当p与指定值不等时就循环
		p=p->next;
		index++;
	}
	
	return index;
}
//元素的逆序
LNode *Rever_LinkList(LNode *head)//逆序链表
{
    LNode *p1,*p2,*p3;
    if(head==NULL||head->next==NULL) {
    	return head;
	}

    p2=head;                 //指向第一个节点
    p1=head->next;                   //指向第二个节点
    head->next=NULL;                 //第一个节点后继置空
    while(p1!=NULL)
    {
        p3=p2;                     //p3指向p2位置
        p2=p1;                     //p2指向p1位置
        p1=p1->next;               //p1指向下一个节点
        p2->next=p3;               //逆序节点
    }
    head=p2;                      //头指针指向逆序后的第一个节点
    
    return head;
}

int main()
{
	int index,x,i;
	
	printf("创建单链表:\n");
	LNode *head=CreatLinkList();
	printf("创建的单链表为:\n");
	Trave_LinkList(head);
	
	int run=1;
	while (run==1) {
		printf("1.插入元素\n2.删除元素\n3.修改元素的值\n4.链表长度\n5.链表排序\n6.链表查找\n7.链表逆序\n");
		printf("请输入操作:");	
		scanf("%d",&i);
		switch (i) {
			case 1: printf("请输入插入的位置和插入的元素:");
					scanf("%d %d",&index,&x);
					Insert_LinkList(head,index,x);
					Trave_LinkList(head);
					break;
			case 2: printf("请输入删除的位置:");
					scanf("%d",&index);
					printf("删除的值为:%d\n",Delet_LinkList(head,index));
					Trave_LinkList(head);
					break;	
			case 3: printf("修改指定位置上的值,请输入位置:");
					scanf("%d",&index);
					Select_LinkList(head,index);
					Trave_LinkList(head);
					break;
			case 4:	printf("单链表的长度为:%d\n",Lenth_LinkList(head));
					break;
			case 5:	printf("对单链表进行排序后的结果为:");
					Sort_LinkList(head);
					Trave_LinkList(head);
					break;
			case 6: Trave_LinkList(head);
				   	printf("输入要查找的值:");
				   	scanf("%d",&x);
				    if (Get_LinkList(head,x)==(Lenth_LinkList(head)+1)) {
						 printf("该值不在链表中!\n"); 
				    } else {
						 printf("%d位于第%d个位置上\n",x,Get_LinkList(head,x));
				    }
				    break;		
			case 7: printf("逆序单链表:");
					head=Rever_LinkList(head);
					Trave_LinkList(head);
					break;				
		}
		printf("输入1继续,other结束:");
		scanf("%d",&run);
	} 
	
	return 0;
}
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单链表是一种常见的数据结构,用于存储一系列的元素。在C语言,可以通过定义一个结构体来表示单链表的节点,每个节点包含一个数据和一个指针,指向下一个节点。 首先,我们需要定义单链表的节点结构体: ```c struct ListNode { int data; // 数据 struct ListNode* next; // 指针,指向下一个节点 }; ``` 接下来,我们可以实现一些基本操作,比如创建单链表插入节点、删除节点和遍历单链表等。 创建单链表的函数如下所示,可以根据给定的数组创建一个单链表: ```c struct ListNode* createLinkedList(int arr[], int size) { struct ListNode* head = NULL; // 头节点指针 struct ListNode* tail = NULL; // 尾节点指针 for (int i = 0; i < size; i++) { struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode)); newNode->data = arr[i]; newNode->next = NULL; if (head == NULL) { head = newNode; tail = newNode; } else { tail->next = newNode; tail = newNode; } } return head; } ``` 插入节点的函数如下所示,可以在指定位置插入一个新节点: ```c void insertNode(struct ListNode** head, int data, int position) { struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode)); newNode->data = data; newNode->next = NULL; // 插入到链表头部 if (position == 0) { newNode->next = *head; *head = newNode; return; } struct ListNode* curr = *head; struct ListNode* prev = NULL; int count = 0; // 找到插入位置的前一个节点 while (curr != NULL && count < position) { prev = curr; curr = curr->next; count++; } // 插入到链表间或尾部 if (curr != NULL) { newNode->next = curr; } prev->next = newNode; } ``` 删除节点的函数如下所示,可以删除指定位置的节点: ```c void deleteNode(struct ListNode** head, int position) { if (*head == NULL) { return; } struct ListNode* curr = *head; struct ListNode* prev = NULL; int count = 0; // 找到要删除的节点 while (curr != NULL && count < position) { prev = curr; curr = curr->next; count++; } // 删除头节点 if (prev == NULL) { *head = curr->next; } else { prev->next = curr->next; } free(curr); } ``` 遍历单链表的函数如下所示,可以将单链表元素依次输出: ```c void traverseLinkedList(struct ListNode* head) { struct ListNode* curr = head; while (curr != NULL) { printf("%d ", curr->data); curr = curr->next; } } ``` 以上是单链表基本操作实现,你可以根据需要调用这些函数进行单链表操作

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值