线性表的链接存储结构和操作实现

该博客介绍了使用C语言实现线性表的链接存储结构,并提供了初始化、获取指定位置元素、查找、修改、插入、删除等操作的详细算法。此外,还展示了如何遍历输出线性表和对线性表进行排序。在主函数中,这些操作被应用于实际的线性表操作示例。
摘要由CSDN通过智能技术生成

参考数据结构(c语言描述)徐孝凯著

头文件List.h

#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED
typedef int ElemType;
typedef struct SingleNode
{
	ElemType data;
	struct SingleNode* next;
}List;
#endif
 

线性表在链接存储下运算的算法.c

#include <stdio.h>
#include <stdlib.h>
#include "List.h"
/***************************************************************/
//初始置空线性表
/***************************************************************/
void initList(List *L,int ms)//参数L的next域为表头指针,ms参数暂且闲置不用 
{
	//L=malloc(sizeof(List)*30); 
	L->next=NULL; 
 } 
/**************************************************************/
//得到线性表中第pos个元素的值
/*************************************************************/
int getList(List* L,ElemType* item,int pos)//item带回pos参数值,成功返回1,失败返回0 
{
	List* p=L->next;
	int i=0;
	while(p!=NULL)
	{
		i++;
		if(i==pos)
		{
			break;
		}
		p=p->next;
	 } 
	if(p==NULL)
	{
		return 0;
	}
	else
	{
		*item=p->data;
		return 1;
	}
 } 
/****************************************************************/
//从线性表中查找与item值相匹配的第一个元素并有参数带回
/****************************************************************/
int findList(List* L,ElemType* item)
{
	List* p=L->next;
	while(p!=NULL)
	{
		if(p->data=*item)
		{
			break;
		}
		p=p->next;
	}
	if(p==NULL)
	{
		return 0;
	}
	*item=p->data;
	return 1;
 } 
/*****************************************************************/
//修改线性表中第一个相匹配的元素
/*****************************************************************/
int modifyList(List* L,ElemType* item,ElemType* modify)
{
	List* p=L->next;
	while(p!=NULL)
	{
		if(p->data==*item)
		{
			break;
		}
		p=p->next;
	}
	if(p==NULL)
	{
		return 0;
	}
	p->data=*modify;
	return 1;
} 
/******************************************************************/
//向线性表中给定位置插入一个元素
/******************************************************************/
int insertList(List* L,ElemType item,int pos)//向线性表中的指定位置插入一个新元素,成功返回1,失败返回0; 
{
	int i=0;
	List *r,*p,*q;
	r=malloc(sizeof(List));//储存插入节点元素 
	r->data=item;
	
	p=L->next;
	q=L;                 //把q当成替身 
	
	while(p!=NULL)
	{
		i++;
		if(i==pos)
		{
			break;
		}
	    else
		{
		   q=p;   
		   p=p->next;
	    }
	}
	if(i==pos)
	{
		r->next=p;
		q->next=r;   
		return 1;
	}
	if(pos==0||pos==i+1)
	{
		 r->next=p;
		 q->next=r;
		 return 1; 
	}
	return 0;
 } 
/********************************************************************/
//从线性表中删除一个元素 
/********************************************************************/
int deleteList(List* L,ElemType* item)
{
	List* p=L->next;
	List* q=L;
	
	while(p!=NULL)
	{
		if(p->data==*item)
		{
			break;
		}
		
		q=p;
		p=p->next;
	}
	if(p==NULL)
	{
		return 0;
	}
	q->next=p->next;
	*item=p->data;
	free(p);
	return 1;
 } 
/*************************************************/
//判断线性表是否为空
/*************************************************/
int emptyList(List* L)
{
	return L->next==NULL;
 } 
/**************************************************************/
//求出线性表长度 
/*************************************************************/
int lengthList(List* L)
{
	int n=0;
	List* p=L->next;
	while(p!=NULL)
	{
		n++;
		p=p->next;
	}
	return n;
 } 
/************************************************************/
//遍历输出线性表
/************************************************************/
void outputList(List* L)
{
	List* p=L->next;
	while(p!=NULL)
	{
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
 } 
/*************************************************************/
//按元素的值或关键字对线性表进行排序
/************************************************************/
List* sortList(List* L)
{
	List *p,*q;
	q=malloc(sizeof(List));
	initList(q,1);
	
	p=L->next;
	while(p!=NULL)
	{
		ElemType x=p->data;
		List *t=q->next,*s=q,*temp;
		while(t!=NULL&&x>=t->data)
		{
			s=t;
			t=t->next;
		}
		temp=malloc(sizeof(List));
		temp->data=x;
		
		temp->next=t;
		s->next=temp;
		
		p=p->next;
	 } 
	return q;
}
/*****************************************************************/
//清除线性表中的所有元素
/*****************************************************************/
void clearList(List* L)
{
	List *p=L->next,*q;
	while(p!=NULL)
	{
		q=p;
		p=p->next;
		free(q);
	}
	L->next=NULL;
 } 
/*******************************************************************/

主函数

#include <stdio.h>
#include <stdlib.h>
#include "List.h"
#include "线性表在链接存储下运算的算法.c" 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) 
{
	int i,yn;
	ElemType x,y;
	List bb,*L=&bb;
	List *pa;
	int a[12]={25,45,38,23,19,66,77,88,65,23,44,20};
	
	initList(L,1);
	for(i=0;i<12;i++)
	{
		insertList(L,a[i],0);
	}
	 
	printf("线性表L:\n");
	outputList(L);
	
	printf("从头开始每隔一个访问线性表L:\n");
	
	for(i=0;i<12;i+=2)
	{
		yn=getList(L,&x,i+1);
		if(yn)
		{
			printf("%d ",x);
		}
	}
	printf("\n");
	
	for(i=0;i<12;i+=3)
	{
		x=a[i];
		deleteList(L,&x);
	}
	printf("删除运算后的线性表L:\n");
	outputList(L);
	
	insertList(L,30,3);
	insertList(L,50,5);
	
	printf("再插入30和50元素后的线性表L:\n");
	outputList(L);
	 
	x=45;
	yn=findList(L,&x);
	if(yn)
	{
		printf("查找%d成功!\n",x);
	}
	else
	{
		printf("查找%d失败!\n",x);
	} 
	x=65;
	y=66;
	yn=modifyList(L,&x,&y);
	if(yn)
	{
		printf("修改%d成功!\n");
	}
	else
	{
		printf("修改%d失败!\n"); 
	}
	
	yn=emptyList(L);
	if(yn)
	{
		printf("线性表L为空!\n");
	}
	else
	{
		printf("线性表非空!\n");
	}
	pa=sortList(L);
	printf("由L得到的有序线性表:\n");
	outputList(pa);	
    clearList(L);
	clearList(pa);  
	return 0;
}

运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值