#include<iostream>
#include<stdlib.h> 
typedef int Elemtype;
using namespace std;

typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;
//创建单向链表

void create_list(LNode *p)    //创建尾插入链表
{
	int i,n;
	LNode *s;
	cout<<"input the length of the list";
	cin>>n;
	for(i=1;i<=n;i++)
	{
		s=new LNode;
		cout<<"element:";
		cin>>s->data;
		p->next=s;
		p=s;
	}
} 

LNode *create_list(int n)   //创建头插入链表
{
	int i;
	LNode *L,*p;
	L=new LNode;
	L->next=NULL;
	for(i=n;i>=1;i--)
	{
		p=new LNode;
		cout<<"element:";
		cin>>p->data;
		p->next=L->next;
		L->next=p;
	}
	return (L);
}

void out_list(LNode *q)   //输出链表
{
	q=q->next;
	if(q==NULL)
	cout<<"Empty List!"<<endl;
	else
	{
		while(q!=NULL)
		{
			cout<<q->data;
			q=q->next;
		}
	}
	cout<<endl;
}

Elemtype GetElem(LNode *L,int i)   //查找线性链表第i个元素的值
{
	int j;
	LNode *p;
	p=L->next;
	j=1;
	while(p&&j<i)
	{
		p=p->next;
		j++;
	}
	if(!p||j>i)
	return (-1);
	else
	return (p->data);
}

void insert_L(LNode *L,int i,Elemtype e) //在带头结点的单向链表中第i个位置插入元素e
{
	LNode *p,*s;
	int j;
	p=L;
	j=1;
	while(p!=NULL&&j<i)
	{
		p=p->next;
		j++;
	}
	if(p==NULL||j>i)
	cout<<"ERROR!"<<endl;
	else
	{
		s=new LNode;
		s->data=e;
		s->next=p->next;  //
		p->next=s;        //如果这两句交换就不行
	}
}

Elemtype delete_list(LNode *L,int i)  //删除带头结点的单向链表的第i个元素
{
	LNode *p,*q;
	int j;
	Elemtype e;
	p=L;
	while(p->next!=NULL&&j<i)
	{
		p=p->next;
		j++;
	}
	if(p->next==NULL||j>i)
	cout<<"ERROR!"<<endl;
	else
	{
		q=p->next;
		e=q->data;
		p->next=q->next;
		delete(q);    //释放动态开辟空间
		return(e);
	}
}

void listdelete_L(LNode *L,Elemtype x) //在单向链表中查找x的值,并且删除它(假设链表元素值不重复)
{
	LNode *p,*q;
	p=L;
	while(p->next&&p->next->data!=x)  //找x的前驱
		p=p->next;
	if(!p->next)
	cout<<"Not find element"<<endl;
	else
	{
		q=p->next;
		p->next=q->next;
		delete(q);
	} 
}

LNode *merge_list(LNode *La,LNode *Lb)  //合并链表
{
	LNode *Lc,*pa,*pb,*pc;
	Lc=La;
	pc=La;
	pa=La->next;
	pb=Lb->next;
	while(pa!=NULL && pb!=NULL)
	{
		if(pa->data<=pb->data)
		{
			pc->next=pa;
			pc=pa;
			pa=pa->next;
		}
		else
		{
			pc->next=pb;
			pc=pb;
			pb=pb->next;
		}
	}
	if(pa!=NULL)
	pc->next=pa;
	else
	pc->next=pb;
	delete(Lb);        //释放动态开辟空间
	return(Lc);
}

//查找 删除 合并等对单向链表的操作,指针必须指向所找结点的前一个结点

int main()
{
//	LNode *p,s;
//	p=(LNode*)malloc(sizeof(LNode));
//	free(p);
//	LNode *head;             
//	head=new LNode;          
//	head->next=NULL;		 
//	create_list(head);
	
//	LNode *head;
//	head=create_list(5);
//	out_list(head);   
//	delete(head);
    return 0;
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论