数据结构线性表链序存储,线性存储c语言实现代码

typedf用法:https://blog.csdn.net/qq_29350001/article/details/53883571

#include<stdio.h>
#include<stdlib.h>
typedef int ElementType;
typedef struct LNode * PtrToLNode;
struct LNode{	
	ElementType Data;
	PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List; 
List MakeEmpty()//初始化
{
	List L;	
	L = (List)malloc(sizeof (struct LNode));
	if (!L)	
		exit (-1);	
	L->Next = NULL;	
	return L;
}

int FindKth(List L,int K)//根据指定的位序查找
{
	Position p;	
	int cnt = 1;//位序从1开始 	
	p = L->Next; 	
	while(p&&cnt<K)
	{		
		p = p-> Next;
		cnt++;
	}	
		if((cnt==K)&&p)
			printf("您查找的数为:%d\n",p -> Data);
		else printf("您查找数不存在");
} 
Position Find(List L,int X)//按值查找 
{
	Position p;	
	p = L->Next; 
	while(p&&p->Data!=X)
	{
		p = p-> Next;
	}	
	if(p) 
	printf("查找成功,您查找的数为:%d\n",p->Data);
	else 
	printf("您查找数不存在");
} 
List Insert(List L ,ElementType X,int i)//插入
{
	Position tmp,pre;
	int cnt =0 ;
	pre = L;
	while(pre&&cnt<i-1)
	{
		pre = pre->Next;
			cnt++;
	}
	if(pre==NULL||cnt!=i-1)
	{
		printf("插入位置参数错误\n");	
	}	
	else
	{
		tmp = (Position)malloc(sizeof(struct LNode));
		tmp->Data=X;
		tmp->Next=pre->Next;
		pre->Next=tmp;	
	}
	} 
bool Delete(List L,int i){ //删除
	Position tmp,pre;
	int cnt = 0;
	pre = L;
	while(pre&&cnt<i-1)
	{
		pre=pre->Next;
		cnt++;
	}	
	if(pre==NULL||cnt!=i-1||pre->Next==NULL){
		printf("删除位置参数错误");	
	}	
	else
	{
		tmp = p re->Next;
		pre->Next = tmp->Next;
		free(tmp);
		printf("删除成功");
		}
}
int Length(List L){	 //求表长
	Position p;	
	int cnt = 0;
	p = L->Next;//p指向表的第一个结点 
	while(p)
	{
		p = p -> Next; 
		cnt++;//当前指向第cnt个节点 
	}
		return cnt;
}  
void DisLinkList(List L){ //输出 
	List p = L->Next;
	printf("输出链表: ");
	while (p)	
	{
		printf("%d ", p->Data);
		p = p->Ne xt;
	}
} 
int main()
{	
	Position pre;
	Position L = MakeEmpty();
	pre = L;
	int i,n,x,len,cz,del;		
	printf("您要输入几位数:"); 
	scanf("%d",&n);	
	for(i=1;i<=n;i++) 
	{
			scanf("%d",&x);
			Insert(pre,x,i);//插入
	}	

	DisLinkList(pre);	//输出 	
	printf("\n");		
	len = Length(L);//求表长 
	printf("表长为:%d",len);	
	printf("\n");
	int l;	
	printf("输入插入的数");
	scanf("%d",&l);
	Insert(pre,l,n+1);
	DisLinkList(pre); 
	printf("请输入你要按值查找的数:\n");	
	scanf("%d",&cz);//按值查找		
	Find(L,cz);	
	printf("\n");	
	printf("请输入你要按序号查找的数的序号:\n");	
	scanf("%d",&cz);	
	FindKth(L,cz);		//按序号查找
	printf("\n");		
	printf("请输入你要删除的数的下标:\n",del);	
	scanf("%d",&del);	
	Delete(L,del);	//删除
	DisLinkList(pre);//输出	
	printf("\n");	
	return 0;
}
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10
typedef int Position;
typedef int ElementType;
typedef struct LNode * PtrToLNode;
struct LNode//将数组Date和变量Last封装成一个结构体作为顺序表的类型; 
{	
	ElementType Data[MAXSIZE];
	Position Last;
};

typedef PtrToLNode List;

List MakeEmpty()//建表 
{	List L;	
	L = (List)malloc(sizeof (struct LNode));//动态分配表结构所需要的存储空间; 
	L->Last = -1;	//Last指针置为1,表示表中没有数据 
	return L;
} 
#define ERROR -1

Position Find(List L,ElementType X)//查找
{
	Position i = 0;	
	while(i<=L->Last&&L->Data[i]!=X)//从第一个元素起依次与x比较直到相等后输出下标 
	{		i++;
	}	
	if(i>L->Last) //若到最后还没有找到,输出语句  
	printf("您查找的数不存在\n");	
	else printf("您查找数的存储下标为:%d",i);
} 

Insert(List L ,ElementType X,int i)//插入
{	Position j;	 	
	if(L -> Last == MAXSIZE-1)//表空间已满,不能插入
	{	
		printf("表满");		
		return false;	
	}
	if(i<1||i>L->Last+2)//检查插入位序的合法性:是否在1~n+1
	{		
		printf("位序不合法");	
		return false;	
	} 	
	for(j=L->Last;j>=i-1;j--)//插入 
	{		
		L->Data[j+1] = L-> Data[j];
	}	
		L->Data[i-1] = X;
		L->Last++;	
		return true;
} 
Delete(List L,int i) //删除
{	
	Position j;	
	if(i<1||i>L->Last+1)//表中没有元素 
	{
		printf("位序%d不存在元素\n",i);
	}	
	else
	{		
		for(j=i;j<=L->Last;j++)
		{	L->Data[j] = L->Data[j+1];
		}		
		L->Last--;
		printf("删除成功\n");
	}	
}  
int Length(List L)//求表长
{	
	return L->Last+1; 
}  
int main()
{	
	List L = MakeEmpty();	
	int i,n,x,len,cz,del;	
	double res;	//插入 	
	printf("您要输入几位数:"); 	
	scanf("%d",&n);	
	for(i=1;i<=n;i++)
	{		
		scanf("%d",&x);		
		Insert(L,x,i);	
	}	//输出 	
	printf("输出线性表:\n");	
	for(i=0;i<n;i++)
	{		
		printf("%d ",L->Data[i]);	
	}	
	printf("\n");	//求表长 	
	len = Length(L);	
	printf("表长为:%d",len);	
	printf("\n");	//查找	
	printf("请输入你要查找的数:\n");	
	scanf("%d",&cz);	
	Find(L,cz);	
	printf("\n");	//删除	
	printf("请输入你要删除的数的下标:\n",del);	
	scanf("%d",&del);	
	Delete(L,del);	
	printf("输出线性表:\n");	
	for(i=0;i<=L->Last;i++)
	{	
		printf("%d ",L->Data[i]);	
	}	
	printf("\n");	
	return 0;
}

来源:陈越《数据结构》第二版