单链表的基本操作(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;
}
发布了2 篇原创文章 · 获赞 0 · 访问量 92

猜你喜欢

转载自blog.csdn.net/v02040212/article/details/104018127