c++课程设计《链表的实现-增删改查》
C语言单链表的基本操作(增删改查)
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("插入位置不对。
C语言链表实现增删改查
#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课程设计链表
c 课程设计链表一、教学目标本节课的学习目标主要包括以下三个方面:1.知识目标:学生需要掌握链表的基本概念,了解链表的原理和结构,熟悉链表的基本操作,如创建、插入、删除和遍历。
2.技能目标:学生能够运用链表知识解决实际问题,具备使用链表编程的能力。
3.情感态度价值观目标:培养学生对计算机科学的兴趣,提高学生分析问题和解决问题的能力,培养学生的团队合作精神。
二、教学内容本节课的教学内容主要包括以下几个部分:1.链表的基本概念和原理:介绍链表的定义、特点和应用场景,让学生了解链表作为一种数据结构的重要性。
2.链表的结构和操作:讲解链表的结构,包括节点结构和链表的创建、插入、删除和遍历等基本操作。
3.链表的应用:通过实例分析,让学生学会如何运用链表解决实际问题,提高编程能力。
三、教学方法为了实现本节课的教学目标,我们将采用以下几种教学方法:1.讲授法:教师讲解链表的基本概念、原理和操作,引导学生掌握链表知识。
2.案例分析法:分析实际案例,让学生学会运用链表解决具体问题。
3.实验法:让学生动手实践,完成链表的创建、插入、删除和遍历等操作,提高编程能力。
4.小组讨论法:分组讨论,培养学生的团队合作精神和沟通能力。
四、教学资源为了支持本节课的教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:提供相关章节,为学生提供系统的链表知识。
2.参考书:为学生提供更多的学习资料,拓展知识面。
3.多媒体资料:制作PPT等课件,直观展示链表的结构和操作。
4.实验设备:为学生提供电脑等实验设备,进行链表操作实践。
五、教学评估为了全面、客观、公正地评估学生的学习成果,我们将采取以下评估方式:1.平时表现:关注学生在课堂上的参与程度、提问回答、小组讨论等,记录学生的表现,占总成绩的30%。
2.作业:布置与链表相关的编程练习,检查学生的理解和掌握程度,占总成绩的20%。
3.考试:安排一次链表知识考试,测试学生对链表概念、原理和操作的掌握,占总成绩的50%。
C语言链表实现增删改查
} 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() { struct stu *head=0,*s=0; //创建空 head=creat(s); //插入 insert(head); show(head); //修改 modify(head); show(head); //删除 del(head); show(head); return 0; }
printf("%ld\t%.2f\n",p1->id,p1->score); p1=p1->next; } printf("---------------\n"); } void insert(struct stu *head) { stu *p1; int n; printf("Enter the students number:\n"); scanf("%d",&n); for (int i=0;i<n;i++) {
#include <stdio.h> #include <stdlib.h> #define NULL 0 struct stu {
long id; float score; struct stu *next; }; void judge(long num) {
实现链表的插入和删除操作(C++)
实现链表的插入和删除操作(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语⾔如何建⽴链表并实现增删查改详解前⾔以下是本⼈完成的⼀个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语言链表的增删改查
注释最全的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增删查改课程设计
c 增删查改课程设计一、课程目标知识目标:1. 学生能够理解并掌握数据库中“增删查改”的基本概念和原理;2. 学生能够运用所学知识,对数据库进行有效的增加、删除、查找和修改操作;3. 学生了解“增删查改”在实际应用场景中的作用和重要性。
技能目标:1. 学生能够独立进行数据库“增删查改”操作,提高数据处理能力;2. 学生能够通过编程实现“增删查改”功能,培养实际操作能力;3. 学生能够运用所学技能解决实际问题,提高问题解决能力。
情感态度价值观目标:1. 学生培养对信息技术的兴趣和热情,认识到其在社会发展中的重要性;2. 学生养成合作学习、积极探索的良好习惯,形成自主学习的能力;3. 学生在掌握“增删查改”技能的过程中,体会信息技术的实用性和价值,增强自信心。
分析课程性质、学生特点和教学要求,本课程将目标分解为以下具体学习成果:1. 学生能够熟练运用数据库软件进行“增删查改”操作;2. 学生能够通过编程语言(如Python)实现简单的“增删查改”功能;3. 学生能够在实际案例中,运用所学知识解决实际问题,提高信息处理和分析能力;4. 学生在课程学习中,形成积极的学习态度和价值观,为未来深入学习信息技术打下坚实基础。
二、教学内容1. 数据库基本概念:介绍数据库的定义、作用、分类及其应用场景,使学生了解数据库的基础知识。
2. 数据库表结构设计:讲解表的结构、字段、数据类型等概念,指导学生如何设计合理的数据库表结构。
3. 增加数据:教授如何在数据库中添加新数据,包括使用数据库软件和编程语言(如Python)实现增加操作。
- 数据库软件操作:学习使用数据库软件进行增加数据操作;- 编程实现:学习使用Python等编程语言编写增加数据的代码。
4. 删除数据:教授如何从数据库中删除不需要的数据,包括使用数据库软件和编程语言实现删除操作。
- 数据库软件操作:学习使用数据库软件进行删除数据操作;- 编程实现:学习使用Python等编程语言编写删除数据的代码。
C语言链表结构(2)——单链表的增删改查
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. 头插 -> 在头节点之后插⼊⼀个新的节点。
c增删查改课程设计
c 增删查改课程设计一、教学目标本课程的教学目标是使学生掌握C语言的基本语法,能够进行简单的程序设计,具备基本的编程能力。
具体分为以下三个部分:1.知识目标:学生需要掌握C语言的基本语法,包括数据类型、运算符、控制结构、函数等。
2.技能目标:学生能够运用C语言进行简单的程序设计,包括输入输出、逻辑判断、循环控制等。
3.情感态度价值观目标:培养学生对计算机科学的兴趣,提高学生解决问题的能力,培养学生的创新意识。
二、教学内容教学内容以教材《C语言程序设计》为主线,分为以下几个部分:1.引言:介绍C语言的发展历程,特点和应用领域。
2.数据类型和运算符:讲解C语言的基本数据类型,运算符及其使用方法。
3.控制结构:讲解条件语句和循环语句的用法。
4.函数:讲解函数的定义、声明和调用,包括常用的库函数。
5.数组和字符串:讲解一维、多维数组和字符串的基本操作。
6.指针:讲解指针的概念和运用,包括指针与数组、指针与函数等。
7.结构体和联合:讲解结构体、联合和枚举的概念及应用。
8.文件操作:讲解文件的概念、文件的打开与关闭、文件的读写操作。
三、教学方法本课程采用讲授法、案例分析法和上机实践法相结合的教学方法。
1.讲授法:用于讲解C语言的基本语法和概念。
2.案例分析法:通过分析典型的编程案例,使学生掌握编程技巧和方法。
3.上机实践法:安排上机实验,让学生动手编写程序,巩固所学知识。
四、教学资源1.教材:《C语言程序设计》。
2.参考书:提供一些经典的C语言编程参考书籍,供学生自主学习。
3.多媒体资料:制作课件和教学视频,辅助学生理解难点知识。
4.实验设备:提供计算机实验室,让学生进行上机实验。
五、教学评估本课程的评估方式包括平时表现、作业、考试等部分,以全面客观地评价学生的学习成果。
1.平时表现:包括课堂参与度、提问回答、小组讨论等,占总评的20%。
2.作业:布置课后编程作业,让学生巩固所学知识,占总评的30%。
3.考试:包括期中考试和期末考试,期中考试占30%,期末考试占40%。
c增删查改课程设计
c 增删查改课程设计一、课程目标知识目标:1. 让学生掌握数据库中增删查改操作的基本概念和原理;2. 使学生了解增删查改操作在实际应用场景中的作用和意义;3. 帮助学生理解数据库表结构,并掌握如何通过SQL语句实现数据的增删查改。
技能目标:1. 培养学生运用所学知识,独立完成数据库中数据的增删查改操作;2. 提高学生通过分析问题,设计合适的数据库查询语句的能力;3. 培养学生运用数据库技术解决实际问题的能力。
情感态度价值观目标:1. 培养学生对数据库技术的兴趣和热情,激发学习积极性;2. 引导学生树立正确的信息伦理观,尊重数据隐私,遵循法律法规;3. 培养学生团队合作意识,提高沟通协调能力。
分析课程性质、学生特点和教学要求,本课程旨在使学生通过学习增删查改操作,掌握数据库基本技能,培养实际应用能力。
课程目标具体、可衡量,便于后续教学设计和评估。
在教学过程中,注重理论与实践相结合,激发学生学习兴趣,提高解决问题的能力。
同时,关注学生情感态度价值观的培养,使其成为具备良好职业素养的数据库技术人才。
二、教学内容本章节教学内容主要包括以下三个方面:1. 数据库基本概念与原理:- 数据库的定义、特点及分类;- 关系型数据库的基本概念,如表、字段、记录;- SQL语言的基本概念和作用。
2. 增删查改操作:- 数据库表结构的创建与修改;- 插入数据(INSERT)的语法和用法;- 删除数据(DELETE)的语法和用法;- 更新数据(UPDATE)的语法和用法;- 查询数据(SELECT)的语法和用法,包括单表查询、多表查询、嵌套查询等。
3. 实际应用案例与操作练习:- 结合实际场景,分析数据库增删查改操作的应用;- 设计教学案例,让学生动手操作,实现数据库的增删查改;- 针对不同需求,编写合适的SQL查询语句,提高学生解决问题的能力。
教学内容根据课程目标进行选择和组织,确保科学性和系统性。
在教学大纲中明确教学内容的安排和进度,结合教材章节,使学生能够循序渐进地掌握知识。
C语言实现的链表的增删查找
C语⾔实现的链表的增删查找1 #include <stdio.h>2 #include<malloc.h>34 typedef struct Node5 {6int val;7struct Node * pNext;8 }Node,* pNode;910 pNode creat_list();11void trevel_list(pNode);12void sort_list(pNode);13void insert_list(pNode,int,int);14int length_list(pNode);15int delete_list(pNode,int);16void search_list(pNode,int);1718void main()19 {20 pNode pHead = creat_list();21 printf("输⼊后信息如下:\n");22 trevel_list(pHead);23 printf("\n排序之后如下:\n");24 sort_list(pHead);25 trevel_list(pHead);26 printf("\n链表长度位:\n");27 printf("%d",length_list(pHead));28 printf("\n删除第三个数字为:\n");29 printf("%d",delete_list(pHead,3));30 printf("\n删除之后如下:\n");31 trevel_list(pHead);32 printf("\n删除之后链表长度为:\n");33 printf("%d",length_list(pHead));34 printf("\n在第5个位置插⼊⼀个节点\n");35 insert_list(pHead,5,15);36 printf("\n插⼊之后如下:\n");37 trevel_list(pHead);38 search_list(pHead,15);39 }4041 pNode creat_list()42 {43 pNode pHead,pTail,pNew;44int len,i;45 scanf("%d",&len);46 pHead = (pNode)malloc(sizeof(Node));47 pTail = pHead;48 pTail->pNext = NULL;49for (i = 0; i < len; i++)50 {51 pNew = (pNode)malloc(sizeof(Node));52 scanf("%d",&pNew->val);53 pTail->pNext=pNew;54 pTail = pNew;55 pTail->pNext = NULL;56 }57return pHead;58 }5960void trevel_list(pNode pHead)61 {62 pNode t = pHead->pNext;63while(t != NULL)64 {65 printf("%d ",t->val);66 t = t->pNext;67 }6970void sort_list(pNode pHead)71 {72 pNode p,q;73int i,j,temp,len;74 len=length_list(pHead);75for(i=0,p=pHead->pNext;i<len-1;i++,p=p->pNext) 76 {77for(j=i+1,q=p->pNext;j<len;j++,q=q->pNext) 78 {79if(p->val > q->val)80 {81 temp = p->val;82 p->val = q->val;83 q->val = temp;84 }85 }86 }87 }8889void insert_list(pNode pHead,int pos,int val)90 {91 pNode p,t;92int len = length_list(pHead);93if(pos>len)94 printf("插⼊失败\n");95else96 {97 p = pHead->pNext;98 pos--;99while(pos--)100 {101 p = p->pNext;102 }103 t = (pNode)malloc(sizeof(Node));104 t->val = val;105 t->pNext = p->pNext;106 p->pNext = t;107 }108 }109110int delete_list(pNode pHead,int pos)111 {112int i,val,len;113 pNode t,p=pHead;114 len = length_list(pHead);115if(pos>len)116 printf("删除失败\n");117else118 { pos--;119while(pos--)120 {121 p=p->pNext;122 }123 t = p->pNext;124 p->pNext = t->pNext;125 val = t->val;126free(t);127 }128return val;129 }130131int length_list(pNode pHead)132 {133int len = 0;134 pNode t = pHead->pNext;135while(t != NULL)136 {137 len++;138 t = t->pNext;140return len;141 }142143void search_list(pNode pHead, int val)144 {145 pNode p = pHead->pNext;146int n=0;147while(p!=NULL)148 {149 n++;150if(p->val == val)151 printf("\n链表第%d节点有%d这个值\n",n, val); 152 p=p->pNext;153 }154if(!n)155 printf("未找到\n");156 }。
C++链表,增删改查
C++链表,增删改查//// main.c// homework_linkList//// Created by jiumiao on 15/7/23.// Copyright (c) 2015年 jiumiao. All rights reserved.//#include <stdio.h>#include <stdlib.h>typedef struct _NPC{char name[20];int attack;int hp;}NPC;typedef struct _node{NPC data;struct _node *pNext;}Node;Node *head = NULL;//定义⼀个头节点//加⼊节点void addNode(){if (head == NULL) {//head申请⼀个内存空间head = malloc(sizeof(Node));printf("请输⼊NPC的名字攻击⼒⽣命值:\n");scanf("%s %d %d",head->,&head->data.attack,&head->data.hp);head->pNext=NULL;} else {Node *p = head;//指向头节点while (p->pNext != NULL) {p = p->pNext;}//申请内存空间p->pNext = malloc(sizeof(Node));p=p->pNext;printf("请输⼊NPC的名字攻击⼒⽣命值:\n");scanf("%s %d %d",p->,&p->data.attack,&p->data.hp);p->pNext = NULL;}printf("加⼊节点成功!\n");}//输出全部节点void printAllNode(){Node *q = head;//指向头节点while (q!=NULL) {printf("名字为:%s,攻击⼒:%d。
C语言链表的增删查改
C语⾔链表的增删查改⼩经验:在VS2017中,使⽤while(scanf(“%d”,&i)!= NULL){......}时,结束输⼊需要输⼊三次ctrl+z+空格func.h#include <stdlib.h>#include <string.h>typedef struct student {int number;struct student* pnext;}stu, *pstu;void list_print(pstu);//打印void list_head_insert(pstu*,pstu*,int);//头插法void list_tail_insert(pstu*, pstu*, int);//尾插法void list_sort_insert(pstu*, pstu*, int);//有序插⼊void list_delete(pstu*, pstu*, int);//节点删除func.c#include "func.h"void list_head_insert(pstu* pphead, pstu* pptail, int i){//头插法pstu pnew;pnew = (pstu)malloc(sizeof(stu));//申请空间memset(pnew,0,sizeof(stu));//初始化pnew->number = i;if (*pphead == NULL) {//链表为空,新节点既是头指针,⼜是尾指针*pphead = pnew;*pptail = pnew;}else {pnew->pnext = *pphead;//原有的链表头作为新节点的pnext*pphead = pnew;//新节点作为节点头}}void list_tail_insert(pstu* pphead, pstu* pptail, int i){//尾插法实现pstu pnew;pnew = (pstu)calloc(1, sizeof(stu));//calloc会进⾏空间初始化pnew->number = i;if (*pptail == NULL) {*pphead = pnew;*pptail = pnew;}else{(*pptail)->pnext = pnew;//新节点变成原有尾节点的pnext*pptail = pnew;//新节点变成尾节点}}void list_sort_insert(pstu* pphead, pstu* pptail, int i){//有序插⼊实现pstu pcur,ppre;//游标pcur = *pphead;ppre = *pphead;pstu pnew;pnew = (pstu)calloc(1, sizeof(stu));//calloc会进⾏空间初始化pnew->number = i;if (*pptail == NULL) {//链表为空*pphead = pnew;*pptail = pnew;}else if (i<(*pphead)->number)//⼩于头结点,类似头插法{pnew->pnext = *pphead;//原有的链表头作为新节点的pnext*pphead = pnew;//新节点作为节点头}else{while (pcur!=NULL){//插⼊中间if (i<pcur->number){ppre->pnext = pnew;pnew->pnext = pcur;break;}ppre = pcur;pcur = pcur->pnext;}if (pcur == NULL){//pcur为null,说明插⼊尾节点(*pptail)->pnext = pnew;*pptail = pnew;}}}void list_delete(pstu* pphead, pstu* pptail, int d) {//删除实现pstu ppre = *pphead, pcur = *pphead;if (*pphead == NULL) //链表为空{printf("List is empty\n");return;}else if(pcur->number==d)//头结点删除{*pphead = pcur->pnext;if (*pphead == NULL) {//删除节点后,链表为空 *pptail = NULL;}free(pcur);}else//删除中间和尾部{while (pcur != NULL){if (pcur->number == d){ppre->pnext = pcur->pnext;break;}ppre = pcur;pcur = pcur->pnext;}if (pcur==*pptail) //删除的是尾节点{*pptail = ppre;}if (pcur == NULL) //未找到节点{printf("This node is not in list\n");}else{free(pcur);}}}void list_print(pstu phead) {while (phead != NULL){printf("%3d", phead->number);phead = phead->pnext;}printf("\n");}main.c#include "func.h"int main() {pstu phead = NULL;pstu ptail = NULL;int i;while(scanf("%d",&i)!=EOF){//list_head_insert(&phead, &ptail,i);//头插法 //list_tail_insert(&phead, &ptail, i);//尾插法list_sort_insert(&phead, &ptail, i);//有序插⼊ }list_print(phead);while (scanf("%d", &i) != EOF) {list_delete(&phead, &ptail, i); list_print(phead);}system("pause");}。
1、链表之增、删、查实现(C语言)
1、链表之增、删、查实现(C语⾔)⼀、功能描述:可以创建节点并添加到链表中、查看链表中的所有节点、并可以删除特定的节点⼆、代码实现1、主函数main主要实现的是从后台键⼊不同的字符,执⾏对应的函数来实现特定的操作代码如下:int main(char argc, char *argv[]){char c;while (1){c = getchar(); //键⼊⼀个字符// printf("c = %c\n",c);printf("Usage:\n");printf("<l> List all the notes\n");printf("<a> Add a node to chains\n");printf("<d> Delete a node from chains\n");printf("<q> quit\n");printf("Enter the choise: \n");switch (c){case'l' :{list_all_notes(); //显⽰链表中所有的节点break;}case'a' :{add_a_node(); //链表中添加⼀个节点break;}case'd' :{delete_a_node(); //删除链表中的⼀个节点break;}case'q' : //退出死循环{return0;break;}defaut :{break;}}}return0;}2、add_a_node的主要作⽤创建⼀个节点,并初始化(节点分配内存、初始化节点name),最后调⽤add_note_to_chains函数把该节点添加到链表中,代码如下:1void add_a_node()2 {3char *str; //⽤来存放节点名字4char name[128]; //临时变量,键盘设置新节点的名字5 PT_Node ptNew; //指针变量,指向新的节点67 printf("Please enter name of node to be added : ");8 scanf("%s", name); //给新添加的节点取⼀个名字910 str = malloc(strlen(name) + 1); //为节点的名字分配空间11 strcpy(str, name);1213 ptNew = malloc(sizeof(T_Node)); //为新节点分配内存1415//初始化节点中的元素16 ptNew ->name = str; //节点中的name指向str17 ptNew ->pre = NULL;18 ptNew ->next = NULL;1920 add_note_to_chains(ptNew); //把该节点添加到链表中21 }3、add_note_to_chains主要实现的是把节点挂载到链表中,代码如下:static void add_note_to_chains(PT_Node ptNew){PT_Node ptCur;if (g_ptNodeHead == NULL){g_ptNodeHead = ptNew;//如果链表中没有⼀个节点,则头结点指向该节点}else{ptCur = g_ptNodeHead;while(ptCur ->next) //遍历找到当前节点的next元素为空{ptCur = ptCur ->next;}ptCur->next = ptNew; //把新的节点挂载到g_ptNodeHead链表中ptNew ->pre = ptCur;}}4、delete_a_node函数的主要功能是通过键⼊的name,索引到链表中对应的节点地址,最后调⽤delete_node函数删除(卸载)链表中对应的节点,代码如下:static void delete_a_node(){PT_Node ptFindName;char name[128];printf("Please enter the name of node to be deleted :");scanf("%s", name);ptFindName = get_name(name); //通过名字获得对应节点地址if (ptFindName == NULL){printf("Don't have this node\n");return;}delete_node(ptFindName); //删除链表中对应的节点}5、get_name函数的作⽤是通过节点name在链表中索引到其对应的节点地址,代码如下:PT_Node get_name(char *name){PT_Node ptCar;if (g_ptNodeHead == NULL){return NULL;}else{ptCar = g_ptNodeHead;do{if (strcmp (ptCar->name, name) == 0){printf("find \'%s\' from chain\n",name);return ptCar;}else{ptCar = ptCar->next;}}while (ptCar);printf("don't find \'%s\' from chain\n",name);return NULL;}}6、delete_node函数的主要作⽤是卸载链表中对应的节点,卸载细节如下图,其中ptCar为当前要被卸载的节点、ptPre为前⼀个节点、ptNext为后⼀个节点对应代码如下:static void delete_node(PT_Node ptDel){PT_Node ptCar;PT_Node ptPre;PT_Node ptNext;if (g_ptNodeHead == ptDel){g_ptNodeHead = ptDel->next;// return;}else{ptCar = g_ptNodeHead ->next;// printf("1111111111111\n");while(ptCar){if (ptCar == ptDel){//从链表中删除ptPre = ptCar ->pre;ptNext = ptCar ->next;ptPre->next = ptNext;// printf("22222222\n");if(ptNext){ptNext ->pre = ptPre;}break;}else{ptCar = ptCar->next;// printf("333333\n");}}}free(ptDel->name); //释放节点名字占⽤的内存free(ptDel); //释放节点占⽤的内存}7、list_all_notes显⽰链表中的所⽤节点,代码如下:static void list_all_notes(){PT_Node ptCar;ptCar = g_ptNodeHead;int i = 0;if (g_ptNodeHead == NULL){printf("\n");printf("There is no node in chain list!\n");printf("\n");}while(ptCar){printf("%02d : %s\n", i++, ptCar ->name);ptCar = ptCar ->next;}}8、完整代码实现1 #include <stdio.h>2 #include <stdlib.h>3 #include <string.h>45//定义⼀个节点6 typedef struct T_NODE{7char *name;8struct T_NODE *pre;9struct T_NODE *next;10 }T_Node, *PT_Node;1112static PT_Node g_ptNodeHead; //链表头1314static void add_note_to_chains(PT_Node ptNew)15 {16 PT_Node ptCur;17if (g_ptNodeHead == NULL)18 {19 g_ptNodeHead = ptNew;//如果链表中没有⼀个节点,则头结点指向该节点20 }21else22 {23 ptCur = g_ptNodeHead;24while(ptCur ->next) //遍历找到当前节点的next元素为空25 {26 ptCur = ptCur ->next;27 }2829 ptCur->next = ptNew; //把新的节点挂载到g_ptNodeHead链表中30 ptNew ->pre = ptCur;3132 }33 }3435void add_a_node()36 {37char *str; //⽤来存放节点名字38char name[128]; //临时变量,键盘设置新节点的名字39 PT_Node ptNew; //指针变量,指向新的节点4041 printf("Please enter name of node to be added : ");42 scanf("%s", name); //给新添加的节点取⼀个名字4344 str = malloc(strlen(name) + 1); //为节点的名字分配空间45 strcpy(str, name);4647 ptNew = malloc(sizeof(T_Node)); //为新节点分配内存4849//初始化节点中的元素50 ptNew ->name = str; //节点中的name指向str51 ptNew ->pre = NULL;52 ptNew ->next = NULL;5354 add_note_to_chains(ptNew); //把该节点添加到链表中55 }565758 PT_Node get_name(char *name)59 {60 PT_Node ptCar;61if (g_ptNodeHead == NULL)62 {63return NULL;64 }65else66 {67 ptCar = g_ptNodeHead;68do{69if (strcmp (ptCar->name, name) == 0)70 {71 printf("find \'%s\' from chain\n",name);72return ptCar;73 }74else75 {76 ptCar = ptCar->next;77 }78 }while (ptCar);7980 printf("don't find \'%s\' from chain\n",name);81return NULL;8283 }8485 }8687static void delete_node(PT_Node ptDel)88 {89 PT_Node ptCar;90 PT_Node ptPre;91 PT_Node ptNext;92if (g_ptNodeHead == ptDel)93 {94 g_ptNodeHead = ptDel->next;95// return;96 }97else{98 ptCar = g_ptNodeHead ->next;99// printf("1111111111111\n");100while(ptCar)101 {102if (ptCar == ptDel)103 {104//从链表中删除105 ptPre = ptCar ->pre;106 ptNext = ptCar ->next;107 ptPre->next = ptNext;108// printf("22222222\n");109if(ptNext)110 {111 ptNext ->pre = ptPre;112 }113break;114 }115else116 {117 ptCar = ptCar->next;118// printf("333333\n");119 }120 }121 }122free(ptDel->name); //释放节点名字占⽤的内存123free(ptDel); //释放节点占⽤的内存124 }125126static void delete_a_node()127 {128 PT_Node ptFindName;129char name[128];130131 printf("Please enter the name of node to be deleted :");132 scanf("%s", name);133134 ptFindName = get_name(name); //通过名字获得对应节点地址135if (ptFindName == NULL)136 {137 printf("Don't have this node\n");138return;139 }140141 delete_node(ptFindName); //删除链表中对应的节点142 }143144static void list_all_notes()145 {146 PT_Node ptCar;147 ptCar = g_ptNodeHead;148int i = 0;149if (g_ptNodeHead == NULL)150 {151 printf("\n");152 printf("There is no node in chain list!\n");153 printf("\n");154 }155while(ptCar)156 {157 printf("%02d : %s\n", i++, ptCar ->name);158 ptCar = ptCar ->next;159 }160 }161162int main(char argc, char *argv[])163 {164char c;165while (1)166 {167 c = getchar(); //键⼊⼀个字符168// printf("c = %c\n",c);169170 printf("Usage:\n");171 printf("<l> List all the notes\n");172 printf("<a> Add a node to chains\n");173 printf("<d> Delete a node from chains\n");174 printf("<q> quit\n");175 printf("Enter the choise: \n");176switch (c)177 {178case'l' :179 {180 list_all_notes(); //显⽰链表中所有的节点181break;182 }183case'a' :184 {185 add_a_node(); //链表中添加⼀个节点186break;187 }188case'd' :189 {190 delete_a_node(); //删除链表中的⼀个节点191break;192 }193case'q' : //退出死循环194 {195return0;196break;197 }198 defaut :199 {200201break;202 }203 }204 }205return0;206 }。
链表:用CC++实现单链表的增删改查
链表:⽤CC++实现单链表的增删改查最近复习了线性表,对链表这⼀部分遗忘最⼤,所以⼿动实现⼀下单链表的增,删,改,查,倒置等等加深理解,附上C++代码:#include<iostream>using namespace std;typedef struct LNode { //定义链表的结构int data;struct LNode* next;}LNode,*LinkList;void create(LinkList& l)// 头插法建⽴带头结点的链表,输⼊⼩于0的数值视为终⽌{l = (LinkList)malloc(sizeof(LNode));int x;l->next = NULL;cin >> x;do{LNode* s = (LNode*)malloc(sizeof(LNode));s->data = x;s->next = l->next;l->next = s;cin >> x;} while (x > 0);}void tailCreate(linkList& l){l = (linkList)malloc(sizeof(LNode));int data;l->next = NULL;cin >> data;linkList ptr = l;while (data > 0){linkList p = (linkList)malloc(sizeof(LNode));p->data = data;ptr->next = p;p->next = NULL;ptr = p;cin >> data;}}void dis(LinkList l) //输出链表{cout << "当前链表为:"<<endl;while (l->next != NULL){cout << l->next->data << "";l = l->next;}cout << endl;}LinkList insert(LinkList& l, int x) //头插法插⼊结点在链表开头{LNode* s = (LNode*)malloc(sizeof(LNode));s->data = x;s->next = l->next;l->next = s;return l;}int getNumber(LinkList l, int x)//按照值查找结点序号,返回序号{int i = 0;while (l != NULL){i++;if (l->data == x){cout << "find x=" << x << " ,num=" << i - 1 << endl;break;}l = l->next;}return i;}LNode* getElement(LinkList l, int no)//按照序号查找结点并返回结点{LNode* s = l->next;int j = 1;while (s->next != NULL && j < no){s = s->next;j++;}cout <<"find No."<<no<<" is "<< s->data << endl;return s;}void delect(LinkList& l, int no)//删除指定序号的节点{if (no == 1)//因为第⼀个元素的前驱结点是头结点,所以单独处理删除第⼀个元素的情况 {LNode* s = l;LNode* p = l->next;l->next = p->next;free(p);}else{LNode* s = getElement(l, no - 1); //先找到它的前驱结点LNode* p;p = s->next;s->next = p->next;cout << "delect " << p->data << " success" << endl;free(p);}}void reverseList(LinkList& l) //将链表倒序{LNode* s = (LNode*)malloc(sizeof(LNode));LNode* p = (LNode*)malloc(sizeof(LNode));s = l->next;l->next = NULL;while (s!= NULL){p = s->next;s->next = l->next;l->next = s;s = p;}}int main(void){LinkList l;int x, no;cout << "输⼊正整数插⼊链表,输⼊负整数后结束输⼊:" << endl;create(l);//输⼊链表dis(l); //输出链表cout << "输⼊要插⼊在链表前端的数值:" << endl;cin >> x;insert(l,x);dis(l);cout << "输⼊要查找的结点数值:" << endl;cin >> x;getNumber(l,x);//根据数组查找第⼀个对应的结点cout << "输⼊要查找的结点序号(1~n):" << endl;cin >> no;getElement(l,no);//根据序号查找对应的数值cout << "输⼊要删除的结点序号(1~n):" << endl; cin >> no;delect(l,no);//删除指定序号的结点dis(l);reverseList(l);//反转链表dis(l);}执⾏上述程序的输出如下:。
c语言链表的基本操作一(线性表链式存储结构的创建,链表元素的增加,删除,修改,查找)
c语⾔链表的基本操作⼀(线性表链式存储结构的创建,链表元素的增加,删除,修改,查找)#include<stdio.h> #include<malloc.h>typedef struct LNode{int data;struct LNode *next;};LNode *Init_LNode(){LNode *head;head=(LNode *)malloc(sizeof(LNode));head->next=NULL; return (head);}LNode *Create_LNode(LNode *head){//尾插创建LNode *newp,*p;int a; p=head;printf("请输⼊链表数据a:\n");scanf("%d",&a);while(a!=-1){newp=(LNode *)malloc(sizeof(LNode));newp->data=a;newp->next=NULL;p->next=newp;p=newp;scanf("%d",&a);}return head;}LNode *Insert_LNode(LNode *head){//头插 LNode *newp,*q;int a; printf("请输⼊要插⼊的数据:");scanf("%d",&a); while(a!=-1){newp=(LNode *)malloc(sizeof(LNode));newp->data=a;newp->next=head->next;//头插head->next=newp;scanf("%d",&a);}return head;}LNode *delete_byValue(LNode *head) {//按值删除LNode *p,*q;int e;printf("输⼊要删除的数:\n");scanf("%d",&e);q=head;p=head->next;while(p!=NULL&&p->data!=e){q=p; p=p->next;}if(p==NULL){printf("元素不存在\n");}else{q->next=p->next; free(p);}return head;}LNode *delete_byID(LNode *head){//要删除第⼏个元素LNode *p,*q; int i=0,j;printf("请输⼊要删除的第⼏个元素:\n"); scanf("%d",&j);q=head;p=head->next;while(p!=NULL&&i<j-1){q=p; p=p->next; i++;}if(p==NULL){printf("你要删除的不存在\n");}else{q->next=p->next; free(p);}return head;}void print(LNode *head){LNode *p; p=head->next;while(p!=NULL){printf("%d ",p->data);p=p->next; }printf("\n");}int main(){LNode *head;head=Init_LNode();head=Create_LNode(head);print(head); head=Insert_LNode(head); print(head);//输出 //head=delete_value(head); head=delete_byID(head); print(head); return 0;}。
c语言中链表进行增删查改的知识
c语言中链表进行增删查改的知识链表是一种常用的数据结构,可以用来存储一系列数据元素,并且可以实现对数据的增删查改操作。
在C语言中,链表的实现通常使用指针来进行。
我们来了解一下链表的基本概念。
链表由一个个节点组成,每个节点包含两部分:数据域和指针域。
数据域用来存储数据元素,而指针域则用来指向下一个节点。
链表的头节点是链表的第一个节点,而尾节点则指向NULL,表示链表的结束。
链表的插入操作可以在任意位置插入一个新节点。
具体步骤如下:1. 创建一个新节点,并为其分配内存空间。
2. 将新节点的数据域赋值为要插入的数据。
3. 将新节点的指针域指向当前节点的下一个节点。
4. 将当前节点的指针域指向新节点。
链表的删除操作可以删除链表中的一个节点。
具体步骤如下:1. 找到要删除的节点以及其前一个节点。
2. 将前一个节点的指针域指向要删除节点的下一个节点。
3. 释放要删除节点的内存空间。
链表的查找操作可以根据给定的数据值查找链表中对应的节点。
具体步骤如下:1. 从链表的头节点开始,依次遍历链表中的每个节点。
2. 判断当前节点的数据值是否与给定的数据值相等。
3. 如果相等,则找到了对应的节点,返回该节点;否则继续遍历下一个节点。
4. 如果遍历完整个链表仍未找到对应的节点,则返回NULL,表示未找到。
链表的修改操作可以修改链表中的一个节点的数据值。
具体步骤如下:1. 找到要修改的节点。
2. 将该节点的数据域修改为新的数据值。
通过上述的增删查改操作,我们可以实现对链表中数据的灵活操作。
链表可以动态地插入和删除节点,而不需要像数组那样需要提前定义大小。
链表的查找和修改操作的时间复杂度为O(n),其中n为链表的长度,而插入和删除操作的时间复杂度为O(1),即常数时间。
在实际应用中,链表常用于需要频繁进行插入和删除操作的场景,比如实现队列、栈、链表等数据结构。
链表也可以与其他数据结构相结合,例如与哈希表结合实现LRU缓存淘汰算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
河南城建学院课程设计报告书专业:课程设计名称:《数据结构课程设计》题目:学号:姓名:同组人员:指导老师:完成时间: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表示建表结束,请输入至少一个元素。