单链表复习

//单链表的定义:
#include<stdio.h>
#include<stdlib>
#define LEN sizeof(struct node)
#define NULL 0
typedef int datatype;
typedef struct node
{    datatype data;
    struct node *next;
}linklist;


//单链表的尾插法建立: 
linklist hrear_creat()
{
    int x;
    linklist *head,*p,*rear;
    head=struct(node*) malloc(LEN);
    head->data=-999;
    rear=head;
    printf(\t\n"请输入整数以0为结束符!"\t\n);
    scanf("%d,&x")
while(x!=0)
{
    p=struct(node*)malloc(LEN);
    p->data=x;
    rear->next=p;
    rear=p;
    scanf(%d,&x);
}
rear=NULL;
return(head);//返回头指针 
}

//单链表的头插法建立: 
linklist hhead_ creat()
{
    int x;
    linklist *head;*p,*rear;
    head=struct(node*)malloc(LEN);
    head->data=-999;
    head->next=NULL;//置空head结点的指针域 
    rear=head;
    printf("\t\n请输入整数以0为结束符!\t\n");
    scanf("%d,&x");
    while(x!=0)
    {
        p=struct(node*)malloc(LEN);
        p->data=x;
        p->next=head->next;//置空p结点的指针域 
        head->next=p;
        scanf("%d,&x");
    }
    return(head);
    
}
//单链表的按值查找运算: 
linklist key_search(head,keyx)
linklist *head
datatype keyx;
{     linklist *p=head;
    while(p!=NULL)&&(p->data!=keyx){
    p=p->next;
    if(p->data==keyx)
    return(p);
    else
    return(NULL);
}

//单链表按序号查找运算: 
linklist *no_search(head,i)
linklist *head;
int i;
{    linklist *p=head;
    int j=0;
    while(p->next!=NULL)&&(j<i)
    {p=p->next;
    j++;
    }
    if(j==i)
    return(p);
    else
    return(NULL);    
 } 

//单链表的给定某位置(按值查找)后插运算: 
 linklist *data_insert(head,x)
 linklist *p,*s;
 int x;
 {s=struct(node*)malloc(LEN);
 s->data=x;
 p=findnode(head,x);
 s->next=p->next;
 p->next=s;
 return(head);
 }
 linklist *findnode(head,x)
 linklist *head;
 {    int x;
      linklist *p=head;
      while(p->next!=0)&&(p->next->data<x)
      p=p->next;
      return(p);
 }
 
 //单链表的位置(按序号查找)前插运算: 
 linklist *address_insert(head,x,i) 
 linklist *head;
 int x,i;
 {
     linklist *s,*q;
     s=struct(node*)malloc(LEN);
     s->data=x;
     q=no_search(head,i-1);
     s->next=q->next;
     q->next=s;
     return(head)
 }
 //单链表中删除值为x的结点: 
 linklist *key_delete(head,x)
 linklist *head;
 int x;
 {
    linklist *p,*q;
    p=head;
    while(p!=NULL)&&(p->data!=x)
    {
        q=p;p=p->next;    
     }     
     if(p!=NULL)
     {
         q->next=q->next;
         free(p);
              return(head);
     }
    else
    {
        printf("\n\t要删除的结点不存在\n");
        return(NULL); 
    }
     
 } 
//单链表中删除序号为k的结点: 
linklist *no_delete(head,k);
linklist *head;
int k;
{printf("\n\t\t请输入结点的位置k") ;
scanf("%d",&k)
linklist*p;
p=no_search(head,k);
if(p!=NULL)
{    
    p-next=p->next->next;
    return(head);
}
else
{
    printf("\n\t\t要删除的结点不存在")
    return(NULL);
}
}
 
 
 //单链表的逆置: 
 linklist *reverse_linklist(head)
 linlist *head;
 {
     if(head==NULL)//如果为空链表则建立新表再逆置 
     {
         head=hrear_creat(head);
     }
     linklst *p,*s;
     p=head->next;
     head->next=NULL;
     while(p!=NULL)
     {
         s=p;
         p=p->next;
         s->next=head->head;
         head->next=s;    
     }
  } 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值