安徽某高校《数据结构》作业6

设计一个测试应用程序完成如下功能:

(1)建立单链表L;依次插入数据元素13,5,27,9,32,123,76,98,54,87;直至数据元素为32767为止;

(2)查找单链表L的第3个数据元素;

(3) 查找数据元素76;

(4)在第4个位置上插入数据元素56;输出插入数据后的单链表;

(5)删除单链表l的第7个元素;输出删除数据后的单链表;

(6)删除单链表l中值为76的第一个元素;输出删除数据后的单链表;

(7)求单链表的长度并输出;

函数命名要求:

1)建立单链表createlinklist()

2)按序号查找getelem1(Lndoe *l,int I)值为76的元素

3)按元素值查找getelem2(Lndoe *l,int I)

4)插入数据元素linklistinsert(Lndoe *l,int I,int e)

在单链表l的第i个位置上插入新的元素e。

5)按序号删除linklistdelete1(Lndoe *l,int i)

删除单链表l的第i个元素。

6)按值删除linklistdelete2(Lndoe *l,int e)

7)  求单链表的长度(链表中元素的个数)linklistlength(Lnode *l)

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

typedef struct node {
    int data;
    struct node* next;
} Lnode;

Lnode* createlinklist();
void printlist(Lnode* L);
int getelem1(Lnode* L, int i);
int getelem2(Lnode* L, int e);
Lnode* linklistinsert(Lnode* L, int i, int e);
Lnode* linklistdelete1(Lnode* L, int i);
Lnode* linklistdelete2(Lnode* L, int e);
int linklistlength(Lnode* L);

Lnode* L;

int main(void) 
{
    printf("请输入链表初始元素,以32767结束:\n");
    L = createlinklist();
    printf("\n(1)\n");
    printf("链表成功建立为:\n");
    printlist(L);

    printf("\n(2)\n");
    printf("链表的第三个数据元素为:%d\n", getelem1(L, 3));

    printf("\n(3)\n");
    printf("链表元素76的位置为:第%d个\n", getelem2(L, 76));

    printf("\n(4)\n");
    printf("在第4个位置上插入数据元素56:\n");
    L = linklistinsert(L, 4, 56);
    printlist(L);

    printf("\n(5)\n");
    printf("删除链表L的第7个元素:\n");
    L = linklistdelete1(L, 7);
    printlist(L);

	printf("\n(6)\n");
    printf("删除链表L的值为76的元素:\n");
    L = linklistdelete2(L, 76);
    printlist(L);

    printf("\n(7)\n");
    printf("链表的长度为:%d\n", linklistlength(L));

    return 0;
}

Lnode* createlinklist() 
{
    Lnode* L = (Lnode*)malloc(sizeof(Lnode));
    L->next = NULL;
    Lnode* r = L;
    int n;
    while (1) {
        scanf("%d", &n);
        if (n == 32767)
            break;
        Lnode* p = (Lnode*)malloc(sizeof(Lnode));
        p->data = n;
        r->next = p;
        r = p;
    }
    r->next = NULL;
    return L;
}

void printlist(Lnode* L) 
{
    Lnode* q = L->next;
    while (q != NULL) {
        printf("%d ", q->data);
        q = q->next;
    }
    printf("\n");
}

int getelem1(Lnode* L, int i) 
{
    Lnode* p = L->next;
    int j = 1;
    while (p && j < i) {
        p = p->next;
        j++;
    }
    if (!p || j > i) {
        printf("位置%d不存在\n", i);
        return -1;
    }
    return p->data;
}

int getelem2(Lnode* L, int e) 
{
    Lnode* p = L->next;
    int i = 1;
    while (p && p->data != e) {
        p = p->next;
        i++;
    }
    if (p) {
        return i;
    }
    printf("元素%d不存在\n", e);
    return -1;
}

Lnode* linklistinsert(Lnode* L, int i, int e) 
{
    Lnode* p = L;
    int j = 0;
    while (p && j < i - 1) {
        p = p->next;
        j++;
    }
    if (!p || j > i - 1) {
        printf("插入位置%d不存在\n", i);
        return L;
    }
    Lnode* new_node = (Lnode*)malloc(sizeof(Lnode));
    new_node->data = e;
    new_node->next = p->next;
    p->next = new_node;
    return L;
}

Lnode* linklistdelete1(Lnode* L, int i) 
{
    Lnode* p = L;
    int j = 0;
    while (p->next && j < i - 1) {
        p = p->next;
        j++;
    }
    if (!p->next || j > i - 1) {
        printf("删除位置%d不存在\n", i);
        return L;
    }
    Lnode* temp = p->next;
    p->next = temp->next;
    free(temp);
    return L;
}

Lnode* linklistdelete2(Lnode* L, int e) 
{
    Lnode* p = L;
    while (p->next && p->next->data != e) {
        p = p->next;
    }
    if (p->next) {
        Lnode* temp = p->next;
        p->next = temp->next;
        free(temp);
    } else {
        printf("元素%d不存在\n", e);
    }
    return L;
}

int linklistlength(Lnode* L) 
{
    int length = 0;
    Lnode* p = L->next;
    while (p) {
        length++;
        p = p->next;
    }
    return length;
}

运行结果:

(个人答案,如有错误或改进建议欢迎联系作者)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值