线性表的链式存储

下面的代码完成的算法有:

  1. 建立空表
  2. 初始化一个任意长度的链表(尾插法)
  3. 查找
  4. 插入
  5. 删除

一开始使用的是没有前哨结点的链表来完成,也确实实现了,但是此方法表头的插入、删除操作需要另外讨论(不爽)。故使用有前哨结点的链表改了一下,代码简洁了很多。

**注意:**主函数要求你自己输入链表的各项值,9999结束输入

#include<iostream>
typedef int ElementType ;
using namespace std;

typedef struct Lnode* List;

/*请输入链表元素,9999结束输入*/ 

struct Lnode {
	ElementType data;
	List next;
	
};

List Init()
{
	List head;
	head = (List)malloc( sizeof( struct Lnode ) );//头指针及哨位结点的定义 
//	head->data = 0;
	head->next = NULL;
	return head;
}

List Create()
{
	List head,p,tail;
	head = (List)malloc( sizeof( struct Lnode ) );
	head->next = NULL;
	tail = head;
	while( 1 ){
		int x;
		cin>>x;
		if( x==9999 )
			break;
		p = (List)malloc( sizeof( struct Lnode ) );
		p->data = x;
		p->next = tail->next;
		tail->next = p;
		tail = p;
	}
	return head;
}
int Length( List ptrl )
{
	List p= ptrl;
	int i = 0;
	while( p->next ){
		p = p->next;
		i++;
	}
	return i;   
}

List Findth( List ptrl , int k )    //寻找链表第k处的值 
{
	List p = ptrl;
	int i = 0; 
	while( p!=NULL && i<k ){
		p = p->next ;
		i++;
	}
	if( p == NULL )
		return NULL;
	else
		return p;
	
}	

List Find ( List ptrl , ElementType x )
{
	List p = ptrl;
	int i = 1; 
	while( p ){
		if( p->data == x )
			break;
		p = p->next ;
	}
	if( p == NULL )
		return NULL;
	else
		return p;
}

List Insert ( List ptrl , int i , ElementType x )//在链表的第i处插入一个结点 
{
	List p,s,f;
//	if( i==1 && ptrl->next==NULL){
//		s = (List)malloc( sizeof( struct Lnode ) );
//		s->next = NULL;
//		s->data = x;
//		ptrl->next = s;
//		return s;
//	}
//	
//	if( i==1 && ptrl->next!=NULL){                                    //i==1的时候,特殊处理。 
//		s = (List)malloc( sizeof( struct Lnode ) );
//		s->next = ptrl->next;
//		s->data = x;
//		ptrl->next = s;
//		return ptrl;
//	} 
	
	p = Findth( ptrl, i-1 );
	if( p==NULL ){
		cout<<"参数"<<i<<"位置不合法"<<endl;
		return NULL;
	}else{
		s = (List)malloc( sizeof( struct Lnode ) );
		s->data = x;
		s->next = p->next;							//注意:此行与下一行不能调换顺序。 
		p->next = s;
		return ptrl;
	}
	
}

List Delete ( List ptrl, int i )                  //删除链表第i处的结点
{
	List p,s;
//	if( i == 1 ){
//		s = ptrl;
//		if( p!=NULL ){
//			p = p->next;
//		}else{
//			return NULL;
//		}
//		free( s );
//		return ptrl;
//	}
	p = Findth( ptrl, i-1 );
	if( p==NULL ||p->next==NULL ){
		cout<<"参数"<<i<<"位置不合法"<<endl;
		return NULL;
	}else{
		s = p->next;
		p->next = s->next;
		free(s);
		return ptrl;
	}
} 

void print(List ptrl)
{
	List p = ptrl->next;                //由于哨位结点的存在,从哨位结点的后一位开始为有效数据 
	if( p==NULL ){
		cout<<"此表为空"<<endl; 
	}else{
		while( p!=NULL ){
			cout<<p->data<<endl;
			p = p->next;
		}
	}
	
}
int main()
{
	List list1 = Init();
	List list2 = Create();
	print(list1);
	print(list2);
	Insert( list1, 1, 11 ); 
	Insert( list1, 2, 22 );
	Insert( list1, 3, 33 );
	Insert( list1, 4, 44 );
	cout<<Find( list1, 33)->next->data<<endl;
	
	cout<<"-----------------------"<<endl;
	cout<<Findth(list1,2)->data<<endl;
	print(list1);
	cout<<Length(list1)<<endl;
	Insert( list1, 2, 222 );
	print(list1);
	cout<<"-----------------------"<<endl;
	
	Delete(list1,1);
	print(list1);
	cout<<endl;
	Delete(list1,4);
	print(list1);
	return 0;
}

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线性表链式存储结构是使用链式方式将线性表中的元素存储起来。链表可以分为单链表、循环链表和双链表。在单链表中,每个结点都包含指向下一个结点的指针。循环链表是在单链表的基础上,将最后一个结点的指针指向头结点,形成一个循环。而双链表则是在单链表的基础上,每个结点都包含指向前一个结点和后一个结点的指针。链表的存储单元可以是连续的,也可以是非连续的,甚至是零散分布在内存的任何位置上。因此,链表中结点的逻辑顺序和物理顺序不一定相同。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [数据结构——线性表链式存储](https://blog.csdn.net/weixin_46272350/article/details/119612209)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [线性表链式存储结构..](https://download.csdn.net/download/N201871643/86035198)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值