数据结构单链表合并头部插入
数据结构链表合并c++代码
直接上代码应该简单明了
#include<iostream>
using namespace std;
struct Node{
int data;//数据域
struct Node* next;//next指针域
};
struct Node* creatList()//创建链表
{
struct Node* headNode = new Node;//申请内存空间
headNode->next = NULL;//头指针为空
return headNode;//返回头指针
}
struct Node* creatNode(int data)//创建节点
{
struct Node* newNode = new Node;//申请内存空间
newNode->next = NULL;//新节点下一个节点为空
newNode->data = data;//数据指针指向data参数的数据
return newNode; //返回新节点
}
int insertNode(struct Node* headNode,int data)//插入节点
{
struct Node* newNode = creatNode(data);//创建新节点 使用data参数
newNode->next = headNode->next;// 头新节点的下一个地址是原先头节点(地址),就是那个NULL
headNode->next= newNode;//头结点的下一个节点指向新节点
return 0;
}
int printList(struct Node* headNode)//打印链表数据函数
{
struct Node *p = headNode->next;//定义几个工具节点,目前指向头节点的下一个节点,当然也可以指向头节点,为了说明头节点data为空
while(p != NULL)//如果工具节点的下一个节点为NULL就说明走到头了,可以使用for循环
{
cout<<p->data<<" ";//输出该节点的数据
p = p->next;//工具节点继续往后移动
}
cout<<endl;//打印完一个链表数据回车
return 0;
}
int mergeList(struct Node*List1,struct Node* List2)//链表合并
{
struct Node *pt;//工具节点pt
pt = List1;//pt指向传递参数List1(首地址,指针特性)
while(pt->next != NULL)
{
pt = pt->next;
}//将工具节点移动到最后一个节点
//for (struct Node *p = List1;p->next != NULL;p = p->next);
pt->next = List2->next; //参数List2链表的头一个链表的下一个地址是List1的下一个地址,将两个链表头尾相连
//delete(List2);//释放空间
}
int insert(struct Node *headNode,int n)//输入插入数据参数为 头指针 插入数据数量
{
int temp,a[n];//临时整形数据temp(用与数组数据前后颠倒)
for (int i = 0;i < n;i++)
{
cin>>a[i];
}//将数据输入到a数组
for (int i = 0,j = n -1;i < j;i++,j--)
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}//数组数据前后颠倒,因为方法是从头部插入数据,数据方向是相反的
for (int i = 0;i < n;i++)
{
insertNode(headNode,a[i]);//参数 headnode 还有int型的data就是数组内的元素
}
return 0;
}
int main()
{
struct Node* list1 = creatList();//直接创建list1链表
/*int a[4] = {1,2,3,4};
insertNode(list1,a[3]);
insertNode(list1,a[2]);
insertNode(list1,a[1]);
insertNode(list1,a[0]);*///静态输入list1
//printf("输出第一个链表的数据:");//如果不输出说明printList函数有错误
int n1;
cout<<"请输入第一个链表数据的个数:" ;
cin>>n1;
cout<<"请输入第一个链表的数据(用空格隔开):";
insert(list1,n1);
printList(list1);
struct Node* list2 = creatList();
/*insertNode(list2,8);
insertNode(list2,7);
insertNode(list2,6);
insertNode(list2,5);*/
//printf("输出第二个链表的数据:");
int n2;
cout<<"请输入第二个链表的数据个数:" ;
cin>>n2;
cout<<"请输入第二个链表的数据(用空格隔开):";
insert(list2,n2);
printList(list2);
mergeList(list1,list2);//合并
//printf("输出合并链表后的数据:");//如果不输出说明mergeList函数有错误
printList(list1);
cout<<"hehe"<<endl;
return 0;//结束
}