链表

线性表

线性表是由同类数据元素构成的有序序列的线性结构。它可以有两种方法进行存储,一种是数组,一种是链表。
这里主要说明一下用链表如何操作数据。

一、利用尾插法进行数据的插入

1、首先建立头节点(头节点不存放数据),并让头结点指向NULL。然后将尾指针r指向链表头节点进行标记,完成第一个节点的插入,此时r->next 代表的是头节点的指针域。
2、在插入第二个节点数据时,需要用r->next = node 将r节点指针指向要插入的数据的地址。插入完成后,再用r = node将r节点指向新插入的节点,标记尾节点的位置,完成第二个节点的插入。最后将r指针指向NULL,完成尾插法插入操作。

#include<stdio.h>
#include<stdlib.h>
typedef struct node{
	int data;
	struct node *next;
}Lnode,*List;
//链表的读入及输出 
int main()
{
	int n;
	printf("请输入数据总数\n");
	scanf("%d",&n);
	List head=(List)malloc(sizeof(struct node));
	head->next=NULL;
	List r=head;
	for(int i=0;i<n;i++)
	{
		printf("请输入数值\n");
		List node=(List)malloc(sizeof(struct node));
		scanf("%d",&node->data);
		r->next=node;  // 尾插法 
		r=node;
	}
	r->next=NULL;
	List temp=head;
	while(temp->next!=NULL)
	{
		temp=temp->next;
		printf("%d ",temp->data);
	}
	return 0;
}
二、利用头插法法进行数据的插入

头插法,比尾插法简单些,就是插入后数据会倒过来。

#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct node{
	int data;
	struct node *next;
}Lnode,*List;

int main()
{
	int n;
	cout<<"输入数据总数";
	cin>>n;
	List head = (List)malloc(sizeof(Lnode));   //头节点没有数据存放 
	head->next = NULL;   //头指针 
	cout<<"输入数值"<<endl;
	for(int i = 0; i < n; i++){	
		List node = (List)malloc(sizeof(Lnode));
		cin>>node->data;   //为新节点的数据赋值 
		node->next = head->next;   // 新节点的下一个节点指向原来头节点的下一个节点 
		head->next = node;   //头节点的下一个节点指向新插入的节点 
	}
	List temp = head;
	while(head->next!=NULL){
		temp = temp->next;
		cout<<temp->data;
	}
	return 0; 
		 
} 
三、将两个有序链表的合并
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
	int data;
	struct node *next;
}Lnode,*List;

List read()
{
	int n;
	scanf("%d",&n);
	List head=(List)malloc(sizeof(struct node));
	head->next=NULL;
	List r=head;
	for(int i=0;i<n;i++)
	{
		List p=(List)malloc(sizeof(struct node));
		scanf("%d",&p->data);
		r->next=p;
		r=p;
	}
	r->next=NULL;
	return head;
}

List Merge(List L1,List L2)
{
	List pa,pb,pc,L;
	L=(List)malloc(sizeof(struct node));
	pa=L1->next;
	pb=L2->next;
	pc=L;  //L头节点一直不变 
	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;
	if(pa) pc->next = pa;
	else pc->next = pb;
	return L;
}
void print(List L)
{
	List r=L;
	while(r->next!=NULL){
		r=r->next;
		printf("%d ",r->data);
	}
}

int main()
{
	List L1,L2,L;
	L1=read();
	L2=read();
	L=Merge(L1,L2);
	print(L);

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值