/*
针对单向链表的一些基本操作
*/
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int
data;
struct
node*next;
}ElemSN;
#include"标头.h"
int main()
{
int
a[]={9,9,9,8};
int
a_length=sizeof(a)/sizeof(a[0]);
ElemSN*Head,*p;
//正向创建链表
Head=Creat_Link(a,a_length);
//逆向创建链表
/*
Head=Creat_Link_Inv(a,a_length);
*/
//输出链表
Print_Link(Head);
//查找链表最后一个节点的值
/*
p=Find_Last_Node(Head);
printf("这个链表最后一个节点的值是%d\n",p->data);
*/
//统计链表节点的个数
/*
int
cnt;
cnt=Count_Node(Head);
printf("这个链表总共有%d个节点\n",cnt);
*/
//统计单向链表中奇数节点的个数
/*
int
cnt;
cnt=Count_Odd_Node(Head);
printf("这个链表总共有%d个奇数节点\n",cnt);
*/
//输出单向链表最大值节点
/*
Print_Max_Node(Head);
*/
//逆向输出单向链表数据域的值
/*
Print_Link_Inv(Head);
*/
//查找数据域中节点值为Key的节点
/*
int
Key;
printf("请输入你要查询的关键字Key:");
scanf("%d",&Key);
p=Find_Key_Node_(Head,Key);
*/
//删除链表中的某个节点,假设是第K个节点
/*
int
K;
printf("请输入你要删除的第K个节点的值:");
scanf("%d",&K);
if(K>=1&&K<=Count_Node(Head)){
Head=Del_Key_Node_K(Head,K);
Print_Link(Head);
}
else
printf("您的输入有错误\n");
*/
//删除链表中的关键字
/*
int
Key;
printf("请输入你要删除的值Key");
scanf("%d",&Key);
Head=Del_Key_Node(Head,Key);
Print_Link(Head);
*/
//删除链表中若干个重复的关键字
/*
int
Key;
printf("请输入你要删除的重复值关键字Key");
scanf("%d",&Key);
Head=Del_Key_Node_RE(Head,Key);
Print_Link(Head);
*/
//逆置链表
/*
分别利用尾插和头插的方法来逆置链表
*/
/*
Head=_Inv_Link(Head);
Print_Link(Head);
*/
//将两个链表相加求出和链表
/*
int
b[]={9,8,7,5,8,7,2};
int
b_length=sizeof(b)/sizeof(b[0]);
ElemSN*Head_b;
Head_b=Creat_Link(b,b_length);
Print_Link(Head_b);
Head=Add_Head_And_Head_b(Head,Head_b);
Print_Link(Head);
*/
//将一个链表转化成数字
/*
int
num=Convert_Link_to_Num(Head);
printf("这个链表所代表的数字是%d\n",num);
*/
//回文链表的判断
link_inv(Head);
}
#ifndef __LIANXIONE_H__
#define __LIANXIONE_H__
//正向创建链表
/*
利用尾插法来正向创建链表
*/
ElemSN*Creat_Link(int a[],int a_length)
{
ElemSN*p,*Head=NULL,*Tail;
for(int
i=0;i<a_length;i++){
p=(ElemSN*)malloc(sizeof(ElemSN));
p->data=a[i];
p->next=NULL;
if(!Head){
Head=Tail=p;
}
else{
Tail=Tail->next=p;
}
}
return
Head;
}
//输出链表
void Print_Link(ElemSN*Head)
{
ElemSN*p=Head;
while(p){
if(p->next){
printf("%d->",p->data);
}
else{
printf("%d",p->data);
}
p=p->next;
}
printf("\n");
}
//逆向创建链表
/*
采用头插的方法创建链表
*/
ElemSN*Creat_Link_Inv(int a[],int a_length)
{
ElemSN*p,*Head=NULL;
for(int
i=0;i<a_length;i++){
p=(ElemSN*)malloc(sizeof(ElemSN));
p->data=a[i];
p->next=NULL;
if(!Head){
Head=p;
}
else{
p->next=Head;
Head=p;
}
}
return
Head;
}
//查找链表最后一个节点的值
ElemSN*Find_Last_Node(ElemSN*Head)
{
ElemSN*p;
for(p=Head;p->next;p=p->next);
return
p;
}
//统计链表节点的个数
int Count_Node(ElemSN*Head)
{
int
cnt=0;
for(ElemSN*p=Head;p;p=p->next,cnt++);
return
cnt;
}
//统计链表中奇数节点的个数
int Count_Odd_Node(ElemSN*Head)
{
int
cnt=0;
for(ElemSN*p=Head;p;p->data%2==1?cnt++:1,p=p->next);
return
cnt;
}
//输出单向链表最大值节点
void Print_Max_Node(ElemSN*Head)
{
ElemSN*p,*p_max=Head;
for(p=Head;p;p->data>p_max->data?p_max=p:p=p,p=p->next);
printf("这个链表最大值节点是%d\n",p_max->data);
}
//逆向输出单向链表数据域的值
void Print_Link_Inv(ElemSN*Head)
{
ElemSN*p,*Flag=NULL;
while(Flag!=Head){
for(p=Head;p->next!=Flag;p=p->next);
printf("%d
",p->data);
Flag=p;
}
}
//查找数据域中的关键字Key
ElemSN*Find_Key_Node_(ElemSN*Head,int Key)
{
ElemSN*p;
for(p=Head;p&&p->data!=Key;p=p->next);
printf("查找到了关键字Key\n",p->data);
return
p;
}
//删除链表中第K个节点的值
ElemSN* Del_Key_Node_K(ElemSN*Head,int K)
{
int
cnt;
ElemSN*p,*q=NULL;
for(p=Head,cnt=1;p&&cnt<K;cnt++,q=p,p=p->next);
if(!q){
Head=Head->next;
}
else{
q->next=p->next;
}
free(p);
return
Head;
}
//删除链表中节点值为Key的节点
ElemSN*Del_Key_Node(ElemSN*Head,int Key)
{
ElemSN*p,*q=NULL;
for(p=Head;p&&p->data!=Key;q=p,p=p->next);
if(!q){
Head=Head->next;
}
else{
q->next=p->next;
}
free(p);
return
Head;
}
//删除链表中若干个重复的关键字Key
ElemSN*Del_Key_Node_RE(ElemSN*Head,int Key)
{
ElemSN*p=Head,*q=NULL;
while(p){
if(p->data==Key){
if(p==Head){
Head=Head->next;
p=Head;
}
else{
q->next=p->next;
p=q->next;
}
}
else{
q=p;
p=p->next;
}
}
return
Head;
}
//逆置链表
/*
在末尾元素设置一个标志,然后从头到尾在标志后面进行尾插
*/
ElemSN*Inv_Link(ElemSN*Head)
{
ElemSN*Flag,*p=Head,*q;
for(Flag=Head;Flag->next;Flag=Flag->next);
while(p!=Flag){
Head=Head->next;
p->next=Flag->next;
Flag->next=p;
p=Head;
}
return
Head;
}
/*
利用头插的方法进行逆置链表
每次插入一个元素以后挪动头指针Head
*/
ElemSN*_Inv_Link(ElemSN*Head)
{
ElemSN*p=Head,*q;
while(p->next){
q=p->next;
p->next=q->next;
q->next=Head;
Head=q;
}
return
Head;
}
//将两个链表相加求出和链表
ElemSN*Add_Head_And_Head_b(ElemSN*head_a,ElemSN*head_b)
{
int
t=0;
ElemSN*p,*q,*temp,*head,*tail=NULL;
for(p=head_a,q=head_b;p&&q;p=p->next,q=q->next){
temp=(ElemSN*)malloc(sizeof(ElemSN));
temp->data=(p->data+q->data)%10+t;
temp->next=NULL;
t=(p->data+q->data)/10;
if(!tail){
head=tail=temp;
}
else{
tail=tail->next=temp;
}
}
if(t){
temp=(ElemSN*)malloc(sizeof(ElemSN));
temp->data=t;
temp->next=NULL;
tail=tail->next=temp;
}
return
head;
}
//将一个链表转化成一个数字
int Convert_Link_to_Num(ElemSN*head)
{
int
t=0;
for(ElemSN*p=head;p;p=p->next){
t=t*10+p->data;
}
return
t;
}
//回文链表的判断
/*
是错误的
*/
ElemSN*link_inv(ElemSN*head)
{
ElemSN*p,*q;
for(p=head,q=head;q;p=p->next,q=q->next->next)
printf("%d\n",p->data);
return
head;
}
#endif