线性表之单链表

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;

//定义结点类型
typedef struct Node
{
    ElemType data;              //单链表中的数据域
    struct Node *next;          //单链表的指针域
}LinkNode,*LinkList;

//单链表的初始化

LinkList Init()
{
    LinkNode *L;
    L = (LinkNode *)malloc(sizeof(LinkNode));   //申请结点空间
    if(L == NULL)                       //判断是否有足够的内存空间
        printf("申请内存空间失败\n");
    L->next = NULL;                  //将next设置为NULL,初始长度为0的单链表
}

//尾插法建立单链表

LinkList Create(int n)
{
    LinkNode *L;
    L = (LinkNode *)malloc(sizeof(LinkNode));   //申请头结点空间
    L->next = NULL;                  //初始化一个空链表
    LinkNode *r;
    r = L;                          //r始终指向终端结点,开始时指向头结点
    ElemType x;                         //x为链表数据域中的数据
    while(n--)
    {
        scanf("%d",&x);
        LinkNode *p;
        p = (LinkNode *)malloc(sizeof(LinkNode));   //申请新的结点
        p->data = x;                     //结点数据域赋值
        r->next = p;                 //将结点插入到表头L-->|1|-->|2|-->NULL
        r = p;
    }
    r->next = NULL;
    return L;
}
//判断链表是否为空链表
int isEmpty(LinkList L)
{
    return (L->next==NULL);
}
//单链表的插入,在链表的第i个位置插入x的元素
LinkList Insert(LinkList L,int m,ElemType x)
{
    LinkNode *pre;                      //pre为前驱结点
    pre = L;
    int i = 0;
    for(i = 1; i < m; i++)
        pre = pre->next;                 //查找第m个位置的前驱结点
    LinkNode *p;                                //插入的结点为p
    p = (LinkNode *)malloc(sizeof(LinkNode));
    p->data = x;
    p->next = pre->next;
    pre->next = p;
    return L;
}
//单链表的删除,在链表中删除值为x的元素

LinkList Deletenum(LinkList L,ElemType x)
{
    LinkNode *p,*pre;                   //pre为前驱结点,p为查找的结点。
    p = L->next;
    pre = L;
    while(p->data != x)              //查找值为x的元素
    {
        pre = p;
        p = p->next;
    }
    pre->next = p->next;          //删除操作,将其前驱next指向其后继。
    free(p);
    return L;
}
//单链表的删除,在链表中删除位置为n的元素
LinkList Delete(LinkList L,int n)
{
    LinkNode *p,*pre;
    p = L->next;
    pre = L;
    int i;
    for(i = 1;i < n;i++)
    {
        pre = p;
        p = p->next;
    }
    pre->next = p->next;
    free(p);
    return L;
}
//两个有序单链表的合并
LinkList Merge(LinkList head1,LinkList head2)
{
    LinkNode *pa,*pb;
    LinkList head3;
    pa = head1->next;
    pb = head2->next;
    head3 = head1;
    head3->next=NULL;
    LinkList r=head3;
    while(pa!=NULL&&pb!=NULL)
    {
        if(pa->data<=pb->data)
        {
            r->next=pa;
            r=pa;
            pa=pa->next;
        }
        else
        {
            r->next=pb;
            r=pb;
            pb=pb->next;
        }
    }
    if(pa)
        r->next=pa;
    else
        r->next=pb;
    free(head2);
    return head3;
}
//单链表的倒置
void Inverse(LinkList head)
{
    LinkNode *p = head->next;
    LinkNode *tmp = NULL;
    head->next = NULL;
    while (p != NULL)
    {
        tmp = p->next;
        p->next = head->next;
        head->next = p;
        p = tmp;
    }
}
//判断是否存在值为n的元素
int Exist(LinkList head,ElemType n)
{
    LinkNode *p=head->next;
    while(p!=NULL)
    {
        if(p->data==n)
        {
            return 1;
        }
        p=p->next;
    }
    return 0;
}
//输出链表
void Print(LinkList head)
{
    LinkNode *p = head->next;
    while (p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}
//获得位置为n处的元素
ElemType Take(LinkList head,int n)
{
    int i;
    LinkNode *p=head->next;
    for(i=1;i<n;i++)
    {
        p=p->next;
    }
    return p->data;
}
//获得值为x的元素的位置
int Find(LinkList L,int x)
{
    LinkNode *p = L->next;
    int i = 1;
    while(p != NULL)
    {
        if(p->data == x)
            return i;
        i++;
        p = p->next;
    }
    return -1;
}
int main()
{
    LinkList list,list1;
    int n;
    scanf("%d",&n);
    printf("请输入单链表的数据:");
    list = Create(n);
    list1 = Create(n+2);
    list = Merge(list,list1);
    Print(list);
    int i;
    ElemType x;
    printf("请输入插入数据的位置:");
    scanf("%d",&i);
    printf("请输入插入数据的值:");
    scanf("%d",&x);
    Insert(list,i,x);
    Print(list);
    printf("\n");
    printf("请输入要删除的元素的值:");
    scanf("%d",&x);
    Deletenum(list,x);
    Print(list);
    int m;
    printf("请输入要删除的元素的位置:");
    scanf("%d",&m);
    Delete(list,m);
    Print(list);
    Inverse(list);
    Print(list);
    ElemType p;
    p = Take(list,1);
    int l,q,d;
    l=Exist(list,10);
    q=Find(list,10);
    d=isEmpty(list);
    printf("%d %d %d %d",p,l,q,d);
    return 0;
}

之前写的单链表好奇怪啊……重新改了一下,功能应该比较全了,看起来也整齐一些了~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值