数据结构作业_单链表

数据结构第二次作业:单链表。

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

//结构体的定义
typedef int elemtype;
typedef struct node
{
    elemtype data;
    struct node * next;
} LinkList;
LinkList *head;

//用头插法创建单链表
LinkList *Create_LinkListF()
{
    elemtype ix;
    LinkList *head, *p;
    head = (LinkList *) malloc(sizeof(LinkList));
    if(head == NULL)
    {
        return head;
    }
    head -> next = NULL;
    printf("请输入数据直到输入0结束:\n");
    scanf("%d",&ix);
    while(ix != 0)
    {
        p = (LinkList *)malloc(sizeof(LinkList));
        if(p == NULL)
        {
            return head;
        }
        p -> data = ix;
        p -> next = head -> next;
        head -> next = p;
        scanf("%d",&ix);
    }
    return head;
}

//查找某序号的结点
LinkList *GetData_LinkList(LinkList *head, int i)
{
    LinkList *p;
    int j = 0;
    if(i <= 0)
    {
        return NULL;
    }
    p = head;
    while(p -> next != NULL && j < i)
    {
        p = p -> next;
        j++;
    }
    if(i == j)
    {
        return p;
    }
    else return NULL;
}

//后插
void InsertAfter_LinkList(LinkList *p, LinkList *s)
{
    s -> next = p -> next;
    p -> next = s;
}

//删除结点的后继节点
int DeleteAfter_LinkList(LinkList *p)
{
    LinkList *r;
    if(! p)
    {
        return 0;
    }
    r = p -> next;
    if(! r)
    {
        return 0;
    }
    p -> next = r -> next;
    free(r);
    return 1;
}

//遍历
int Print_LinkList(LinkList *head)
{
    LinkList *p = head -> next;
    if(p == NULL)
    {
        return 0;
    }
    while(p != NULL)
    {
        printf("%d\t", p -> data);
        p = p -> next;
    }
    printf("\n");
    return 1;
}

int main()
{
    int *List_head;
    int *Insert_head;
    int newData;
    int deleteNode;
    int find;
    int chose = -1;
    List_head = Create_LinkListF();
    LinkList *Insert_List;
    Insert_List = (LinkList *)malloc(sizeof(LinkList));
    printf("以下是链表中的元素\n");
    Print_LinkList(List_head);
    printf("1.查找某序号的结点\n");
    printf("2.后插\n");
    printf("3.删除结点的后继结点\n");
    printf("4.遍历\n");
    printf("0.退出程序\n");

    while(chose != 0)
    {
        printf("输入功能前的数字来选择你想进行的操作\n");
        scanf("%d",&chose);
        switch(chose)
        {
        case 1:
            printf("输入你想查找的序号\n");
            scanf("%d",&find);
            printf("%d\n",GetData_LinkList(List_head, find) -> data);
            break;
        case 2:
            printf("输入你想插入的结点\n");
            scanf("%d",&newData);
            Insert_List -> data = newData;
            InsertAfter_LinkList(List_head, Insert_List);
            printf("以下是链表中的元素\n");
            Print_LinkList(List_head);
            break;
        case 3:
            printf("输入你想删除的结点的后继结点\n");
            scanf("%d",&deleteNode);
            DeleteAfter_LinkList(GetData_LinkList(List_head, deleteNode));
            printf("以下是链表中的元素\n");
            Print_LinkList(List_head);
            break;
        case 4:
            printf("以下是链表中的元素\n");
            Print_LinkList(List_head);
            break;
        case 0:
            printf("程序退出");
            return 0;
        default:
            printf("你输入的功能序号不合法\n");
            break;
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值