c++课程设计《链表的实现-增删改查》
- 格式:doc
- 大小:386.00 KB
- 文档页数:29
C语⾔单链表的基本操作(增删改查)这是尾插法单链表,单链表⽐较适合⽤来做队列和栈,因为在链表的头和尾时的增删改查的时间复杂度为O(1),⽽在链表内部的增删改查的平均时间复杂度为O(n)。
#include "stdio.h"#include "stdlib.h"//提供malloc()和free()#include "string.h"#include "time.h"//提供strcpy(),time()等//1.⽤结构体创建链表节点//⼀个⽤来存放数据,另⼀个存放指针struct Node{int data; //数据域struct Node* next; //指针域(指向节点的指针)};//2.全局定义链表头尾指针,⽅便调⽤struct Node* head = NULL;struct Node* end = NULL;//3.向链表添加数据void AddListTill(int a ){//创建⼀个节点struct Node* temp = (struct Node*)malloc(sizeof(struct Node)); //此处注意强制类型转换//节点数据进⾏赋值temp->data = a;temp->next = NULL;//连接分两种情况1.⼀个节点都没有2.已经有节点了,添加到尾巴上if(NULL == head){head = temp;//end=temp;}else{end->next=temp;//end=temp; //尾结点应该始终指向最后⼀个}end=temp; //尾结点应该始终指向最后⼀个}//4.遍历链表并输出void ScanList(){struct Node *temp = head; //定义⼀个临时变量来指向头while (temp != NULL){printf("%d\n",temp->data);temp = temp->next; //temp指向下⼀个的地址即实现++操作}}//5.查找指定的数据是否在链表内struct Node* FindNode(int a ){struct Node *temp = head;while(temp != NULL){if(a == temp->data){return temp;}temp = temp->next;}//没找到return NULL;}//6.删除链表void FreeList(){struct Node *temp = head; //定义⼀个临时变量来指向头while (temp != NULL){struct Node* pt = temp;temp = temp->next; //temp指向下⼀个的地址即实现++操作free(pt); //释放当前}//头尾清空,不然下次的头就接着0x10head = NULL;end = NULL;}//7.在指定位置处插⼊数据void AddListRand(int index,int a){if (NULL == head){printf("链表没有节点\n");return;}struct Node* pt = FindNode(index);if(NULL == pt) //没有此节点{printf("没有指定节点\n");return;}//有此节点//创建临时节点,申请内存struct Node* temp =(struct Node *)malloc(sizeof(struct Node));//节点成员进⾏赋值temp->data = a;temp->next = NULL;//连接到链表上 1.找到的节点在尾部 2.找到的节点在中间if (pt == end){//尾巴的下⼀个指向新插⼊的节点end->next = temp;//新的尾巴end = temp;}else{//先连后⾯(先将要插⼊的节点指针指向原来找到节点的下⼀个) temp->next = pt->next;//后连前⾯pt->next = temp;}}//8.删除链表末尾数据void DeleteListTail(){if (NULL == end){printf("链表为空,⽆需删除\n");return;}//链表不为空//链表有⼀个节点if (head == end){free(head);head = NULL;end = NULL;}else{//找到尾巴前⼀个节点struct Node* temp = head;while (temp->next != end){temp = temp->next;}//找到了,删尾巴//释放尾巴free(end);//尾巴迁移end=temp;//尾巴指针为NULLend->next = NULL;}}//9.删除链表的第⼀个数据void DeleteListHead(){ //记住旧头struct Node* temp = head;//链表检测if (NULL == head){printf("链表为空\n");return;}head = head->next; //头的第⼆个节点变成新的头free(temp);}//10.删除链表指定的数据void DeleteListRand(int a){//链表判断是不是没有东西if(NULL == head){printf("链表没东西\n");return;}//链表有东西,找这个节点struct Node* temp = FindNode(a);if(NULL == temp){printf("查⽆此点\n");return;}//找到了,且只有⼀个节点if(head == end){free(head);head = NULL;end = NULL;}else if(head->next == end) //有两个节点{//看是删除头还是删除尾if(end == temp){DeleteListTail();}else if(temp == head){DeleteListHead();}}else//多个节点{//看是删除头还是删除尾if(end == temp)DeleteListTail();else if(temp == head)DeleteListHead();else//删除中间某个节点{ //找要删除temp前⼀个,遍历struct Node* pt = head;while(pt->next != temp){pt=pt->next;}//找到了//让前⼀个直接连接后⼀个跳过指定的即可 pt->next = temp->next;free(temp);}}}//主函数void main(){struct Node *pFind;srand((unsigned)time(NULL));int i;//创建20个节点for(i = 0; i < 20; i++)AddListTill(i); //添加数据//AddListTill(rand());AddListRand(4,86); //在指定位置4增加节点14//DeleteListHead(); //删除⼀个头结点//DeleteListTail(); //删除⼀个尾结点DeleteListRand(4); //删除4节点ScanList(); //遍历输出链表//FreeList(); //删除链表pFind = FindNode(5); //查找5节点if (pFind != NULL){printf("找到%d\n",pFind->data); //找到节点并且输出该节点数据 }else{printf("No Find!\n");}}以下是排序算法的时间和空间复杂度表:。
单链表的插入、删除、合并等基本操作一、实验目的1、理解数据结构中单链表的定义和建立。
2、掌握单链表中结点结构的C语言描述。
3、熟练掌握单链表的插入、删除和修改等算法的设计与C语言实现。
4、将理论与实际相结合,切实提高自己的逻辑能力和动手能力。
二、设计内容1、输入单链表长度,创建一个单链表。
2、对建立好的单链表进行插入操作。
3、对建立好的单链表进行删除操作。
4、对建立好的单链表进行合并操作。
三、概要设计抽象数据类型线性表的定义如下:ADTA List{数据对象:D={ai I ai∈ElemSet , i=1 ,2 , … , n n>=0 }数据关系:R1={<ai-1 , ai> I ai-1 , ai∈D , i=2 , … , n }基本操作:Creates( &L )操作结果:构建一个空的线性表L。
Insertsl( &L , k ,i)初始条件:线性表L已存在。
操作结果:在带有头结点单链表的第k个元素之前插入元素i。
Deletesl( &L , i, j )初始条件:线性表L已存在。
操作结果:删除指定位置j元素i。
Hebing( &L )初始条件:线性表L已存在。
操作结果:清除新链表中相同的元素。
}ADT List四、算法流程图五、算法源代码#include <stdio.h> #include <malloc.h>typedef struct node {int data;struct node *next; }node;node *head;int k;node * creates(){node *p,*s,*h;int j=1,x, n;p=h=(node*)malloc(sizeof(node));h->next=NULL;printf("请输入链表长度:");scanf("%d",&n);printf("请输入 %d 个数字创建链表:",n);while(j<=n){scanf("%d",&x);s=(node*)malloc(sizeof(node));s->data=x;p->next=s;p=s;j++;}p->next=NULL;return h;}void insertsl(node *head, int k, int i){/*在带有头结点单链表的第k个元素之前插入元素i*/ int j;node *p, *t;p=head;j=0;while ( p&&j<k-1 ) /*若p不指向空,并且没有找到合适位置则继续循环*/ {p = p->next;j++;}if (!p||j>k-1) /*k小于1或大于表长*/printf("插入位置不对。
#include <stdio.h>#include <stdlib.h>#define NULL 0structstu{long id;float score;structstu *next;};void judge(long num){}structstu *creat(structstu *s){s=(stu *)malloc(sizeof(stu));s->next=NULL;return s;}void show(structstu *head){stu *p1;p1=head->next;printf("Show all stus:\n");if (!p1){printf("NULL!!");}while(p1){printf("%ld\t%.2f\n",p1->id,p1->score);p1=p1->next;}printf("---------------\n");}void insert(structstu *head){stu *p1;int n;printf("Enter the students number:\n");scanf("%d",&n);for (int i=0;i<n;i++){p1=(structstu *)malloc(sizeof(structstu));printf("id:");scanf("%ld",&p1->id);printf("score:");scanf("%f",&p1->score);p1->next=head->next;head->next=p1;}}int modify(structstu *head){longnum;float score;stu *p1;p1=head->next;printf("Enter the modify id:");scanf("%ld",&num);while(p1){if (num==p1->id){printf("Insert score:\n");printf("score:");scanf("%f",&score);p1->score=score;return 0;}p1=p1->next;}printf("Input Error!\n");return 0;}int del(structstu *head){longnum;int n=1;stu *p1,*p2;p2=p1=head->next;printf("Enter the del id:");scanf("%ld",&num);while(p1){if (num==p1->id){if (n==1){head->next=p1->next;free(p1);}else{for (int i=1;i<n-1;i++){p2=p2->next;}p2->next=p1->next;}return 0;}p1=p1->next;n++;}printf("Input Error!\n");return 0;}int main(){structstu *head=0,*s=0;//创建空head=creat(s);//插入insert(head);show(head);//修改modify(head);show(head);//删除del(head);show(head);return 0;}。
c 课程设计链表一、教学目标本节课的学习目标主要包括以下三个方面:1.知识目标:学生需要掌握链表的基本概念,了解链表的原理和结构,熟悉链表的基本操作,如创建、插入、删除和遍历。
2.技能目标:学生能够运用链表知识解决实际问题,具备使用链表编程的能力。
3.情感态度价值观目标:培养学生对计算机科学的兴趣,提高学生分析问题和解决问题的能力,培养学生的团队合作精神。
二、教学内容本节课的教学内容主要包括以下几个部分:1.链表的基本概念和原理:介绍链表的定义、特点和应用场景,让学生了解链表作为一种数据结构的重要性。
2.链表的结构和操作:讲解链表的结构,包括节点结构和链表的创建、插入、删除和遍历等基本操作。
3.链表的应用:通过实例分析,让学生学会如何运用链表解决实际问题,提高编程能力。
三、教学方法为了实现本节课的教学目标,我们将采用以下几种教学方法:1.讲授法:教师讲解链表的基本概念、原理和操作,引导学生掌握链表知识。
2.案例分析法:分析实际案例,让学生学会运用链表解决具体问题。
3.实验法:让学生动手实践,完成链表的创建、插入、删除和遍历等操作,提高编程能力。
4.小组讨论法:分组讨论,培养学生的团队合作精神和沟通能力。
四、教学资源为了支持本节课的教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:提供相关章节,为学生提供系统的链表知识。
2.参考书:为学生提供更多的学习资料,拓展知识面。
3.多媒体资料:制作PPT等课件,直观展示链表的结构和操作。
4.实验设备:为学生提供电脑等实验设备,进行链表操作实践。
五、教学评估为了全面、客观、公正地评估学生的学习成果,我们将采取以下评估方式:1.平时表现:关注学生在课堂上的参与程度、提问回答、小组讨论等,记录学生的表现,占总成绩的30%。
2.作业:布置与链表相关的编程练习,检查学生的理解和掌握程度,占总成绩的20%。
3.考试:安排一次链表知识考试,测试学生对链表概念、原理和操作的掌握,占总成绩的50%。
实现链表的插入和删除操作(C++)链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
链表的特点是插入和删除操作的时间复杂度为O(1),即常数时间复杂度。
这使得链表在需要频繁进行插入和删除操作的场景下非常高效。
在C++中,可以通过定义一个节点类来实现链表的插入和删除操作。
节点类包含一个数据成员和一个指向下一个节点的指针成员。
具体实现如下:```cppclass Node {public:int data;Node* next;};class LinkedList {private:Node* head;public://构造函数,初始化链表为空LinkedList() {head = nullptr;}//插入操作,在链表头部插入一个节点void insert(int value) {Node* newNode = new Node; newNode->data = value;newNode->next = head;head = newNode;}//删除操作,删除链表中第一个匹配给定值的节点void remove(int value) {Node* curr = head;Node* prev = nullptr;while (curr != nullptr && curr->data != value) { prev = curr;curr = curr->next;}if (curr == nullptr) {//未找到匹配的节点return;}if (prev == nullptr) {//要删除的节点为头节点head = curr->next;}else {//要删除的节点不为头节点prev->next = curr->next;}delete curr;}};```上述代码定义了一个链表类LinkedList,其中包含了插入和删除操作的实现。
C语⾔如何建⽴链表并实现增删查改详解前⾔以下是本⼈完成的⼀个C语⾔建⽴链表并进⾏增删查改操作的程序,为⽅便学习,本⼈将整个程序分为头⽂件和主函数两部分:1.头⽂件(函数部分)(1)初始化函数#include <stdio.h>#include <stdlib.h>typedef struct {int *head;int length;int capacity;} Toslist; //Toslist类型//初始化顺序表Toslist initSeqlist() {Toslist list;list.length = 0;list.capacity = 5;list.head = (int *)malloc(10 * sizeof(int));if (!list.head){printf("初始化失败!\n");exit(0);}return list;}(2)打印函数//打印顺序表void displayList(Toslist list) {for (int i = 0; i < list.length; i++) {printf("%d ", list.head[i]);}printf("\n");}(3)插⼊函数//插⼊元素Toslist add(Toslist list, int elem, int pos) {if (list.length == list.capacity) {int *temp = (int *)realloc(list.head, (list.capacity + 1) * sizeof(int));//判断空间是否⾜够,不够就另建链表//不直接⽤head⽽引⼊temp的作⽤:防⽌空间分配失败导致head失去原来的链表if (!temp) {list.head = temp;list.capacity += 1;}}//插⼊位置及以后的元素后移for (int i = list.length - 1; i >= pos; i--) {list.head[i + 1] = list.head[i];}list.head[pos] = elem;list.length ++;return list;if (pos > list.length || pos < 0)printf("插⼊位置错误!\n");return list;}(4)删除函数//删除元素Toslist delete(Toslist list, int pos) {for (int i = pos; i < list.length - 1; i++) {list.head[i] = list.head[i + 1];}list.length--;return list;if (pos < 0 || pos > list.length) {printf("删除位置有误!\n");return list;}}(5)查找函数//查int search(Toslist list, int elem) { //elem是查找的元素//顺序查找for (int i = 0; i < list.length; i++) {if (elem == list.head[i]) {return i;}}return 0;}(6)替换函数//改Toslist modify(Toslist list, int elem, int val) { //val是要替换它的元素int pos = search(list, elem); //获取要替换元素的位置list.head[pos] = val;return list;}2.主函数int main() {Toslist list = initSeqlist();int Addpos = -1, Addnum, Delpos, Serachnum,Modifynum;printf("请输⼊5个整数元素\n");for (int i = 0; i < 5; i++) {scanf("%d", &list.head[i]);list.length++;}printf("顺序表中的元素有:\n");displayList(list);//插⼊元素printf("要在哪个元素后插⼊元素?\n");while (Addpos < 0 || Addpos > list.length) {scanf("%d", &Addpos);if (Addpos < 0 || Addpos > list.length)printf("请输⼊正确的位置!\n");};printf("请输⼊需要插⼊的元素:\n"); scanf("%d", &Addnum);printf("在顺序表的第%d个元素后插⼊元素%d得到\n", Addpos, Addnum); list = add(list, Addnum, Addpos);displayList(list);//删除元素printf("要删除顺序表下标顺序中哪个元素?\n"); scanf("%d", &Delpos); printf("删除后得到:\n");list = delete(list, Delpos);displayList(list);//查找printf("请输⼊需要查找的元素\n"); scanf("%d", &Serachnum);int pos = search(list, Serachnum);if(pos)printf("元素%d的位置为第%d个\n", Serachnum, pos+1);if(!pos){printf("表中⽆该元素\n");}//修改printf("请输⼊需要修改的元素:\n");scanf("%d",&Serachnum);printf("请输⼊要替换的数:\n");scanf("%d",&Modifynum);printf("将%d修改为%d得到:\n", Serachnum, Modifynum);list = modify(list, Serachnum, Modifynum);displayList(list);free(list.head);list.head = NULL;return 0;}以上程序本⼈已调试完毕,若程序有繁杂之处,欢迎批评指正!总结以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。
注释最全的C语⾔链表的增删改查 1//这是C语⾔的写法,但会报错,原因是len(当前的节点长度)2//⽆法在insert(插⼊)和deleted(删除)之后改变3//不能使⽤delete是因为delete是C++中的⼀个运算符4//最终我把改程序⽤C++写了⼀遍,运⽤引⽤将len的真实值改变了5 #include <stdio.h>6 #include <stdlib.h>7 typedef int ElementType;8 typedef struct node {9 ElementType data;10struct node *pNext;//指向下⼀个结点的指针11 }Node, *pNode;//这⾥NODE等价于struct node、、PNODE等价于struct Node*1213 pNode Create_List(int len);14 pNode change(pNode pHead,int len);15void ergodic(pNode pHead,int len);16 pNode insert(pNode pHead,int *len);17int main() {18 pNode pHead = NULL;//创建⼀个头结点19int len;//⽤来存放有效节点字数20 printf("请输⼊节点个数:");21 scanf("%d", &len);22 pHead = Create_List(len);//创建⼀个单链表,并将该链表的头指针赋值给pHead23 pNode p;//创建⼀个移动指针,指向需要访问的结点242526 ergodic(pHead,len);//遍历数据输出27 p = change(pHead,len);//修改节点的数据28 ergodic(pHead,len);//遍历数据输出29 p = insert(pHead,&len);//插⼊⼀个节点30 printf("此时len为:%d", len);31 printf("\n插⼊成功\n");32 ergodic(pHead,len);//遍历数据输出33return0;34 }35363738 pNode Create_List(int len)//这⾥⽤PNODE表⽰返回⼀个结构体类型的指针39 {40//创建链表4142 pNode pHead = (pNode)malloc(sizeof(Node));//分配⼀个不存放有效数据的头的头结点43//malloc返回的是⼀个节点,其中 (结构体类型的指针)malloc(sizeof(结构体的名称))44 pNode pTail = pHead;//定义⼀个尾指针,并初始化45 pTail->pNext = NULL;//将尾节点指针置空4647int i;48int val;49for (i = 0; i<len; i++) {50 printf("输⼊第%d个节点的数值:", i + 1);51 scanf("%d", &val);52 pNode pNew = (pNode)malloc(sizeof(Node));53//给下⼀个节点分配空间54 pNew->data = val;//1.先把值赋给下⼀个结点55 pTail->pNext = pNew;//新的节点的指针域pTail的指针域56 pNew = NULL;//把为节点的指针域置空57 pTail = pTail->pNext;//将尾指针+1指向最后⼀个节点58 }59return pHead;//返回⼀个链表的头指针60 }61//++++++++++++++++++++++++++++++62void ergodic(pNode pHead, int len) {63//遍历数据输出64 pNode p;65 p = pHead;//将移动指针指向头结点66int j;67for (j = 0; j<len; j++) {68 p = p->pNext;69 printf("第%d个节点的数值是:%d\n", (j + 1), p->data);70 }71 }7273//++++++++++++++++++++++++++++++74 pNode change(pNode pHead, int len) {75//修改节点的数据76 pNode p;77 p = pHead;78int value;79 printf("修改节点的数据\n");80int k;81for (k = 0; k<len; k++) {82 p = p->pNext;83 printf("输⼊第%d个结点要修改的数据:", k + 1);84 scanf("%d", &value);85 p->data = value;86 }87return pHead;88 }89//+++++++++++++++++++++++++++++90//插⼊节点91 pNode insert(pNode pHead, int *len) {92 pNode p;93 p = pHead;94 printf("输⼊在第⼏个节点(头结点不算)后插⼊:");95int m;96 scanf("%d", &m);97int i;98for (i = 0; i<m; i++) {99 p = p->pNext;100 }101 pNode e = (pNode)malloc(sizeof(Node));102 e->pNext = NULL;103 printf("请输⼊该节点的数值:");104int n;105 scanf("%d", &n);106 e->data = n;107 e->pNext = p->pNext;108 p->pNext = e;109 len++;110return pHead;111 }112//+++++++++++++++++++++++++++++++113//+++++++++++++++++++++++++++++114//删除节点115 pNode delete(pNode pHead,int len){116 pNode p;117 pNode q;118 p=pHead;119 printf("请输⼊要删除第⼏个节点(不包含头结点)"); 120int k;121 scanf("%d",&k);122int i;123for(i=0;i<k-1;i++){124 p=p->pNext;125 }126 q=p->pNext;127 p->pNext=q->pNext;128free(q);129 q=NULL;130return pHead;131 }。
c 增删查改课程设计一、课程目标知识目标:1. 学生能够理解并掌握数据库中“增删查改”的基本概念和原理;2. 学生能够运用所学知识,对数据库进行有效的增加、删除、查找和修改操作;3. 学生了解“增删查改”在实际应用场景中的作用和重要性。
技能目标:1. 学生能够独立进行数据库“增删查改”操作,提高数据处理能力;2. 学生能够通过编程实现“增删查改”功能,培养实际操作能力;3. 学生能够运用所学技能解决实际问题,提高问题解决能力。
情感态度价值观目标:1. 学生培养对信息技术的兴趣和热情,认识到其在社会发展中的重要性;2. 学生养成合作学习、积极探索的良好习惯,形成自主学习的能力;3. 学生在掌握“增删查改”技能的过程中,体会信息技术的实用性和价值,增强自信心。
分析课程性质、学生特点和教学要求,本课程将目标分解为以下具体学习成果:1. 学生能够熟练运用数据库软件进行“增删查改”操作;2. 学生能够通过编程语言(如Python)实现简单的“增删查改”功能;3. 学生能够在实际案例中,运用所学知识解决实际问题,提高信息处理和分析能力;4. 学生在课程学习中,形成积极的学习态度和价值观,为未来深入学习信息技术打下坚实基础。
二、教学内容1. 数据库基本概念:介绍数据库的定义、作用、分类及其应用场景,使学生了解数据库的基础知识。
2. 数据库表结构设计:讲解表的结构、字段、数据类型等概念,指导学生如何设计合理的数据库表结构。
3. 增加数据:教授如何在数据库中添加新数据,包括使用数据库软件和编程语言(如Python)实现增加操作。
- 数据库软件操作:学习使用数据库软件进行增加数据操作;- 编程实现:学习使用Python等编程语言编写增加数据的代码。
4. 删除数据:教授如何从数据库中删除不需要的数据,包括使用数据库软件和编程语言实现删除操作。
- 数据库软件操作:学习使用数据库软件进行删除数据操作;- 编程实现:学习使用Python等编程语言编写删除数据的代码。
C语⾔链表结构(2)——单链表的增删改查单向链表的增删改查:1. 设计链表节点由于链表节点需要数据域以及指针域(存放着不同类型的数据),所以将每⼀个节点设计成⼀个结构体。
结构体模型:struct data{ /* 数据域 */ ... /* 指针域 */ ...};例⼦1:每⼀个节点都存放着⼀个整型数据,那么结构体如何定义?struct list_node{ int a; //数据域 struct list_node *next; //指针域};2. 初始化链表 -> 搞⼀个链表头struct list_node *init_list_head(struct list_node *head) //head = NULL{ //为头节点申请空间 head = (struct list_node *)malloc(sizeof(struct list_node)); if(head == NULL) printf("head malloc error!\n"); //为头节点的指针域赋值 head->next = NULL; return head;}3. 尾插数据 -> 在链表末尾增加⼀个新的节点int tail_add_list(struct list_node *head,int num){ //为新节点申请空间 struct list_node *Node = NULL; Node = (struct list_node *)malloc(sizoef(struct list_node)); //为新节点赋值 Node->a = num; Node->next = NULL; //寻找最后⼀个节点,并尾插 struct list_node *p = NULL; for(p=head;p->next!=NULL;p=p->next); //从循环出来时,p->next=NULL,也就是说,p指向最后⼀个节点! p->next = Node; return 0;}4. 遍历链表int show_list_node(struct list_node *head){ struct list_node *p = NULL; for(p=head->next;p!=NULL;p=p->next) { printf("%d\n",p->a); } return 0;}5. 头插 -> 在头节点之后插⼊⼀个新的节点。
河南城建学院课程设计报告书专业:课程设计名称:《数据结构课程设计》题目:学号:姓名:同组人员:指导老师:完成时间:2012年2月17日摘要现在是信息爆炸的时代,整个生活空间都充斥着无尽的数据信息,随时随地都可能要存储一些信息,或者删除一些信息。
然而有时候又不确定信息的数量和对信息操作的不同需求,这时,有一个动态的存储的系统是很必须的。
这个系统要基本满足客户对信息的处理,诸如一些简单的操作:插入,删除,查找,输出,计数等,并且,这个系统要能够像电脑上的操作系统一样,能够执行很多操作之后,仍然能够回到主菜单界面,不能执行一个操作就需要重新启动,那样的话,先前存储的信息会丢失不说,对使用的客户来说,也很不方便。
所以,这时给用户更多的选择就很必要了。
本文采用C作为前台的开发工具,Visual C++6.0作为后台数据库平台,建立基于C/C++两层模式的链表操作系统,旨在实现对生活中一些信息进行基本简单高效的操作。
关键词:C,Visual C++6.0,链表,建表,查找,删除,插入,计数,输出目录目录 (1)第一章开发环境和开发工具 (1)1.1 C语言简介 (1)1.2 开发背景 (1)1.3 开发环境 (1)第二章算法思想 (3)2.1 系统需求分析 (3)2.2 系统总体设计 (3)2.2.1 系统设计目标 (3)2.2.2 开发设计思想 (3)2.2.3 系统功能模块设计 (4)2.3 算法思想描述 (6)第三章算法实现 (9)3.1 数据结构 (9)3.2 程序模块 (9)3.3 各模块之间的调用关系 (10)3.4 源程序代码 (12)第四章测试与分析 (21)4.1 测试数据选择 (21)4.2 测试结果分析 (23)总结 (24)心得体会 (25)参考文献 (26)第一章开发环境和开发工具1.1.1 C/ C ++语言简介C语言是一种计算机程序设计语言。
它既具有高级语言的特点,又具有汇编语言的特点。
C语言已先后被移植到大、中、小及微型机上。
它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。
它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画。
C语言具有简洁紧凑、灵活方便运算符丰富数据类型丰富语法限制不太严格,程序设计自由度大允许直接访问物理地址,对硬件进行操作生成目标代码质量高,程序执行效率高适用范围大,可移植性好等优点。
但它也有一定的缺点。
1.2 开发背景随着科学技术的不断发展,计算机科学日渐成熟,其强大的功能已为人们所深刻认识,它己进入人类社会的各个领域并发挥着越来越重要的作用。
采用计算机进行信息管理已成为社会生活中的普遍现象。
而数据信息管理的全面自动化、信息化则是其中重要的组成部分。
数据信息管理的好坏对于每个人来说都至关重要,在很大程度上影响着我们的生活质量。
因此,本文所研究的链表操作系统具有一定的使用价值和现实意义。
1.3 开发环境本文所采用的开发环境主要是基于C为开发工具,并以Visual C++6.0作为后台数据库平台的基于C/C++的双层管理模式。
在进入Visual C++6.0工作界面,选择建立Win 32 Console Application工程文件,并为该工程文件命名,确定后进入下一步,建立以C/C++为头文件的目标程序,并以.c为文件格式命名。
完成后,即可键盘录入源程序。
录入完成后,点击右上方“!”可以进行编译,并对该程序进行上机调试,直至程序能够完整并正确的运行出来。
第二章算法思想2.1 系统需求分析本程序为链表操作系统,是用自定义数据类型(结构体)及指针的应用来实现链表的建立,插入,查找,删除,计数,输出。
程序用结构体来记录数据信息。
数据由用户通过键盘输入,然后通过内存的动态应用来建立一个链表。
再通过指针的灵活应用来实现各项其他操作。
在建立系统的过程中,细节性的提示一定要全面到位,应为这是内存的动态应用,所以存在很大的变数,一定要让用户能够清楚的知道应该怎么做,并且能对用户的错误输入给出正确的提示,争取做到无论用户如何输入都会又回应,不能出现死机的状况。
2.2系统总体设计2.2.1 系统设计目标本文研究开发数据信息的链式动态存储来满足人们日常生活的需要,有以下三个方面的目标:●数据信息的多少没有上限。
●支持高效率完成人们日常生活中对信息的操作需求,包括新信息的插入,旧信息的查找和删除。
●支持动态管理要存储的信息,令人们能及时的对数据信息进行处理,提高生活效率等目标。
2.2.2开发设计思想基于以上系统设计目标,本文在开发链表操作系统时遵循了以下开发设计思想:●采用现有的软硬件环境及先进的链表操作系统开发方案,从而达到充分利用现有资源,提高系统开发水平和应用效果的目的。
●尽量达到操作过程中的直观、方便、实用、安全等要求。
●系统采用模块化程序设计方法,既便于系统功能的各种组合和修改,又便于未参与开发的技术维护人员补充、维护。
2.2.3 系统功能模块设计本系统分为六个模块:建表模块、插入模块、删除模块、查找模块、计数模块、输出模块。
●1.程序主要功能函数struct line * made (int *count) 实现链表的建立时间复杂度为O(n)struct line * Insert(struct line *head,int *count) 实现对链表进行插入操作时间复杂度为O(n)struct line * Delate(struct line *head,int *count) 实现对链表的已有信息的删除操作时间复杂度为O(n)void counter(int *count) 实现对链表数据信息个数统计操作时间复杂度为 O(1)void Search1(struct line *head,int *count) 实现按序号找结点的操作时间复杂度为O(n)void Search2(struct line *head,int *count) 实现按结点找序号的操作时间复杂度为O(n)void output(struct line *head,int Count) 实现对信息的输出操作时间复杂度为O(n)void main () 主函数●2.主流程图图2.2.3-12.3 算法思想描述在各个操作流程中,一定要考虑到用户的错误信息的输入,尽可能对用户的输入作出应该有的回应。
这就要求在各个模块中使用到很多的循环,对于循环变量的要求,也是一个很大的挑战,正如一下流程图所展示的:图2.3-1在用户输入要插入的位置时,一定要判断用户的输入是否合法:一个只有6个结点的链表,用户却要把新的结点插入到第9个结点的前面,显然这是不可能的,这时,就要要求用户重新输入,并且同时给用户正确的提示。
同时插入的过程中,利用循环找到要插入的位置,然后插入。
插入的时候,指针的变换必须是插入的元素的指针先指向下下一个,然后前面的指针指向这个。
如果不是这个顺序,就会丢失后面的部分链表。
所以这个也是一定要注意的。
同理,在删除的过程中,一定要判断用户的输入的是否合法。
因为删除的元素序号必须是链表范围的内的,超出这个范围是无法执行的。
在指针指向改动的时候,一定要注意是哪个指针的变换,不要删错元素。
图2.3-3查找时,会有两种查找,一种是输入结点值查找其序号;一种是输入序号,找结点值。
所以设置的变量order2用来让用户选择要查找的方式。
同时一定要给用户清晰的提示,实现用户所要达到的目标等。
第三章算法实现3.1 数据结构链表操作系统是一个内存动态应用系统,用户所有的要处理的数据信息都存储在链表中。
本系统采用结构体的形式来存储用户的信息,并且,大量的使用循环,来实现系统的多次使用。
3.2 程序模块在程序中又分为6个模块:建表模块、插入模块、删除模块、计数模块、输出模块、函数。
其中,查找模块又分为了两个模块:模块一:通过序号找结点void Search1(struct line *head,int *count)//按照给定序号查找函数//head为链表的头指针//整型指针count指向结点个数计数器void Search1(struct line *head,int *count){struct line *p;//接受链表头指针int i,j,e;//i用来存储用户要查找的结点的序号,j用来控制循环次数,e用来存储该结点的值printf ("请输入你要查找的结点的序号\n");scanf ("%d",&i);while(i<1||i>*count){printf("请输入正确的序号:\n");printf("%d~~%d\n",1,*count);printf ("请输入你要查找的元素的序号\n");scanf("%d",&i);}p=head;j=1;while (j!=i)//顺指针向后查找,直到p指向第i个元素或p为空{p=p->next;j++;}e=p->num;//取第i个元素printf("你要查找的元素值为%d\n",e);}模块二:通过结点找序号//给定数值查找其在链表中的位置即序号//head为链表的头指针//整型指针count指向结点个数计数器void Search2(struct line *head,int *count){int e,j,tell=0;//e用来存储用户要查找的结点的值,j用来控制循环,tell 判断是否找到了存储该值的结点struct line *p;//接受链表头指针printf ("请输入你要查找的元素值: \n");scanf ("%d",&e);p=head;j=1;for(j=1;j<=*count;j++){if(e==p->num){printf("你要查找的值的序号为%d.\n",j);//找到所查找值的位置即第j个元素tell++;p=p->next;}elsep=p->next;}if(tell==0)printf("您要查找的值不存在.\n");}3.3 各模块之间的调用关系主函数在用户不停止系统的情况下调用各个模块,从而实现用户的需求:图3.3-13.4 源程序代码#include <stdio.h>#include <stdlib.h>//结构体的定义struct line {int num;//用来存储已知的数据struct line *next;//用来指向下一个结点};//输出函数//head为链表头指针,Count为链表结点计数器void Output(struct line *head,int Count){struct line *p;//接受链表头指针int i=0;//控制下面的循环p=head;printf("链表中的元素值为:\n");for(i=0;i<Count;i++)//遍历链表{printf("%d ",p->num);p=p->next;}printf("\n");}//链表构造函数,返回值为指向struct line结构体的指针//参数为指向整型的指针count//作用:构建线性链表并计数//当输入的值为零时,默认结束输入struct line * made (int *count){struct line *p1=NULL,*p2=NULL;//建立链表的辅助指针struct line *head=NULL;p2=p1=(struct line *)malloc(sizeof(struct line));printf("输入0表示建表结束,请输入至少一个元素。