单链表的基本操作用c语言表示

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define INITSIZE 5

typedef struct node
{
    int data;
    struct node *next;
}Node,*LinkList;

void CreateList(LinkList L,int n);//用头插法创建链表
void PrintList(LinkList L);//打印链表
bool GetElem(LinkList L,int n,int *val);//按序号查找
void ListInsert(LinkList L,int x,int i);//插入元素
void ListDelete(LinkList L,int n);//删除元素
void MergeList(LinkList LA,LinkList LB,LinkList L);//将两个有序链表合并为一个有序链表


int main()
{
    LinkList L=(LinkList)malloc(sizeof(Node));
    L->next=NULL;
    int n,val;
    printf("请输入链表的元素:\n");
    CreateList(L,INITSIZE);
    PrintList(L);

    printf("请输入要查找的元素序号:");
    scanf("%d",&n);
    bool state=GetElem(L,n,&val);
    if(state)
    {
        printf("第%d个元素为%d\n",n,val);
    }
    else
    {
        printf("输入出错");
    }

    printf("请输入要插入的元素位置:");
    scanf("%d",&n);
    printf("请输入要插入的元素数据:");
    scanf("%d",&val);
    ListInsert(L,val,n);
    PrintList(L);

    printf("请输入要删除的元素位置:");
    scanf("%d",&n);
    ListDelete(L,n);
    PrintList(L);

    LinkList LA=(LinkList)malloc(sizeof(Node)),LB=(LinkList)malloc(sizeof(Node)),LC=(LinkList)malloc(sizeof(Node));
    LA->next=NULL,LB->next=NULL,LC->next=NULL;
    CreateList(LA,INITSIZE);
    CreateList(LB,INITSIZE);
    MergeList(LA,LB,LC);
    PrintList(LC);
    return 0;
}

void CreateList(LinkList L,int n)
{
    int i;
    LinkList p;
    for(i=0;i<n;i++)
    {
        p=(LinkList)malloc(sizeof(Node));
        scanf("%d",&p->data);
        p->next=L->next;
        L->next=p;
    }
}

bool GetElem(LinkList L,int n,int *val)
{
    LinkList p=L->next;
    int i=1;
    while(p&&i<n)
    {
        p=p->next;i++;
    }
    if(p==NULL)
        return false;
    else
        *val=p->data;
        return true;
}

void PrintList(LinkList L)
{
    LinkList p=L->next;
    while(p!=0)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}

void ListInsert(LinkList L,int x,int i)
{
    LinkList p=L->next,q;
    int j=1;
    q=(LinkList)malloc(sizeof(Node));
    q->data=x;
    while(j<i-1)
    {
        p=p->next;j++;
    }
    if(p!=0)
    {
        q->next=p->next;
        p->next=q;
    }
}

void ListDelete(LinkList L,int n)
{
    LinkList p=L->next;
    int i=1;
    while(i<n-1)
    {
        p=p->next;i++;
    }
    LinkList q=p->next;
    if(p!=0)
    {
        p->next=q->next;
        free(q);
    }
}

void MergeList(LinkList LA,LinkList LB,LinkList L)
{
    LinkList pa=LA->next,pb=LB->next,p=L;
    while(pa&&pb)
    {
        if(pa->data <= pb->data)
        {
            p->next=pa;
            p=pa;
            pa=pa->next;
        }
        else
        {
            p->next=pb;
            p=pb;
            pb=pb->next;
        }
    }
    if(pa==0)
    {
        p->next=pb;
    }
    else
    {
        p->next=pa;
    }
    free(LA),free(LB);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值