单链表基本操作

//
//  main.c
//  sqlist
//
//  Created by Mac on 16/8/1.
//  Copyright ? 2016年 Mac. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>

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

void BuildLinkList(LinkList l)// 创建链表
{   int n;
    LinkList p,q;
    p = l;
    printf("请输入n和n个元素\n");
    scanf("%d",&n);
    while (n--) {
        q = (LinkList)malloc(sizeof(LNode));
        scanf("%d",&q->data);
        q->next = NULL;
        p->next = q;
        p = q;
    }
}
void LinkListLength(LinkList l)//求长度
{   int num = 0;
    LinkList p;
    p = l->next;
    while (p) {
        num++;
        printf("%3d",p->data);
        p = p->next;
    }
    printf("链表长度为%d",num);
}
void FindLinkList(LinkList l,int x)//查找前驱节点
{   LinkList p;
    p = l;
    while (p->next && p->next->data!=x)
        p = p->next;
    if (p->next) {
        printf("%d的前驱结点为%d",x,p->data);
    }

}
void DeleteLinkList(LinkList l,int x)//删除节点
{   LinkList p,q;
    p = l;
    while (p->next && p->next->data!=x) {
        p = p->next;
    }
    if(p->next){
        q = p->next;
        p->next = q->next;
        free(q);
    }
    printf("删除元素成功");
}
void ReserveLinkList(LinkList l)//逆置
{   LinkList p,q;
    p = q = l->next;
    l->next = NULL;
    while (p) {
        q = q->next;
        p->next = l->next;
        l->next = p;
        p = q;
    }
    printf("逆置成功");
}
void SortLinkList(LinkList l)//排序
{   LinkList p,q;
    int temp;
    p=l;
    for(p=l;p->next!=NULL;p=p->next)
    {
        for(q=p->next;q!=NULL;q=q->next)
            if(p->data>q->data)
            {
                temp=p->data;
                p->data=q->data;
                q->data=temp;
            }
    }
    printf("排序成功!");
}
void Deletesameelem(LinkList l)//删除相同的元素
{
    LinkList p,q,s;
    p=l;
    q=l->next;
    while(q->next)
    {
        if(q->data ==q->next->data)
        {
            p->next=q->next;
            s=q;
            q=q->next;
            free(s);
        }
        else
        {
            p=p->next;
            q=q->next;
        }
    }
    printf("删除成功!!");
}
void Insert(LinkList l,LinkList p)//插入元素,仍有序
{
    LinkList s;
    s=l;
    while(s->next && s->next->data<p->data)
        s=s->next;
    p->next=s->next;
    s->next=p;
}
void Tips()//提示
{
    printf("\n");
    printf("根据按键选择相应的操作:\n");
    printf("<1>输出单链表及其长度:\n");
    printf("<2>查找值为x的直接前驱结点:\n");
    printf("<3>删除值为x的结点:\n");
    printf("<4>将表中的元素逆置:\n");
    printf("<5>将单链表由小到大进行排序:\n");
    printf("<6>删除表中相同的元素:\n");
    printf("<7>在升序链表中插入元素x:\n");
    printf("<0>退出:\n");
}
int main(int argc, const char * argv[]) {
    int operate,x;
    LinkList L,p;
    L= (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    L->data = -1;//初始化
    BuildLinkList(L);
    Tips();
    scanf("%d",&operate);
    while(operate)
    {
        switch(operate)
        {
            case 1:LinkListLength(L);
                break;
            case 2:
                printf("请输入要查找的元素x:\n");
                scanf("%d",&x);
                FindLinkList(L,x);
                break;
            case 3:
                printf("请输入要删除的元素x:\n");
                scanf("%d",&x);
                DeleteLinkList(L,x);
                break;
            case 4:ReserveLinkList(L);
                break;
            case 5:SortLinkList(L);
                break;
            case 6:Deletesameelem(L);
                break;
            case 7:
                printf("请输入要插入的元素X:\n");
                scanf("%d",&x);
                p=(LinkList)malloc(sizeof(LNode));
                p->data=x;
                Insert(L,p);
                printf("插入成功!!!\n\n");
                break;
        }
        scanf("%d",&operate);
    }
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值