单链表的基本操作 求表长、判断、打印、删除、插入、头插法建立单链表

#include<stdio.h>        //若用printf,scanf,getchar,putchar,gets,puts函数需包含该头文件
#include<malloc.h>        //用malloc,free,realloc函数需包含该头文件
#include<conio.h>//若用getch()使得屏幕暂停,需包含该头文件
#define MAX 1000        
#define OK 0
typedef int ElemType;    //先设定数据元素的类型为整型

//定义类型
typedef struct LNode
{
    int data;
    struct LNode *next;
}LNode,*LinkList;

//求表长
int ListLength(LinkList L)
{

    int len=0;
    LNode *p=L;
    while(p->next!=NULL)

    {
        p=p->next;
        len++;
    }
    return len;
}

//查找元素,获取表中第i个元素的值
int GetElem(LinkList L,int i,ElemType &e)
{
    LNode *p=L->next;  
    int j=1;            //p指向第一个结点,j为计数器
    while (p && j<i)    //顺指针向后查找,直到p指向第i个元素或p为空
    {    
        p = p->next; 
        ++j;  
    }        
    if ( !p || j>i )
        return 0;        //第i个元素不存在
    e = p->data;        //取得第i个元素
    return 1; 
}

//判断元素e是否在该链表中
int LocateElem(LinkList &L,ElemType e)
{
    LNode *temp=L;
    int i=1;
    int p=0;
    while(temp->next)
    {
        temp=temp->next;
        if(e==temp->data)
        {
            p=i;
            printf("找到了与%d相等元素位置为%d\n",e,p);
            return 1;
            }
        i++;
    }
    printf("表中没有所查找的元素");
    return -1;
}

//打印表中元素值
void PrintList(LinkList L)
{
    LNode *temp=L;
    int count=0;
    while(temp->next)
    {
        temp=temp->next;
        printf("%d\t",temp->data);
        count++;
        if(count%5==0)
        {
            printf("\n");
        }
    }
    printf("\n");
}

//插入操作
int ListInsert(LinkList &L,int p,int e)
{
    LNode *war=L;
    int i=0;
    while(i<p-1)
    {
        war=war->next;
        ++i;
    }
    LNode *s=(LNode*)malloc(sizeof(LNode));
    s->data=e;
    s->next=war->next;
    war->next=s;
    return OK;
}

//删除操作
int ListDelete(LinkList &L,int i,int e)
{
    LNode *temp=L;
    int p=0;
    while(p<i-1)//找到删除结点的上一个结点
    {
        temp=temp->next;
        ++p;
    }
    LNode *q=temp->next;//定义一个q指向被删除的结点
    e=q->data;//保存删除的节点的数据域
    temp->next = q->next;
    free(q);
    return OK;
}

//头插法建表
LinkList CreateList(LinkList L,int n)
{
    LNode *s;
    int i;
    L = (LNode*)malloc(sizeof(LNode));
    L ->next = NULL;
    //scanf("%d",&i);
    for(int a=1;a<=n;++a)
    //for(i=0;i<n;++i)
    {
            scanf("%d",&i);    
        s = (LNode*)malloc(sizeof(LNode));
        s ->data = i;        
        s ->next = L ->next;    
        L ->next = s;            
    
    }
    return L;


//    int n,i;
//    struct LNode *head,*p,*q;
//    printf("请输入要插入元素的个数:\n");
//    while(scanf("%d",&n)!=-1)
//    {
//        head=(struct LNode *)(malloc(sizeof(struct LNode)));
//        head->next=NULL;
//        printf("请输入要插入的元素:\n");
//        for(i=0;i<n;i++)
//        {
//            p=(struct LNode *)(malloc(sizeof(struct LNode)));
//            scanf("%d",&p->data);
//            p->next=head->next;
//            head->next=p;
//        }
//        p=head->next;
//        while(p!=NULL)
//        {
//            if(i==n-1) printf("%d\n",p->data);
//            else printf("%d",p->data);
//            p=p->next;
//            q=p;
//            return q;
//        }
    
//    }
    

}
//遍历链表

//合并两个有序表
void MergeList(LinkList La,LinkList Lb,LinkList &Lc)
{
    LinkList pa=La->next;  
    LinkList pb=Lb->next; 
    LinkList pc;
    Lc=pc=La;
      while(pa&&pb)
    {
        if(pa->data<=pb->data)
        {
            pc->next=pa;
            pc=pa; 
            pa=pa->next;
        }
        else
        { 
            pc->next=pb; 
            pc=pb; 
            pb=pb->next; 
        }
    }    
      pc->next=pa?pa:pb;  
    free(Lb);  
}

//主函数
void main()
{
    LinkList La;
    ElemType e;  
    int i,n;
    //int a[MAX];
//创建第一个表
    printf("1.建第一个表 \n");    
    printf("请输入要插入的元素个数:\n");
    scanf("%d",&n);
    printf("请输入%d个元素:\n",n);
    //for(int j=0;j<n;++j)
    //{
    //    scanf("%d",&a[j]);
    //}
    La=CreateList(La,n);
    printf("表中元素为:\n");
    PrintList(La);    
    //取值
    printf("\n2.查找第i位元素的值\n请输入位序:");    
    scanf("%d",&n);
    GetElem(La,n,e);
    printf("第%d位元素的值为:%d\n",n,e);

    //定位
    printf("\n3.定位操作\n请输入要查找的元素:");    
    scanf("%d",&e);
    i=LocateElem(La,e);
    if(i)
        printf("\n");
    else
        printf("表中无该元素\n");
    
    //插入
    int p;
    printf("\n4.插入操作\n输入要插入元素的位序:");    
    scanf("%d",&i);
    printf("输入要插入的元素值:");    
    scanf("%d",&p);
    ListInsert(La,i,p);
    printf("插入后表中元素为:\n");    
    PrintList(La);
    
    //删除
    printf("\n5.删除操作\n输入要删除元素的位序:");    
    scanf("%d",&n);
    ListDelete(La,n,e);
    printf("要删除的元素值为:%d\n",e);    
    printf("删除后表中元素为:\n");    
    PrintList(La);
    
    //建立第二个表
    LinkList Lb,Lc;
    int r;
    printf("n6.建立第二个表\n");
    printf("请输入要插入的元素个数:\n");
    scanf("%d",&r);
    //int b[MAX];
    printf("请输入%d个元素:\n",r);
    //for(int f=0;f<r;++f)
    //{
        //scanf("%d",&b[f]);
    //}        
    Lb=CreateList(Lb,r);
    printf("表中元素为:\n");
    PrintList(Lb);

    //合并
    printf("\n7.合并两个有序表:\n");    
    MergeList(La,Lb,Lc);
    printf("合并后Lc表中元素为:\n");
    PrintList(Lc);
    printf("");
    getch();
}

    

自己想存下来   里面很多东西没有删除   可能有些许错误  如有发现还请不吝指出  
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值