单链表的基本操作

不羁的心 提交于 2020-02-10 20:09:25

单链表(C语言)

#include <stdio.h>
#include <stdlib.h>
typedef int ELemType;
typedef struct Node  # 定义一个单链表结构体变量
{
    ELemType data;
    struct Node *next;
}LinkNode,*LinkList;
LinkList CreatListFromHead()  # 使用头插法创建单链表
{
    LinkNode *head,*s;
    char Flag='Y';
    head = (LinkNode *)malloc(sizeof(LinkNode));
    head->next = NULL;
    printf("开始用头插法创建单链表!\n");
    while (Flag == 'Y'||Flag == 'y')
    {
        s = (LinkNode *)malloc(sizeof(LinkNode));
        printf("请输入新节点数据:");
        scanf("%d",&(s->data));
        s->next = head->next;
        head->next = s;
        getchar();
        printf("是否继续插入?(Y/y):");
        scanf("%c",&Flag);
    }
    return head;
}
LinkList CreatListFromTail()  # 使用尾插法创建单链表
{
    LinkNode *head,*tail,*s;
    char Flag='Y';
    head = (LinkNode *)malloc(sizeof(LinkNode));
    tail = (LinkNode *)malloc(sizeof(LinkNode));
    tail = head;
    printf("开始用尾插法创建单链表!\n");
    while (Flag == 'Y'||Flag == 'y')
    {
        s = (LinkNode *)malloc(sizeof(LinkNode));
        printf("请输入新节点数据:");
        scanf("%d",&(s->data));
        tail->next = s;
        tail = s;
        getchar();
        printf("是否继续插入?(Y/y):");
        scanf("%c",&Flag);
    }
    tail->next = NULL;
    return head;
}
LinkList InsertSqList(LinkNode *head,int i,ELemType e)  # 单链表的插入操作
{
    LinkNode *p2,*p1,*s;
    int k=0;
    p2 = head;
    while (k < i)
    {
        if (p2->next == NULL)
        {
            printf("插入位置错误!\n");
            return 0;
        }
        p1 = p2;
        p2 = p2->next;
        k++;
    }
    s = (LinkNode *)malloc(sizeof(LinkNode));
    s->next = p1->next;
    s = p1->next;
    s->data = e;
    return head;
}
LinkList DelectSqList(LinkNode *head,ELemType e)  # 单链表的删除操作
{
    int j;
    LinkNode *v,*w;
    v = head;
    while (v->next != NULL)
    {
        w = v;
        v = v->next;
        if (v->data == e)
        {
            w->next = v->next;
            free(v);
            return head;
        }
    }
    return head;
}
LinkList LocateSqList(LinkNode *head,ELemType e)  # 单链表元素查找操作
{
    LinkNode *n;
    n = head;
    while (n->next != NULL)
    {
        n = n->next;
        if (n->data == e)
        {
            return n;
        }
    }
    printf("查找失败,单链表中没有该元素!");
    return 0;
}
int main()
{
    LinkNode *p,*q;
    int i,e;
    p = (LinkNode *)malloc(sizeof(LinkNode));
    // p = CreatListFromHead();
    p = CreatListFromTail();
    if (0)
    {
        printf("创建单链表失败!");
        return 0;
    }
    // printf("请输入要插入节点的位置和节点数据:");
    // scanf("%d,%d",&i,&e);
    // p = InsertSqList(p,i,e);

    // printf("请输入要删除的元素:");
    // scanf("%d",&e);
    // p = DelectSqList(p,e);
    
    // printf("请输入要查找的元素:");
    // scanf("%d",&e);
    // q = LocateSqList(p,e);
    // printf("该元素的地址:%p\n",q);
    printf("单链表:");
    while (p)
    {
        printf("%d\t",p->data);
        p = p->next;
    }
    printf("\n");
    return 0;
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!