单链表的链式插入和删除

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define FALSE 0
#define ERROR 0
#define TRUE 1
typedef int ElemType;
typedef int Status;
typedef struct Node
{
ElemType Data;
struct Node *next;
}List;
List L,*Ptrl;
//返回链表的长度
Status Length(List *Ptrl)
{
List *p = Ptrl;
int i=0;


//链表不为空
while(p)
{
//下一个结点,计数加一
p=p->next;
i++;
}
return i;
}
//根据位置返回结点
List* FindKth(int k,List *Ptrl)
{
List *p=Ptrl;
int i =1;
//结点不为空且当前结点序号小于给定序号
while(p&&i<k)
{
//下一个结点,计数加一
p=p->next;
i++;
}
//序号相等
if(i==k)
{
return p;
}
else
{
return NULL;
}
}
//根据给定值返回结点
List* Find(ElemType x,List *Ptrl)
{
List *p = Ptrl;
//结点不为空且数据域不为给定值
while(p&&p->Data!=x)
{
p=p->next;
}
return p;
}
List* Insert(ElemType x,int i,List *Ptrl)
{
List *s,*p;
//在头结点处插入
if(i==1)
{
//给新结点分配空间
s=(List*)malloc(sizeof(List));
s->Data = x;
s->next = Ptrl;
return s;
}
//找到给定序号的前一个结点
p = FindKth(i-1,Ptrl);
if(p==NULL)
{
return NULL;
}
else
{
//给新结点分配空间
s=(List*)malloc(sizeof(List));
s->Data= x;
s->next=p->next;
p->next = s;
return Ptrl;
}
}
List* Delete(int i,List *Ptrl)
{
List *s,*p;
//删除头结点
if(i==1)
{
if(Ptrl!=NULL)
{
Ptrl = Ptrl->next;
return Ptrl;
}
else 
{
return NULL;
}
}
//找到给定序号的前一个结点
p=FindKth(i-1,Ptrl);
if(p==NULL)
{
return NULL;
}
else if(p->next==NULL)
{
return NULL;
}
else
{
s=p->next;
p->next=s->next;
free(s);
return Ptrl;
}
}
int main(){  
    List* p=(List*)malloc(sizeof(List));  
    p->next = NULL;  
    p->Data=2;  
    p=Insert(5,1,p);  
    p=Insert(3,2,p);  
    p=Insert(5,2,p);  
    printf("长度为:%d \n ",Length(p)); 
printf("%d",p->Data);
printf("%d",p->next->Data);
printf("%d",p->next->next->Data);
printf("%d",p->next->next->next->Data);
    List* po = FindKth(2,p);  
    if(po==NULL)  
        printf("不存在\n");  
    else{  
        printf("%d\n",po->Data);  
        printf("%d",p->next->Data);


    }  
    p=Delete(2,p);  
    po = FindKth(2,p);  
    if(po==NULL)  
       printf("不存在\n");   
    else{  
        printf("%d\n",po->Data);  
    }  
    return 0;  
}  







阅读更多
换一批

没有更多推荐了,返回首页