//2.17 2.18 单链表有无头结点的插入、删除比较
#include
#include
#include
#include
#define LIST_INIT_SIZE 20
using namespace std;
typedef int Elemtype;//用int示例
typedef struct Node
{
Elemtype data;
struct Node *next;
}Node;
typedef struct Node *LinkList;
//创建有头节点链表,尾插法
Node *createlisthead(int n)//n个节点
{
LinkList L;
LinkList p,q;//指向节点的指针p,q
int i;
srand(time(0));//初始化随机数种子
L=(LinkList )malloc(sizeof(Node));//头结点
q=L; //q要指向尾部
for(i=0;idata=rand()%1000+1;
q->next=p;
q=p;
}
q->next=NULL;
return L;
}
void print1(LinkList L)//有头结点
{
LinkList p;
printf("\nNow ,These records are:\n");
p=L->next;
if(p!=NULL)
do
{
printf("%d ",p->data);
p=p->next;
}while(p!=NULL);
cout<next;
++j;
}
if(!p||j>i) return false;
//现在p指向第i-1个结点
q=(LinkList)malloc(sizeof(Node));//生成新的结点
q->data=e;
q->next=p->next;//先接上
p->next=q;//后断开,接到新的结点上
return true;
}
bool listheaddelete(LinkList &L,int i,Elemtype &e)//含头结点
{
int j;
LinkList p,q;
p=L;
j=1;//j为计数器
while(p->next &&jnext;
++j;
}
if(!(p->next)||j>i) return false;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//创建无头节点链表,尾插法
Node *creat(int n)//无头结点
{
LinkList L;
LinkList p,q;//指向节点的指针p,q
int i;
srand(time(0));//初始化随机数种子
//L=(LinkList )malloc(sizeof(Node)); //头结点
//q=L; //q要指向尾部
L=(LinkList)malloc(sizeof(Node));
L->data=rand()%1000+1;
q=L;
for(i=0;idata=rand()%1000+1;
q->next=p;
q=p;
}
q->next=NULL;
return L;
}
void print2(LinkList head)//无头结点输出
{
LinkList p;
printf("\nNow ,These records are:\n");
p=head;
if(head!=NULL)
do
{
printf("%d ",p->data);
p=p->next;
}while(p!=NULL);
cout<data=e;
q->next=p;
L=q;
return true;
}
else{
i=i-1;
while(p&&jnext;
++j;
}
if(!p||j>i) return false;
//现在p指向第i-1个结点
q=(LinkList)malloc(sizeof(Node));//生成新的结点
q->data=e;
q->next=p->next;//先接上
p->next=q;//后断开,接到新的结点上
return true;
}
}
bool del(LinkList &L,int i,Elemtype &e)//无头结点
{
int j;
LinkList p,q;
p=L;
j=1;//j为计数器
if(i==1){
q=p;
p=q->next;
L=p;
e=q->data;
free(q);
return true;
}
else{
i=i-1;
while(p->next &&jnext;
++j;
}
if(!(p->next)||j>i) return false;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return true;
}
}
int main()
{
int i,e;
LinkList head1,head2;
cout<<"有头结点"<>i>>e;
if(listheadinsert(head1,i,e)){
cout<<"成功插入在"<>i;
if(listheaddelete(head1,i,e)){
cout<<"成功删除了"<>i>>e;
if(insert(head2,i,e)){
cout<<"成功插入在"<>i;
if(del(head2,i,e)){
cout<<"成功删除了"<
//2.19 删除链表中指定区间的元素
#include
#include
#include
#include
#include
#define LIST_INIT_SIZE 20
using namespace std;
typedef int Elemtype;//用int示例
typedef struct Node
{
Elemtype data;
struct Node *next;
}Node;
typedef struct Node *LinkList;
int arr[LIST_INIT_SIZE];
Node *createlist(int n)//创建链表
{
LinkList L;
LinkList p,q;//指向节点的指针p,q
int i;
//srand(time(0));//初始化随机数种子
L=(LinkList )malloc(sizeof(Node));//头结点
q=L; //q要指向尾部
for(i=0;idata=arr[i];
q->next=p;
q=p;
}
q->next=NULL;
return L;
}
void print(LinkList L)//有头结点
{
LinkList p;
printf("\nNow ,These records are:\n");
p=L->next;
if(p!=NULL)
do
{
printf("%d ",p->data);
p=p->next;
}while(p!=NULL);
cout<maxk) return false;
p=L;
prev=p;
p=p->next;
while(p&&p->datadata<=mink){
prev=p;
p=p->next;
}
else{
prev->next=p->next;
q=p;
p=p->next;
free(q);
}
}
return true;
}
//算法的时间复杂度为O(n)
int main()
{
LinkList head;
Elemtype min,max;
srand(time(0));
for(int i=0;i>min>>max;
if(listdelete_L(head,min,max)){
cout<<"操作成功"<
//2.20 删除链表中相同的元素
#include
#include
#include
#include
#include
#define LIST_INIT_SIZE 20
using namespace std;
typedef int Elemtype;//用int示例
typedef struct Node
{
Elemtype data;
struct Node *next;
}Node;
typedef struct Node *LinkList;
int arr[LIST_INIT_SIZE];
Node *createlist(int n)//创建链表
{
LinkList L;
LinkList p,q;//指向节点的指针p,q
int i;
//srand(time(0));//初始化随机数种子
L=(LinkList )malloc(sizeof(Node));//头结点
q=L; //q要指向尾部
for(i=0;idata=arr[i];
q->next=p;
q=p;
}
q->next=NULL;
return L;
}
void print(LinkList L)//有头结点
{
LinkList p;
printf("\nNow ,These records are:\n");
p=L->next;
if(p!=NULL)
do
{
printf("%d ",p->data);
p=p->next;
}while(p!=NULL);
cout<next;
while(p)
{
prev=p;
p=p->next;
if(p&&p->data==prev->data){
prev->next=p->next;
q=p;
p=p->next;
free(q);
}
}
}
//该算法的时间复杂度为O(n)
int main()
{
char c;
LinkList head;
srand(time(0));
for(int i=0;i>c;
ListDelete_LSameNode(head);
cout<<"现在的链表为 ";
print(head);
return 0;
}
//2.21 顺序表的就地逆置
#include
#include
#include
#include
#include
#define LIST_INIT_SIZE 20
using namespace std;
typedef int Elemtype;//用int示例
typedef struct
{
Elemtype data[LIST_INIT_SIZE];
int length;
}SqList;
void listoppose_sq(SqList &L)
{
int i;
Elemtype x;
for(int i=0;i>c;
listoppose_sq(stu);
cout<<"现在的线性表为";
print(stu);
return 0;
}
//2.22 单链表就地逆置
#include
#include
#include
#include
#define LIST_INIT_SIZE 20
using namespace std;
typedef int Elemtype;//用int示例
typedef struct Node
{
Elemtype data;
struct Node *next;
}Node;
typedef struct Node *LinkList;
Node *createlist(int n)//n个节点
{
LinkList L;
LinkList p,q;//指向节点的指针p,q
int i;
srand(time(0));//初始化随机数种子
L=(LinkList )malloc(sizeof(Node));//头结点
q=L; //q要指向尾部
for(i=0;idata=rand()%1000+1;
q->next=p;
q=p;
}
q->next=NULL;
return L;
}
void print(LinkList L)//有头结点
{
LinkList p;
printf("\nNow ,These records are:\n");
p=L->next;
if(p!=NULL)
do
{
printf("%d ",p->data);
p=p->next;
}while(p!=NULL);
cout<next;
L->next=NULL;
while(p)
{
q=p;
p=p->next;
q->next=L->next;
L->next=q;
}
}
int main()
{
char c;
LinkList head;
srand(time(0));
head=createlist(LIST_INIT_SIZE);
cout<<"现在的链表为 ";
print(head);
cout<>c;
ListOppose_L(head);
cout<<"现在的链表为 ";
print(head);
return 0;
}
//2.23 合并两个单链表
#include
#include
#include
#include
//#define LIST_INIT_SIZE 20
using namespace std;
typedef int Elemtype;//用int示例
typedef struct Node
{
Elemtype data;
struct Node *next;
}Node;
typedef struct Node *LinkList;
Node *createlist(int n)//n个节点
{
LinkList L;
LinkList p,q;//指向节点的指针p,q
int i;
srand(time(0));//初始化随机数种子
L=(LinkList )malloc(sizeof(Node));//头结点
q=L; //q要指向尾部
for(i=0;idata=rand()%1000+1;
q->next=p;
q=p;
}
q->next=NULL;
return L;
}
void print(LinkList L)//有头结点
{
LinkList p;
printf("\nNow ,These records are:\n");
p=L->next;
if(p!=NULL)
do
{
printf("%d ",p->data);
p=p->next;
}while(p!=NULL);
cout<next;
pb=B->next;
C=A;
while(pa&&pb)
{
qa=pa; qb=pb;
pa=pa->next; pb=pb->next;
qb->next=qa->next;
qa->next=qb;
}
if(!pa){
qb->next=pb;
}
pb=B;
free(pb);
}
int main()
{
char c;
int n,m;
LinkList head1,head2,head3;
srand(time(0));
cout<<"下面建立两个单链表,前输入他们的长度:"<>m>>n;
head1=createlist(m);
head2=createlist(n);
cout<<"现在的链表为 "<>c;
ListMerge_L(head1,head2,head3);
cout<<"合并后的链表为 ";
print(head3);
return 0;
}
//2.24 归并升序的A表和B表并转为非递增放在C表中
#include
#include
#include
#include
#include
#define LIST_INIT_SIZE 20
using namespace std;
typedef int Elemtype;//用int示例
int arr[LIST_INIT_SIZE];
typedef struct Node
{
Elemtype data;
struct Node *next;
}Node;
typedef struct Node *LinkList;
Node *createlist(int n)//创建链表
{
LinkList L;
LinkList p,q;//指向节点的指针p,q
int i;
//srand(time(0));//初始化随机数种子
L=(LinkList )malloc(sizeof(Node));//头结点
q=L; //q要指向尾部
for(i=0;idata=arr[i];
q->next=p;
q=p;
}
q->next=NULL;
return L;
}
void print(LinkList L)//有头结点
{
LinkList p;
printf("\nNow ,These records are:\n");
p=L->next;
if(p!=NULL)
do
{
printf("%d ",p->data);
p=p->next;
}while(p!=NULL);
cout<next;
pb=pb->next;
A->next=NULL;
C=A;
while(pa&&pb)
{
if(pa->datadata){
qa=pa;
pa=pa->next;
qa->next=A->next;//将当前最小节点插入A表表头
A->next=qa;
}
else{
qb=pb;
pb=pb->next;
qb->next=A->next;//将当前最小节点插入A表表头
A->next=qb;
}
}
while(pa)
{
qa=pa;
pa=pa->next;
qa->next=A->next;
A->next=qa;
}
while(pb)
{
qb=pb;
pb=pb->next;
qb->next=A->next;
A->next=qb;
}
pb=B;
free(pb);
}
int main()
{
char c;
LinkList head1,head2,head3;
srand(time(0));
for(int i=0;i>c;
ListMerge_L(head1,head2,head3);
cout<<"合并后的链表为 ";
print(head3);
return 0;
}