C语言链表功能实现

合集下载

使用链表查询的程序流程C语言

使用链表查询的程序流程C语言

使用链表查询的程序流程C语言引言链表是一种常用的数据结构,用于存储和组织数据。

在C语言中,使用链表进行查询可以提高程序的灵活性和效率。

本文将介绍如何使用链表实现查询功能。

程序流程以下是使用链表查询的程序流程:1.定义链表结构–创建一个结构体用于定义链表的节点。

–结构体中包含两个成员变量:数据和指向下一个节点的指针。

2.创建链表–创建一个函数用于创建链表。

–在函数中,首先定义一个指向链表头部的指针,并将其初始化为NULL。

–通过循环创建链表节点,每次创建节点时,输入数据并将其加入链表。

–每个节点的指针指向下一个节点,最后一个节点的指针设置为NULL。

3.插入节点–创建一个函数用于在链表中插入节点。

–在函数中,首先创建一个新节点,并输入要插入的数据。

–将新节点的指针指向链表中需要插入的位置。

–修改前一个节点的指针,使其指向新节点。

–如果插入的是链表的头部,需要修改链表头指针。

4.删除节点–创建一个函数用于在链表中删除节点。

–在函数中,首先输入要删除的数据。

–遍历链表,找到要删除的节点位置。

–修改前一个节点的指针,使其指向要删除节点的下一个节点。

–释放要删除节点的内存空间。

5.查询节点–创建一个函数用于在链表中查询节点。

–在函数中,首先输入要查询的数据。

–遍历链表,找到要查询的节点位置。

–输出查询到的节点数据。

6.打印链表–创建一个函数用于打印链表中的所有节点。

–在函数中,遍历链表,输出每个节点的数据。

7.主函数–在主函数中,调用上述函数来完成具体的操作。

–可以通过调用创建链表函数来创建链表,也可以手动插入节点。

–可以调用查询节点和删除节点的函数来实现相应的功能。

–最后调用打印链表函数来输出链表中的所有节点数据。

总结使用链表查询的程序流程可以提供灵活性和效率,能够方便地插入、删除和查询数据。

通过定义链表结构、创建链表、插入/删除节点、查询节点和打印链表等步骤,可以实现基本的链表查询功能。

希望本文能够帮助读者理解如何使用链表实现查询的过程。

c语言中linklist类型

c语言中linklist类型

c语言中linklist类型LinkList类型是C语言中常用的数据结构之一,它是一种线性链表的实现方式。

在计算机科学中,链表是一种常见的数据结构,用于存储和操作一系列元素。

链表由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

链表中的第一个节点称为头节点,最后一个节点称为尾节点。

链表可以根据需要动态地增加或删除节点,相比于数组,链表的大小可以根据实际需求进行调整。

链表的实现可以使用不同的方式,其中最常见的是单向链表。

在单向链表中,每个节点只有一个指针,指向下一个节点。

这种实现方式简单且高效,适用于大多数场景。

除了单向链表,还有双向链表和循环链表等其他实现方式。

链表的优点是可以快速在任意位置插入或删除节点,而无需移动其他节点。

这是由于链表中的节点通过指针相互连接,而不是像数组那样连续存储。

另外,链表的大小可以根据需要进行动态调整,而数组的大小是静态的。

这使得链表在处理动态数据集合时非常有用。

然而,链表也有一些缺点。

首先,访问链表中的任意节点都需要从头节点开始遍历,直到找到目标节点。

这导致了链表的访问时间复杂度为O(n),而数组的访问时间复杂度为O(1)。

其次,链表需要额外的内存空间来存储指针信息,这会占用更多的存储空间。

在C语言中,可以使用结构体来定义链表节点,例如:```typedef struct Node {int data;struct Node *next;} Node;typedef struct LinkedList {Node *head;Node *tail;} LinkedList;```上述代码定义了一个包含数据和指针的节点结构体Node,以及一个包含头节点和尾节点指针的链表结构体LinkedList。

通过这样的定义,可以方便地进行链表的操作,比如插入、删除和遍历等。

链表的插入操作可以分为三步:创建新节点、修改指针、更新链表的头尾指针。

例如,插入一个新节点到链表末尾的代码如下:```void insert(LinkedList *list, int data) {Node *newNode = (Node *)malloc(sizeof(Node));newNode->data = data;newNode->next = NULL;if (list->head == NULL) {list->head = newNode;list->tail = newNode;} else {list->tail->next = newNode;list->tail = newNode;}}```链表的删除操作也类似,可以分为三步:找到目标节点、修改指针、释放内存。

c语言实现通讯录管理系统(用链表实现)

c语言实现通讯录管理系统(用链表实现)

c语⾔实现通讯录管理系统(⽤链表实现)题⽬:通讯录(通过链表实现)设计并实现⼀个简易的通讯录软件,管理个⼈通讯记录。

⼀条通讯记录可包括:姓名、⼯作单位、⼿机、住宅电话、E-Mail、家庭住址等(可⾃⾏增删,但不可过少)。

该系统应实现以下基本功能:(1)增加新的通讯记录。

(2)删除已有的通讯记录。

(3)修改已有的通讯记录。

(4)浏览全部或指定(如指定姓名、⼯作单位等)的通讯记录。

(5)合理组织排列各项功能,界⾯可使⽤键盘操作。

(6)以⽂件的形式存储数据。

说明:⼤⼀时的c语⾔课设,⽤链表实现⼀个通讯录管理系统,为了美观好看,花了很多时间调整齐度,记录⼀下⼤⼀时的作业。

其主要功能是对通讯录可输⼊,显⽰,插⼊,删除,最难是可保存,这个学⽂件的时候不怎么会。

内容我⾃⼰弄了7个,名字,性别,⼯作单位,⼿机,住宅电话,E-Mail,家庭住址(其他太多其实都是⼀样的,就懒得加了)。

主要运⽤到对指针中的链表的功能和使⽤要⽐较扎实,分部列写就可以了。

实现图⽚:附上代码:1 #include <stdio.h>2 #include <string.h>3 #include <stdlib.h>4 typedef struct student5 {6char name[20];//名字7char wm[20];//性别8char work[100];//⼯作单位9char stel[20];//⼿机10char htel[20];//住宅号码11char mail[20];//E-Mail12char home[100];//家庭住址13struct student *next;14 }stu;15 stu *head;//头指针16void screen()//主菜单17 {18 printf("\n=======================================================\n");19 printf(" 欢迎来到通讯录管理系统\n\n");20 printf(" 1.输⼊数据 2.显⽰数据\n");21 printf(" 3.插⼊数据 4.删除数据\n");22 printf(" 5.查看数据 6.修改数据\n");23 printf(" 7.保存数据 8.返回主菜单\n");24 printf("\n~~~~~~输~~~~~~⼊~~~~~~9~~~~~~退~~~~~~出~~~~~~程~~~~~~序\n");25 }26void input()//输⼊数据27 {28int ans;//判断是否继续输⼊29 stu *p1,*p2;30 p1=(stu *)malloc(sizeof(stu));//申请内存来⽤31if(p1!=NULL)32 {33 printf("========输⼊数据========\n");34 head=p1;35while(1)36 {37 printf("名字:");38 scanf("%s",&p1->name);39 printf("性别:");40 scanf("%s",&p1->wm);41 printf("⼯作单位:");42 scanf("%s",&p1->work);43 printf("⼿机:");44 scanf("%s",&p1->stel);45 printf("住宅号码:");46 scanf("%s",&p1->htel);47 printf("E-Mail:");48 scanf("%s",&p1->mail);49 printf("家庭地址:");50 scanf("%s",&p1->home);51 printf("===================================\n");52 p2=p1;53 p1=(stu *)malloc(sizeof(stu));//申请下⼀个要⽤的空间54if(p1!=NULL)55 p2->next=p1;56 printf("请选择是否继续输⼊:1.继续 2.退出\n请选择:");//⽤户选择57 scanf("%d",&ans);58if(ans==1)//继续59continue;60else//退出61 {62 printf("========输⼊完毕========\n");63 p2->next=NULL;64free(p1);//将申请的的⽆⽤内存释放65break;66 }67 }68 }69 }70void look(stu *p1)//显⽰数据71 {72 printf("========显⽰数据========\n");73while(p1!=NULL)74 {75 printf("名字:%s\n",p1->name);76 printf("性别:%s\t",p1->wm);77 printf("⼯作单位:%s\t",p1->work);78 printf("⼿机:%s\t",p1->stel);79 printf("住宅号码:%s\t",p1->htel);80 printf("E-Mail:%s\t",p1->mail);81 printf("家庭住址:%s\n",p1->home);82 printf("=====================================\n");83 p1=p1->next;84 }85 printf("========显⽰完毕========\n");86 }87void insert()//插⼊数据88 {89int ans;//选择插⼊位置90char name[20];//插⼊者的名字91 printf("========插⼊数据========\n");92 stu *p1,*p2,*p3;93 p1=head;94 p3=(stu *)malloc(sizeof(stu));//申请内存95 p3->next=NULL;96 printf("请输⼊插⼊者的数据:\n");97 printf("名字:");98 scanf("%s",&p3->name);99 printf("性别:");100 scanf("%s",&p3->wm);101 printf("⼯作单位:");102 scanf("%s",&p3->work);103 printf("⼿机:");104 scanf("%s",&p3->stel);105 printf("住宅号码:");106 scanf("%s",&p3->htel);107 printf("E-Mail:");108 scanf("%s",&p3->mail);109 printf("家庭地址:");110 scanf("%s",&p3->home);111 printf("请选择插⼊位置:1.⾸位置插⼊ 2.尾部插⼊ 3.插到某⼈前⾯\n请选择:");112 scanf("%d",&ans);113switch(ans)114 {115case1://放到头指针116 p3->next=p1;117 head=p3;118break;119case2://放到尾部120while(p1->next!=NULL)121 p1=p1->next;122 p1->next=p3;123break;124case3://放到某⼈前⾯125 printf("请输⼊插到谁前⾯名字:");126 scanf("%s",name);127while(strcmp(name,p1->name)!=0)128 {129 p2=p1;130 p1=p1->next;131 }132 p2->next=p3;133 p3->next=p1;134break;135 }136 printf("========插⼊成功========\n");137 }138void deleted()//删除数据139 {140 stu *p1,*p2;141char name[20];//删除者名字142 printf("========删除数据========\n");143 printf("请输⼊要删除者的名字:");144 scanf("%s",name);145 p1=head;146if(head==NULL)//通讯录已经没数据了147 {148 printf("通讯录⾥什么也没有了。

《数据结构(C语言版)》严蔚敏代码实现———链表

《数据结构(C语言版)》严蔚敏代码实现———链表

《数据结构(C语⾔版)》严蔚敏代码实现———链表⼀、前⾔哈喽,⼤家好~我是熊⼦q,我⼜来了!他来了他来了,他带着代码过来了!今天要分享的代码是链表!快快搬着⼩板凳!⼆、代码严奶奶的书中预定义了⼀些预定义常量和类型,⼤家可以 新建⼀个y.h⽂件粘贴以下内容, 然后再去复制代码哦。

y.h⽂件内容:/*** 严奶奶书中的预定义常量和类型**///函数结果状态代码#define TRUE 1 //成功#define FALSE 0 //失败#define OK 1 //成功#define ERROR 0 //错误#define INFEASIBLE -1 //不可实⾏#define OVERFLOW -2 //溢出//Status 是函数的类型,其值是函数结果状态代码typedef int Status;链表LinkList.cpp:#include "y.h"#include <iostream>#include <cstdlib>#include <cstdio>using namespace std;typedef int ElemType;/*** 严奶奶单链表的实现* by 熊⼦q 2021.2.1**/typedef struct LNode{ElemType data;struct LNode *next;}LNode,*LinkList;//获取元素Status GetElem(LinkList L, int i, ElemType &e){//L为带头结点的单链表的头指针//当第i个元素存在时,其值赋给e并返回OK,否则返回ERRORLNode *p = L->next; //p指向第⼀个结点int j = 1; //j为计数器while(p && j<i){ //寻找第i个位置p = p->next;++j;}if(!p || j>i) return ERROR; //第i个元素不存在e = p->data; //否则获取第i个元素return OK;}//插⼊元素,时间复杂度O(n)Status Insert(LinkList &L, int i, ElemType e){//在带头结点的单链表L中第i个位置之前插⼊元素eLNode *p = L;int j = 0;while(p && j<i-1){p = p->next;++j;}if(!p || j>i-1) return ERROR; //i⼩于1或者⼤于表长加1LNode *q = (LNode*)malloc(sizeof(LNode));q->data = e; //插⼊数据q->next = p->next;p->next = q;return OK;}//删除元素,时间复杂度O(n)Status ListDelete(LinkList &L, int i, ElemType e){//在带头结点的单链表L中,删除第i个元素,并由e返回其值LNode *p = L->next;int j = 1;while(p && j<i-1){p = p->next;++j;} //寻找i的前驱元素if(!(p->next) || j>i-1) return ERROR; //删除位置不合理,i元素不存在或 LNode *q = p->next; //删除第i个位置元素,并释放该结点 p->next = q->next;e = q->data;free(q);return OK;}//创建链表void CreateList(LinkList &L, int n){//逆序输⼊n个元素的值,建⽴带头结点的单链表LL = (LinkList)malloc(sizeof(LNode));L->next = NULL; //建⽴⼀个头结点printf("请输⼊数据:\n");for(int i=n;i>0;--i){LNode *p = (LNode*)malloc(sizeof(LNode));scanf("%d",&(p->data));p->next = L->next; L->next = p;}}//合并两个有序链表void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc){//已知单链表La和Lb的元素按值⾮递减排列//归并La和Lb得到新的单链表Lc,Lc的元素也按值⾮递减排列LNode *pa = La->next;LNode *pb = Lb->next;LNode *pc = La; //⽤La的头结点作为Lc的头结点Lc = pc;while(pa && pb){//取⼆者中较⼤值添加到Lc中if(pa->data > pb->data){//先添加该节点为pc的后继元素,然后pc和pa指针都后移pc->next = pa; pc = pc->next; pa = pa->next;}else{pc->next = pb; pc = pc->next; pb = pb->next;}}pc->next = pa? pa: pb; //插⼊剩余段free(Lb); //释放Lb的头结点}//输出单链表void Display(LinkList &L){LNode *p = L->next;printf("单链表的内容为:");while(p){printf("%d",p->data);if(p->next) printf("->");else printf("\n");p = p->next;}}int main(){LinkList l;CreateList(l, 5);Display(l);// printf("在第%d位插⼊%d",1,123);// Insert(l, 1, 123);// Display(l);int tmp;GetElem(l, 2, tmp);printf("%d",tmp);return 0;}三、运⾏截图四、附录如果你想看其他的代码,下⾯有链接哦:。

c语言递归反转链表

c语言递归反转链表

在C语言中,递归反转链表的代码实现相对简洁。

下面是一个实现链表反转的递归函数示例:#include <stdio.h>#include <stdlib.h>// 定义链表节点结构体typedef struct ListNode {int val;struct ListNode *next;} ListNode;// 递归函数,用于反转链表ListNode* reverseList(ListNode* head) {// 递归的基准情况:如果链表为空或者只有一个节点,返回原节点if (head == NULL || head->next == NULL) {return head;}// 递归地反转剩下的链表部分ListNode* newHead = reverseList(head->next);// 将当前节点的next指向null(因为它现在是链表的最后一个节点)head->next->next = head;head->next = NULL;// 返回新的头节点return newHead;}// 辅助函数,用于创建链表ListNode* createList(int[] values, int size) {ListNode* head = NULL;for (int i = size - 1; i >= 0; --i) {ListNode* newNode = malloc(sizeof(ListNode));newNode->val = values[i];newNode->next = head;head = newNode;}return head;}// 打印链表void printList(ListNode* head) {while (head != NULL) {printf("%d ", head->val);head = head->next;}printf("\n");}int main() {int values[] = {1, 2, 3, 4, 5};int size = sizeof(values) / sizeof(values[0]);ListNode* originalHead = createList(values, size);printf("Original list: ");printList(originalHead);ListNode* reversedHead = reverseList(originalHead);printf("Reversed list: ");printList(reversedHead);// 释放链表内存ListNode* current = originalHead;while (current != NULL) {ListNode* temp = current;current = current->next;free(temp);}return 0;}这段代码首先定义了一个链表节点结构体ListNode。

c语言超时重发机制的链表

c语言超时重发机制的链表

c语言超时重发机制的链表C语言超时重发机制的链表引言:在网络通信中,超时重发机制是一种常见的应对网络延迟和丢包的技术手段。

本文将介绍如何使用C语言实现一个超时重发机制的链表,以及其原理和应用。

一、超时重发机制的链表超时重发机制的链表是一种数据结构,用于管理需要进行超时重发的数据包。

它的主要特点是可以按照发送顺序进行管理,并且能够自动检测超时并进行重发操作。

二、链表的基本结构链表是由一系列节点组成的数据结构,每个节点包含一个数据域和一个指针域。

在超时重发机制的链表中,每个节点代表一个数据包,并且需要额外包含超时时间和重发次数等信息。

三、链表的初始化在使用链表之前,需要进行初始化操作。

初始化操作主要包括创建链表头节点,并将头节点的指针域置空。

四、数据包的插入在发送数据包时,将数据包插入到链表的末尾。

这需要遍历链表,找到最后一个节点,并将其指针域指向新节点。

五、超时检测与重发超时检测是链表中的重要操作,用于判断是否有数据包超时。

当一个数据包超时时,需要将其重新发送,并更新超时时间和重发次数等信息。

六、数据包的删除当一个数据包发送成功后,需要从链表中删除。

删除操作需要遍历链表,找到对应的节点,并更新前后节点的指针域。

七、链表的销毁当所有数据包都发送完成或不再需要重发时,需要销毁链表。

销毁链表操作主要包括释放所有节点的内存空间,并将链表头节点的指针域置空。

八、超时重发机制的应用超时重发机制在网络通信中广泛应用于保证数据可靠性和提高传输效率。

例如,在TCP协议中,超时重发机制被用于保证数据包的可靠传输。

九、注意事项在实现超时重发机制的链表时,需要注意以下事项:1. 设置合理的超时时间,以适应不同的网络环境。

2. 避免重复发送已经成功发送的数据包,以节省网络带宽和资源。

3. 考虑异常情况,如网络中断或故障,需要对链表进行适当的处理。

结论:超时重发机制的链表是一种实现超时重发的重要数据结构。

它可以有效地应对网络延迟和丢包等问题,提高数据传输的可靠性和效率。

C语言程序设计实验实验报告7

C语言程序设计实验实验报告7

C语言程序设计实验实验报告7实验名称:链表实现学生信息管理系统实验目的:通过设计链表实现学生信息管理系统,掌握链表的操作方法及其应用。

实验内容:设计一个学生信息结构体,包括学号、姓名、性别、年龄和成绩五个成员变量,并选择链式结构存储这些数据。

实现以下功能:1. 添加学生信息:从键盘输入学号、姓名、性别、年龄和成绩等信息,添加到链表中。

2. 删除学生信息:从链表中删除指定学号的学生信息。

5. 按成绩排序:按学生的成绩从高到低排序,并输出所有学生的信息。

7. 退出程序:退出学生信息管理系统。

实验方法:1. 设计学生信息结构体,定义链表节点结构体,并编写初始化链表和销毁链表的函数。

2. 编写添加学生信息函数,新建链表节点并插入链表末尾。

3. 编写删除学生信息函数,根据学号查找需要删除的节点,先将该节点从链表中删除,再释放节点空间。

4. 编写修改学生信息函数,根据学号查找需要修改的节点,并修改其成员变量。

6. 编写按成绩排序函数,使用冒泡排序法对链表进行排序,并输出所有学生的信息。

7. 编写输出所有学生信息函数,遍历链表并输出每个节点的信息。

8. 完成学生信息管理系统的主函数,实现菜单及相应功能的选择。

实验结果:依次选择菜单中的各个功能,添加、修改、删除、查找、排序和输出学生信息都能实现。

经测试,程序稳定运行,功能正常,符合需求。

本次实验主要让我们掌握了链式结构的概念、链表节点的定义、链表的初始化、插入、查找、删除和销毁链表的操作方法,以及在实际应用中如何使用链表来实现数据管理。

虽然链表操作相对于数组稍微有些繁琐,但其可以灵活处理数据结构的长度变化,具有更高的可扩展性和更好的操作效率,可以更好的适应各种实际需求。

在实验中,还需要注意节点指针的正确使用、各个函数之间的调用关系和输入输出数据格式的合理选择等问题,以保证程序能够正常运行。

同时,还需要保持认真细致的态度,严格按照实验需求和要求来完成每个步骤,以达到更好的实验效果和运行效率。

哈希链表的c语言实现

哈希链表的c语言实现

哈希链表的c语言实现哈希链表的C语言实现哈希链表是一种常用的数据结构,用于存储和操作大量的数据。

它结合了哈希表和链表的特点,具有快速查找和高效插入删除的优势。

本文将介绍如何使用C语言实现哈希链表,并详细讲解其原理和操作。

一、哈希链表的原理哈希链表是通过哈希函数将数据的键映射到一个唯一的索引位置,然后使用链表来解决哈希冲突。

哈希函数可以是简单的取模运算,也可以是复杂的算法,关键在于保证映射的唯一性和均匀性。

二、哈希链表的结构在C语言中,我们可以使用结构体来定义哈希链表的节点和链表本身。

节点包含一个键值对,即存储的数据和对应的键,以及一个指向下一个节点的指针。

链表则包含一个指向第一个节点的指针。

```c// 定义哈希链表节点typedef struct Node {int key;int value;struct Node* next;} Node;// 定义哈希链表typedef struct HashTable {int size;Node** table;} HashT able;```三、哈希链表的操作1. 初始化哈希链表在初始化哈希链表时,需要指定链表的大小,并分配相应大小的内存空间。

同时,需要将每个节点的指针初始化为空。

2. 插入节点插入节点时,首先通过哈希函数计算出节点的索引位置,然后将节点插入到对应索引位置的链表中。

如果该位置已经存在节点,则将新节点插入到链表的头部。

3. 查找节点查找节点时,也需要通过哈希函数计算出节点的索引位置,然后遍历链表,找到对应的节点。

如果找到了节点,则返回节点的值;否则,返回空。

删除节点时,首先通过哈希函数计算出节点的索引位置,然后遍历链表,找到对应的节点并删除。

需要注意的是,删除节点时需要维护链表的连续性。

四、示例代码下面是一个简单的示例代码,演示了如何使用C语言实现哈希链表的初始化、插入、查找和删除操作。

```c#include <stdio.h>#include <stdlib.h>// 初始化哈希链表HashTable* initHashTable(int size) {HashTable* ht = (HashTable*)malloc(sizeof(HashTable));ht->size = size;ht->table = (Node**)malloc(sizeof(Node*) * size);for (int i = 0; i < size; i++) {ht->table[i] = NULL;}return ht;}void insertNode(HashTable* ht, int key, int value) { int index = key % ht->size;Node* newNode = (Node*)malloc(sizeof(Node)); newNode->key = key;newNode->value = value;newNode->next = ht->table[index];ht->table[index] = newNode;}// 查找节点int findNode(HashTable* ht, int key) {int index = key % ht->size;Node* cur = ht->table[index];while (cur) {if (cur->key == key) {return cur->value;}cur = cur->next;}return -1;}void deleteNode(HashTable* ht, int key) { int index = key % ht->size;Node* cur = ht->table[index];Node* pre = NULL;while (cur) {if (cur->key == key) {if (pre) {pre->next = cur->next;} else {ht->table[index] = cur->next; }free(cur);return;}pre = cur;cur = cur->next;}}int main() {HashTable* ht = initHashTable(10);insertNode(ht, 1, 10);insertNode(ht, 2, 20);insertNode(ht, 11, 30);printf("%d\n", findNode(ht, 1));printf("%d\n", findNode(ht, 2));printf("%d\n", findNode(ht, 11));deleteNode(ht, 2);printf("%d\n", findNode(ht, 2));free(ht->table);free(ht);return 0;}```五、总结本文介绍了哈希链表的C语言实现,并详细讲解了其原理和操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<stdio.h>#define MaxSize 10#define error 0typedef int ElemType;typedef struct{ElemType elem[MaxSize];int last;}SeqList;void Input(SeqList *L);//Input the list void Output(SeqList L);//Output the list void Search(SeqList L);//Search element void Insert(SeqList *L);void Delete(SeqList *L);void Sort(SeqList *L);void bubblesort(SeqList *L);void selectsort(SeqList *L);void Function();int main(){int i,flag=1,k;ElemType e;SeqList L;st=0;Function();printf("Please pick an option: ");scanf("%d",&k);while(flag){switch(k){case 0:{flag=0;break;}case 1:{Input(&L);break;}case 2:{Output(L);break;}case 3:{Insert(&L);break;}case 4:{Search(L);break;}case 5:{Delete(&L);break;}case 6:{bubblesort(&L);break;}case 7:{selectsort(&L);break;}default :{printf("\nOption is useless.Please input again.");break;}}if(flag){printf("\nPlease pick an option: ");scanf("%d",&k);}}return 0;}void Input(SeqList *L){int i,n;printf("Please input the sum of elements:\n");scanf("%d",&n);while(n>MaxSize){printf("Sum is bigger than MaxSize,please input again\n");scanf("%d",&n);}printf("Input the elements of list:\n");for(i=0;i<n;i++){scanf("%d",&L->elem[i]);L->last++;}}void Output(SeqList L){int i;printf("The elements of list is :\n");for(i=0;i<(st>MaxSize?MaxSize:st);i++){printf("%d ",L.elem[i]);}printf("\nThe length of list is:%d\n",st);}void Search(SeqList L){int i,flag=1;ElemType e;printf("Please input the number needed to search:");scanf("%d",&e);while(flag){for(i=0;i<st;i++){if(e==L.elem[i]){printf("The element %d is in the %dth .",e,i+1);flag=0;break;}}if(i==st){printf("The element %d is not exist.Please input again!\n",e);scanf("%d",&e);}}}void Insert(SeqList *L){int i,m,n,tab=0;//m represent the number inserted and n is location.if(L->last==MaxSize){printf("List is full.If you want to insert ,please input 1 ,or input 2!\n");int k=0,flag=0;scanf("%d",&k);while(k!=1||k!=2){printf("error choice.choose again.");scanf("%d",&k);}switch(k){case 1:{printf("Please input m(the number inserted) and n(the location)!\n");scanf("%d%d",&m,&n);tab=1;break;}case 2:{flag=1;break;}/*default :{printf("error choice.choose again.");break;}*/}if(flag)return;}else{printf("Please input the number inserted and the location!\n");scanf("%d%d",&m,&n);}while(n>L->last+2||n<0||n>MaxSize){printf("n is illegal.Please input agein!\n");scanf("%d",&n);}if(tab==1){for(i=L->last-1;i>=n;i--){L->elem[i]=L->elem[i-1];}}else{for(i=L->last;i>=n;i--){L->elem[i]=L->elem[i-1];}L->last++;}L->elem[n-1]=m;Output(*L);}void Delete(SeqList *L){printf("Input the number that you want to delete:");int k,i;//numberint tab=0,flag=0;scanf("%d",&k);for(i=0;i<L->last;i++){if(k==L->elem[i]){tab=1;break;}}switch(tab){case 0:{printf("%d is not exist!Do you want to delete again!Input 1 to delete,or 2.\n",k);scanf("%d",&k);while(!(k==1||k==2)){printf("error choice.choose again.");scanf("%d",&k);}switch(k){//int flag=0;case 1:{Delete(L);break;}case 2:{flag=1;break;}}if(flag) return ;break;}case 1:{for(i;i<L->last;i++){L->elem[i]=L->elem[i+1];}L->last--;break;}}//Output(*L);}void Sort(SeqList *L){printf("Please a number(1 is bulllesort ,or 2 selectsort) to choose a way to sort:");int k;scanf("%d",&k);while(!(k==1||k==2)){printf("Please input a right number:");scanf("%d",&k);}switch(k){case 1:{bubblesort(L);break;}case 2:{selectsort(L);break;}}}void bubblesort(SeqList *L){int i,j;printf("bubblesort is going to start...");ElemType t;for(i=1;i<L->last;i++){for(j=0;j<L->last-i;j++){if(L->elem[j]<L->elem[j+1]){t=L->elem[j];L->elem[j]=L->elem[j+1];L->elem[j+1]=t;}}}printf("bubblesort has done.");}void selectsort(SeqList *L){int i,j,k;ElemType t;for(i=0;i<L->last-1;i++){//控制次数k=i;//用k标记最小值值得下标for(j=i+1;j<L->last;j++){if(L->elem[j]<L->elem[k]){k=j;}}if(k!=i){//说明有比a[i]更小的值t=L->elem[i];L->elem[i]=L->elem[k];L->elem[k]=t;}}}/*101 2 3 4 5 6 7 8 9 0111 10*//*a b c d e f g h i j*/void Function(){printf("---------------------------------------------------\n");printf("------------------简单链表功能---------------------\n");printf("---------1.输入 2.输出------\n");printf("---------3.插入 4.查找------\n");printf("---------5.删除 6.冒泡排序--\n");printf("---------7.选择排序0.退出------\n");printf("---------------------------------------------------\n");}。

相关文档
最新文档