首页 > 其他分享 >数据结构 链表 C语言

数据结构 链表 C语言

时间:2024-10-22 19:21:34浏览次数:3  
标签:Node pre NULL C语言 int next 链表 printf 数据结构

数据结构第二章的链表

//线性表的链式存储
#include <stdlib.h>
#include <stdio.h>

typedef int ElemType;

typedef struct node {
    ElemType data;
    struct node *next;
} Node, *LinkList;

// 初始化空的单链表
void InitList(LinkList *L) {
    *L = (LinkList)malloc(sizeof(Node));
    (*L)->next = NULL;
}

// 头插法建表
void CreateFromHead(LinkList L) {
    Node *s;
    char c;
    int flag = 1;
    while (flag) {
        c = getchar();
        if (c!='$')
        {
        	s = (Node *)malloc(sizeof(Node));
        	s->data = c; // 直接存储字符
        	s->next = L->next;
        	L->next = s;
		}
        else 
        flag = 0;
    }
}

// 尾插法建表
void CreateFromTail(LinkList L) {
    Node *r, *s;
    int flag = 1;
    r = L;
    while (flag) {
        char c = getchar();
        if(c!='$')
        {
        	s = (Node*)malloc(sizeof(Node));
			s->data = c; // 直接存储字符
        	r->next = s;
        	r = s;
		}
		else
		{
			flag = 0;
			r->next = NULL; // 将最后一个结点的next置为空,表示链表结束
		}
        
    }
    
}

// 按值查找
Node *Locate(LinkList L, ElemType key) {
    Node *p = L->next;
    while (p != NULL) {
        if (p->data != key) {
            p = p->next;
        } else {
            return p;
        }
    }
}

//求单链表长度
int ListLength(LinkList L)
{
    Node *p = p->next;
    int j = 0;
    while (p!=NULL)
    {
        p = p->next;
        j++;
    }
    return j;
    
}

// 单链表插入
int InsList(LinkList L, int i, ElemType e) {
    Node *pre, *s;
    int k;
    if (i <= 0) return 0;
    pre = L;
    k = 0;
    while (pre != NULL && k < i - 1) {
        pre = pre->next;
        k = k+1;
    }
    if (pre == NULL) {
        printf("插入位置不合法\n");
        return 0;
    }
    s = (Node *)malloc(sizeof(Node));
    s->data = e; // 修正为 data
    s->next = pre->next;
    pre->next = s;
    return 1;
}

// 单链表删除操作
int DelList(LinkList L, int i, ElemType *e) {
    Node *pre, *r;
    int k;
    pre = L;
    k = 0;
    while (pre->next != NULL && k < i - 1) {
        pre = pre->next;
        k=k+1;
    }
    if (pre->next == NULL || k < i - 1) {
        printf("删除位置不合法\n");
        return 0;
    }
    r = pre->next;
    pre->next = r->next;
    *e = r->data; // 修正为 data
    free(r);
    return 1;
}

// 打印输出单链表
void print(LinkList L) {
    Node *p = L->next;
    if (p == NULL) {
        printf("空表!\n");
        return;
    }
    while (p != NULL) {
        printf("%c ", p->data); // 输出字符
        p = p->next;
    }
    printf("\n");
}

// 逆置链表
void ReverseList(LinkList L) {
    Node *prev = NULL, *curr = L->next, *next = NULL;
    while (curr != NULL) {
        next = curr->next; // 保存下一个节点
        curr->next = prev; // 反转当前节点的指针
        prev = curr;       // 移动 prev 和 curr
        curr = next;
    }
    L->next = prev; // 将头指针指向新的头节点
}

int main() {
    LinkList L;
    ElemType e;
    InitList(&L);
    if (L != NULL) printf("初始化成功!\n");

    int choice;
    while (1) {
        printf("\n请选择操作:\n");
        printf("1. 头插法创建链表\n");
        printf("2. 尾插法创建链表\n");
        printf("3. 查找元素\n");
        printf("4. 插入元素\n");
        printf("5. 删除元素\n");
        printf("6. 修改元素(未实现)\n");
        printf("7. 逆置链表\n");
        printf("8. 打印链表\n");
        printf("0. 退出程序\n");
        printf("请输入您的选择:");
        
        scanf("%d", &choice);
        getchar(); // 清除输入缓冲区的换行符

        switch (choice) {
            case 1:
                CreateFromHead(L);
                printf("头插法创建成功!\n");
                break;
            case 2:
                CreateFromTail(L);
                printf("尾插法创建成功!\n");
                break;
            case 3:
                printf("请输入要查找的元素:");
                scanf("%c", &e);
                if (Locate(L, e) != NULL) {
                    printf("元素 %c 找到!\n", e);
                } else {
                    printf("元素 %c 未找到!\n", e);
                }
                break;
            case 4:
                printf("请输入插入的位置和元素(格式:位置 元素):");
                int pos;
                scanf("%d %c", &pos, &e);
                if (InsList(L, pos, e)) {
                    printf("插入成功!\n");
                } else {
                    printf("插入失败!\n");
                }
                break;
            case 5:
                printf("请输入要删除的元素位置:");
                scanf("%d", &pos);
                if (DelList(L, pos, &e)) {
                    printf("删除元素:%c\n", e);
                } else {
                    printf("删除失败!\n");
                }
                break;
            case 6:
                printf("修改操作尚未实现。\n");
                break;
            case 7:
                ReverseList(L);
                printf("链表逆置成功!\n");
                break;
            case 8:
                print(L);
                break;
            case 0:
                printf("退出程序。\n");
                return 0;
            default:
                printf("无效选择,请重试。\n");
        }
    }

    return 0;
}

标签:Node,pre,NULL,C语言,int,next,链表,printf,数据结构
From: https://blog.csdn.net/a3551616800/article/details/143166311

相关文章

  • 奇偶序号分割单链表(C语言)
    算法思想:要想将单链表L按照奇偶序号分割为两个单链表A(奇),B(偶),我们便可以定义一个变量来记录当前遍历的结点序号的奇偶,两个指针ra,rb,ra负责将奇数位置结点赋到A中,rb同理核心代码:voiddevide(LinkListL,LinkListA,LinkListB){intindex=1;LNode*p=L->next;......
  • C语言学习第9天
    目录字符数组概念定义和初始化定义:初始化方式:二维字符数组字符串操作函数头文件:#include函数名:strlen(s)sizeof()和strlen()的区别函数名:strcmp(s1,s2)函数名:strcpy(s1,s2)函数名:strcat(s1,s2)函数名:void*memset(void*s,intc,size_tn);字符串输入gets()......
  • 数据结构实验1
    1//1.线性表顺序表的初始化ok2//2.输出ok,插入ok,删除ok,逆转ok,销毁ok,置空表ok(两种插入,两种删除)3//3.求表长ok,查找元素ok,判断是否为空ok4//4.实现顺序表元素的逆转并输出结果ok5//5.顺序表合并:动态创建两个有序的顺序表,输出合并后的顺序表6#include<cstdi......
  • 数据结构实验6-串及应用
    目录【id:54】【10分】A.串应用-计算一个串的最长的真前后缀【id:55】【10分】B.DS串应用—最长重复子串【id:56】【20分】C.子串循环问题(Ver.I)【id:53】【20分】D.DS串应用--串替换【id:52】【20分】E.DS串应用--KMP算法【id:57】【20分】F.可重叠子串(Ver.......
  • C语言中的初始化是什么意思
    在C语言中,初始化是指在定义变量时为其赋予初值的过程。通过初始化,可以确保变量在使用之前具有已知的初始值,避免了未初始化变量的不确定行为。初始化可以在变量定义时直接赋值,也可以通过赋予默认值或调用特定的初始化函数来完成。C语言中的初始化在C语言中,初始化是指在定义变......
  • ES6中的Set数据结构的常用方法和使用场景
    ES6中的Set数据结构Set是ES6中新增的数据结构,用于存储不重复的值,允许存储任何类型的唯一值。Set的核心特点是值唯一性,类似数学中的集合。常用方法1.add(value)添加值到Set中,如果值已存在则不会添加。constset=newSet();set.add(1);//Set{1}2.delete(v......
  • C语言使用指针作为函数参数,并利用函数嵌套求输入三个整数,将它们按大到小的顺序输出。(
    输入三个整数,要求从大到小的顺序向他们输出,用函数实现。   本代码使用到了指针和函数嵌套。   调用指针做函数ex,并嵌套调用指针函数exx在函数ex中。(代码在下面哦!)一、关于函数 ex  1. 这个函数接受三个指针参数 int*p1 、 int*p2 和 int*p3 ,分别指......
  • 160. 相交链表 Golang实现
    题目描述:给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。注意这里的相交节点表示的是值和物理位置都相同的节点,不仅仅是值相同。思路分析:假设链表A和链表B的长度分别为lenA和lenB,这个方法的奇妙之处......
  • C语言中如何实现链表
    文章开头:在C语言中,实现链表主要涉及以下几个步骤:定义链表的结点、创建链表、添加链表结点、删除链表结点、查找链表结点、打印链表和释放整个链表。我们以一个单链表为例,每一个结点包括两部分:一部分是数据域,存放元素的值;另一部分是指针域,存放下一个结点的地址。创建链表首先需要......
  • 如何在C语言中使用结构体进行数据管理
    #如何在C语言中使用结构体进行数据管理在C语言中,结构体是一种方便、高效的数据管理方式。结构体允许用户将不同类型的数据项组织在一起,它们常被用于代表一个有实体意义的数据集合。在使用结构体进行数据管理时,关键优势包括数据封装、类型安全、易于维护性。数据封装意味着可以......