线性表
线性表是由同类数据元素构成的有序序列的线性结构。它可以有两种方法进行存储,一种是数组,一种是链表。
这里主要说明一下用链表如何操作数据。
一、利用尾插法进行数据的插入
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;
}