头插法和尾插法创建链式循序表 遍历、插入、删除、查找元素等操作

头插法和尾插法创建链式循序表并进行遍历循序表、插入、删除、查找元素的操作。

#include <stdio.h>
#include <malloc.h>
/*
    线性表的链式存储 
*/ 
typedef struct Node
{
    int data;//数据域 
    struct Node *next;//指针域 
} ListNode;
//给节点指针类别取别名 
typedef ListNode * LinkList;
/*
    头插法创建链表 
    参数:head代表的头指针,d表示要插入节点的数据
    返回值:链表的头指针 
*/
LinkList createLinkList(LinkList head,int d)
{
    //动态分配内存
    LinkList p=(LinkList)malloc(sizeof(ListNode));
    //把d放入p节点的数据域
    p->data=d;
    //让p节点的指针域指向当前的第一个节点
    p->next=head;
    // 让p作为第一个节点(head指向p) 
    head=p;
    return head; 
} 
/*
    尾插法创建链表 
*/
LinkList createLinkList2(LinkList head,int d)
{
    //动态分配内存 
    LinkList q=(LinkList)malloc(sizeof(ListNode));
    q->data=d;
    q->next=NULL;
    if(head==NULL)
    {
        head=q;
    } 
    else
    {
        LinkList p=head;
        while(p->next!=NULL)
        {
            p=p->next;
        }
        p->next=q;
    }
    return head;
}

LinkList insertlinklist(LinkList head,int x)
{
    LinkList p;
    //为新节点动态分配内存,找到x应该插入在哪个节点(p)之后)
     LinkList q=(LinkList)malloc(sizeof(ListNode));
    //把x赋值给q的数据域
    q->data=x;
    //通过对链表的比较,找到x应该插入在那个节点
    LinkList temp;
    p=head;
    temp=p->next;
    if(x<p->data)
    {
        q->next=head;
        head=q;
        return head;
    }
    else{
    while(temp->data<x&&temp->next!=NULL)
    {
        p=p->next;
        temp=p->next;
    }
    if(temp->data>=x){
    //让q的next指向p-》next
    q->next=p->next;
        //让p-》next指向q
    p->next=q;

}
else{
    temp->next=q;
    q->next=NULL;
}
    //返回head 
    return head;
}
}
/*
删除节点 
*/ 

LinkList deleteNode(LinkList head,int d) 
{

    LinkList q,p;
    if(head==NULL)
    {
        printf("链表尾空\n");
        return head;
    }
    p=head;
        if(head->data==d)
        {

            head=p->next;
            free(q);
            return head;
        }
        q=p->next;
    while(head!=NULL)
    {
        if(q->data==d)
        {
            p->next=q->next;
            free(q);
            printf("删除成功\n");
            return head;
        }
        q=q->next;
        p=p->next;
    }



}
/*
查找元素 
*/
LinkList  selectNode(LinkList head,int d)
{
    LinkList p;
    p=head;
    int q=0;
    while(p->next!=NULL)
    {
        q++;
        if(p->data==d)
        {   
            printf("查找成功!\n其位置是%d\n",q);
            return p; 
        }
        p=p->next; 
    }
    if(p->data==d){
        printf("查找成功!\n其位置是%d\n",q+1);
    }
    else
    printf("链表中没有这个元素!\n");

}


/*
    遍历链表 
*/

void outputLinkList(LinkList head)
{
    LinkList p=head;
    printf("链表的内容如下:\n");
    while(p!=NULL)
    {
        printf("%d->",p->data);
        p=p->next;
    }
}
void main(){
    LinkList head=NULL; 
    int a,data,choice;
    printf("情选择创建链表的方式,1:头插法 2:尾插法");
    scanf("%d",&a);
    switch(a)
    {
        case 1:
            printf("你选择的头插法篡创建链表,请输入元素:");
            scanf("%d",&data);
            while(data!=-1)
            {
                head=createLinkList(head,data);
                scanf("%d",&data);
            }
            printf("链表创建成功!\n");
            break;
        case 2:
            printf("你选择的尾插法创建链表,请输入元素:");
            scanf("%d",&data);
            while(data!=-1)
            {
                head=createLinkList2(head,data);
                scanf("%d",&data);
            }
            printf("链表创建成功!\n");
            break;
    }
    while(1)
    {
        printf("选择你要进行的操作:\n");
        printf("-------------------------------\n");
        printf("1、遍历元素\n"); 
        printf("2、插入\n");
        printf("3、删除\n");
        printf("4、查找\n");
        printf("5、退出程序\n");
        printf("------------------------------\n");
        scanf("%d",&choice);
        switch(choice)
        {
            case 1:
                outputLinkList(head);
                break;
            case 2:
                printf("请输入要插入的元素:\n");
                scanf("%d",&data);
                head=
                insertlinklist(head,data);
                break;
            case 3:
                printf("请输入要删除的元素:\n");
                scanf("%d",&data);
                head=deleteNode(head,data);
                break;
            case 4:
                printf("请输入要查找的元素:\n");
                scanf("%d",&data);
                selectNode(head,data);
                break;
            case 5:
            return 0;
            default:
                printf("输入无效.\n");
        }
    }
}

我也是用了一个菜单栏的方式来进行一系列的操作。运行结果如下:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值