【数据结构】单链表的创建、插入、删除及合并

定义一个链表结构的带头结点的结构体

typedef struct lst{
    int data;
    struct lst *next;
} LNode,*LinkList;

本文解决以下问题:

1、编写函数,创建一个带头结点的单链表(数据自拟);

2、编写函数,在单链表的指定位置插入一个元素;

3、编写函数,在单链表的指定位置删除一个元素;

4、编写函数,将两个有序链表合并成一个新的有序链表;

一、各函数代码如下:

写在前面:由于题目要求无法将链表内的元素显示在控制台上,故预先造一个遍历链表中所含元素的函数——

void myprint(LNode *head)//显示单链表中各数据,以实现用户交互

 

编写函数,创建一个带头结点的单链表(数据自拟);

LNode *mycreat()//创建单链表
{
	int m=0;
	LNode *head=NULL,*p=NULL,*q=NULL;
	head=new LNode;	//定义头指针并分配内存 
	q=head;
	cout<<"Wonder creating a new list,please input (int)data:(End with -1)"<<endl;
	cin>>m;
	while(m!=-1){
		p=new LNode;	//开辟一个新的内存 
		q->next=p;		//单链表的首元结点指向该地址 
		p->data=m;
		q=p;
		cin>>m;
	}
	q->next=NULL;
	return head;
}

编写函数,在单链表的指定位置插入一个元素;

void myinsert(LNode *head,int i,int m)//插入,i为插入位置,m为待插入元素 
{
	LNode *p=NULL,*s=NULL;
	int j=0;
	p=head;
	while(p!=NULL)
	if(p&&(j<i-1)){
		p=p->next;
        j++;
	}
	else break;
    s=new LNode;
	s->data=m;
	s->next=p->next;
	p->next=s;
}

编写函数,在单链表的指定位置删除一个元素;

int mydelete(LNode *head,int i)//删除
{
	LNode *p=NULL,*q=NULL;
	int j=0;
	p=head;
	while(p!=NULL){
		if((p->next)&&(j<i-1)){
			p=p->next;
			j++;
		}else break;
	}
	if(!(p->next)||(j>i-1))
	   return 0;
	q=p->next;
	p->next=q->next;
	delete q;
	return 1;
}

编写函数,将两个有序链表合并成一个新的有序链表;

                                ↑            ↑                        ↑

再次审题,我们可以看到本题的条件是给出的两个有序链表,考虑到用户输入的链表元素无规则性,我们在“合并”操作前,还需将两个链表进行“排序”~QAQ

void mysort(LNode *head)//排序 
{
	LNode *p=NULL,*q=NULL,*r=NULL,*t=NULL;
	int flag = 1;
	while(flag){
		p = head;
		q = head->next;
		flag = 0;
		while(q != NULL){
			r = q->next;
			if(r == NULL){
				break;
			}else if(q->data > r->data){
				t = r->next;
				q->next = t;
				r->next = q;
				p->next = r;
				p = r;
				q = p->next;
				r = q->next;
				flag = 1;
			}else{
				p = q;
				q = p->next;
			}
		}
	}
}
LNode *MergerLinklist(LNode *L0,LNode *L1,LNode *L2)//有序单链表的合并,生成一个有序的单链表
{
	LNode *pa=NULL,*pb=NULL,*pc=NULL,*p=NULL;
	p=L2;
	pa=L0->next;pb=L1->next;
	L2=pc=L0;
	while(pa&&pb){
		if(pa->data <= pb->data){
			pc->next=pa;
			pc=pa;
			pa=pa->next;
		}
		else{
			pc->next=pb;
			pc=pb;
			pb=pb->next;
		}
	}
	pc->next=pa?pa:pb;
	delete L1;
	cout<<"after mixing the two lists:";
	p=L0->next;
	while(p){
		printf("%5d",p->data);
		p=p->next;
	}
	cout<<endl;
}

二、完整代码(含各函数及main)

#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct lst{
    int data;
    struct lst *next;
} LNode,*LinkList;
LNode *mycreat();//创建单链表
void myinsert(LNode *head,int i,int m);//插入
int mydelete(LNode *head,int i);//删除
void mysort(LNode *head);//排序
LNode *MergerLinklist(LNode *L0,LNode *L1,LNode *L2);//有序单链表的合并,生成一个有序的单链表
void myprint(LNode *head);//显示单链表中各数据,以实现用户交互 
int main(void)
{
	LNode *head=NULL,*nhead=NULL;
	int k=0,i=0,m=0,j=0;
	head=mycreat();
	printf("new list:");
	myprint(head);
    cout<<"Want to insert list,please input place:";
	cin>>i;
	cout<<"please input insert data:";
	cin>>m;
	myinsert(head,i,m);
	printf("after inserting:");
	myprint(head);
	cout<<"Want to delete list,please input place:";
	cin>>i;
	k=mydelete(head,i);
	if(k==1){
        cout<<"after deleting:";
        myprint(head);
    }
    else {	
		cout<<"not exist!"<<endl<<"Please reput again!";
    }
    mysort(head);
    cout<<"Sorting the list..."<<endl<<"after that,show the list:";
    myprint(head);
    cout<<endl<<"Plum blooms again!!!"<<endl;
    nhead=mycreat();
    printf("new list:");
	myprint(nhead);
	cout<<"after sorting:";
	mysort(nhead);
	myprint(nhead);
	LNode *mhead;
    MergerLinklist(head,nhead,mhead);
	return 0;
}
LNode *mycreat()//创建单链表
{
	int m=0;
	LNode *head=NULL,*p=NULL,*q=NULL;
	head=new LNode;	//定义头指针并分配内存 
	q=head;
	cout<<"Wonder creating a new list,please input (int)data:(End with -1)"<<endl;
	cin>>m;
	while(m!=-1){
		p=new LNode;	//开辟一个新的内存 
		q->next=p;		//单链表的首元结点指向该地址 
		p->data=m;
		q=p;
		cin>>m;
	}
	q->next=NULL;
	return head;
}
void myinsert(LNode *head,int i,int m)//插入,i为插入位置,m为待插入元素 
{
	LNode *p=NULL,*s=NULL;
	int j=0;
	p=head;
	while(p!=NULL)
	if(p&&(j<i-1)){
		p=p->next;
        j++;
	}
	else break;
    s=new LNode;
	s->data=m;
	s->next=p->next;
	p->next=s;
}
int mydelete(LNode *head,int i)//删除
{
	LNode *p=NULL,*q=NULL;
	int j=0;
	p=head;
	while(p!=NULL){
		if((p->next)&&(j<i-1)){
			p=p->next;
			j++;
		}else break;
	}
	if(!(p->next)||(j>i-1))
	   return 0;
	q=p->next;
	p->next=q->next;
	delete q;
	return 1;
}
void mysort(LNode *head)//排序 
{
	LNode *p=NULL,*q=NULL,*r=NULL,*t=NULL;
	int flag = 1;
	while(flag){
		p = head;
		q = head->next;
		flag = 0;
		while(q != NULL){
			r = q->next;
			if(r == NULL){
				break;
			}else if(q->data > r->data){
				t = r->next;
				q->next = t;
				r->next = q;
				p->next = r;
				p = r;
				q = p->next;
				r = q->next;
				flag = 1;
			}else{
				p = q;
				q = p->next;
			}
		}
	}
}
LNode *MergerLinklist(LNode *L0,LNode *L1,LNode *L2)//有序单链表的合并,生成一个有序的单链表
{
	LNode *pa=NULL,*pb=NULL,*pc=NULL,*p=NULL;
	p=L2;
	pa=L0->next;pb=L1->next;
	L2=pc=L0;
	while(pa&&pb){
		if(pa->data <= pb->data){
			pc->next=pa;
			pc=pa;
			pa=pa->next;
		}
		else{
			pc->next=pb;
			pc=pb;
			pb=pb->next;
		}
	}
	pc->next=pa?pa:pb;
	delete L1;
	cout<<"after mixing the two lists:";
	p=L0->next;
	while(p){
		printf("%5d",p->data);
		p=p->next;
	}
	cout<<endl;
}
void myprint(LNode *head)//显示单链表中各数据,以实现用户交互
{
	LNode *p=NULL;
	p=head->next;
    if(p==NULL)
	cout<<"empty list!";
	else
	do{	
        printf("%5d",p->data);
		p=p->next;
	}while(p!=NULL);
	cout<<endl;
}

执行效果如下:

分享完毕~

欢迎小伙伴们在文下评论和私信喔~