数据结构链表



 

/*

针对单向链表的一些基本操作

*/

#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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值