实验9 链表基本操作编程
- 格式:ppt
- 大小:155.00 KB
- 文档页数:10
链表的基本操作代码c语言链表是一种常见的数据结构,其基本操作包括创建、插入、删除和遍历等。
以下是链表的基本操作代码(C语言实现):1. 链表节点的定义cCopy codetypedef struct ListNode { int val; // 节点的值struct ListNode *next; // 指向下一个节点的指针 } ListNode;2. 创建链表cCopy codeListNode* createList(int arr[], int n) { ListNode *head = NULL, *tail = NULL; for (int i = 0; i < n; i++) { ListNode *node = (ListNode *)malloc(sizeof(ListNode)); node->val = arr[i]; node->next = NULL; if (tail == NULL) { head = tail = node; } else { tail->next = node; tail = node; } } return head; }3. 插入节点cCopy codevoid insertNode(ListNode **head, int val, int index) { if (index < 0) { return; } ListNode *node = (ListNode *)malloc(sizeof(ListNode)); node->val = val; node->next = NULL; if (index == 0) { node->next = *head; *head = node; } else { ListNode *prev = *head; for (int i = 0; i < index - 1; i++) { if (prev == NULL) { return; } prev = prev->next; }if (prev == NULL) { return; } node->next = prev->next; prev->next = node; } }4. 删除节点cCopy codevoid deleteNode(ListNode **head, int index) { if (*head == NULL || index < 0) { return; } if (index == 0) { ListNode *node = *head; *head = (*head)->next; free(node); } else { ListNode *prev = *head; for (int i = 0; i < index - 1; i++) { if (prev->next == NULL) { return; } prev = prev->next; } if (prev->next == NULL) { return; } ListNode *node = prev->next; prev->next = node->next; free(node); } }5. 遍历链表cCopy codevoid traverseList(ListNode *head) { while (head != NULL) { printf("%d ", head->val); head = head->next; } printf("\n"); }以上是链表的基本操作代码,可以根据需要进行调整和扩展。
实验一:链表一、实验目的掌握链表的基本操作并能熟练应用。
二、实验环境VC6.0,操作系统:Windows XP Professional (5.1, Build 2600) Service Pack 3。
硬件:AMD Athlon(tm) II X2 245 Processor,2.9GHZ三、试验题目链表的插入,清空,输出等基本操作代码如下:#include<iostream.h>#include<string.h>//节点类型struct StuNode{int nID;char* strName;int nAge;StuNode* next;};//typedef StuNode List;//清空链表void DelList(List* head){if(head==NULL)return;StuNode* p = head,* q = NULL;while(p){q = p;p = p->next;delete q;//查遍链表,逐个清空}}//插入节点至表头void InsertToFirst(List* head,int id,char* name,int a) {if(head==NULL||id==NULL)return;StuNode*p = new StuNode;p->nAge = a;p->nID = id;if(name==NULL)p->strName = NULL;else{int nLen = strlen(name)+1;p->strName = new char[nLen];strcpy(p->strName,name);}p->next = head->next;head->next = p;}//插入节点至表尾void InsertToLast(List* head,int id,char* name,int a) {if(head==NULL||id==NULL)return;StuNode*p = new StuNode;p->nAge = a;p->nID = id;if(name==NULL)p->strName = NULL;else{int nLen = strlen(name)+1;p->strName = new char[nLen];strcpy(p->strName,name);}StuNode* q = head;while(q->next)q = q->next;q->next = p;p->next = NULL;}//删除指定节点void Delete(List*head){if(head==NULL)return;//为空返回StuNode* p = head,*q = NULL;int DelID;cout<<"Input the ID you want delete:"<<endl<<"DelID:";cin>>DelID;while(p->nID!=DelID){q = p; //*q用来确定要删除节点的前一个节点的位置p = p->next;}q->next = p->next;}//输出链表void ShowList(List* head){StuNode* p = head->next;cout.setf(ios::left);cout.width(10); //规范输出格式cout<<"ID";cout.setf(ios::left);cout.width(10);cout<<"Name";cout.setf(ios::left);cout.width(5);cout<<"Age"<<endl;while(p){cout.setf(ios::left);cout.width(10);cout<<p->nID;cout.setf(ios::left);cout.width(10);cout<<p->strName;cout.setf(ios::left);cout.width(5);cout<<p->nAge<<endl;p = p->next;}cout<<endl;}////主函数void main(){List s;s.next = NULL; //定义一个节点InsertToFirst(&s,200800101,"zhangsan",20);InsertToLast(&s,200800102,"lisi",22);InsertToLast(&s,200800103,"wangwu",21);ShowList(&s);//输出链表Delete(&s);ShowList(&s);}输出结果:四、分析总结本次试验对所学链表的理论知识进行了实践,加深了对链表的理解,对于链表的基本操作进行了系统的练习。
《面向对象程序设计》实验报告(一)一、实验项目名称:实验二C++语言对C语言的扩充二、实验目的及要求:1.掌握C++语言在结构化程序设计方面对C语言的扩充。
2.进一步掌握程序的调试方法。
三、实验环境及要求:多媒体计算机一台Windows XP操作系统Visual C++ 6.0四、实验原理及步骤:实验内容:3.创建一个学生链表,进行链表的插入、删除、查找操作,要求:(1)使用函数模板;(2)使用new和delete进行动态内存的分配和释放。
原理:运用结构体和动态链表来实现对学生信息的操作步骤:正常启动Microsoft Visual C++,输入程序进行调试,进过修改调试注意区分c++与的区别#include <string>using namespace std;struct student{int ID; //顺序long number;//学号string name;//学生姓名string sex; //性别int age; //年龄float score; //成绩student *next;};student *head;student *Create() //创建链表:初始化(当学号为'0'时停止){student *p1;student *p2;p1=new student;cin>>p1->number>>p1->name>>p1->sex>>p1->age>>p1->score;head=NULL;p2=p1;while(p1->number!=0){if(head==NULL)head=p1;elsep2->next=p1;p2=p1;p1=new student;cin>>p1->number>>p1->name>>p1->sex>>p1->age>>p1->score;}p2->next=NULL;delete p1;return(head);}int Length(student *head) //计算学生总数{int length=0;while(head){length++;head=head->next;}return length;}void Search(student *head,long key)//按学号查找学生信息{student *p;if(head==NULL){cout<<endl<<"空表,不能查找。
链表的基础操作链表是一种常用的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
链表的操作包括插入、删除、查找等,下面将详细介绍链表的基础操作。
一、链表的创建链表的创建可以通过逐个节点的方式进行,首先创建一个头节点,然后创建其他节点,并将它们的指针串联起来即可。
代码如下:```pythonclass Node:def __init__(self, data):self.data = dataself.next = Nonehead = Node(1)node2 = Node(2)node3 = Node(3)head.next = node2node2.next = node3```二、链表的插入链表的插入操作包括在链表的开头、中间和末尾插入节点。
具体操作如下:1. 在链表的开头插入节点:```pythonnew_node = Node(0)new_node.next = headhead = new_node```2. 在链表的中间插入节点:假设要在node2和node3之间插入一个新的节点new_node:```pythonnew_node = Node(2.5)new_node.next = node3node2.next = new_node```3. 在链表的末尾插入节点:假设要在链表末尾插入一个新的节点new_node:```pythonnew_node = Node(4)node3.next = new_node```三、链表的删除链表的删除操作可以删除链表中的任意一个节点,具体操作如下:1. 删除链表的头节点:```pythonhead = head.next```2. 删除链表的中间节点:假设要删除node2节点:```pythonnode2.next = node3.next```3. 删除链表的末尾节点:需要遍历链表,找到倒数第二个节点,将其指针指向None即可。
c语言数据结构链表基本操作C语言数据结构链表基本操作链表是一种常见的数据结构,用于存储和操作一系列的数据元素。
在C语言中,链表的实现通常使用指针来连接各个节点,每个节点包含数据和指向下一个节点的指针。
本文将介绍链表的基本操作,包括创建链表、插入节点、删除节点和遍历链表。
1. 创建链表创建链表的第一步是定义一个指向链表头节点的指针。
链表头节点是链表的起始位置,通常不存储数据,只用于指向第一个真正存储数据的节点。
可以使用malloc函数动态分配内存空间来创建链表节点,并将头指针指向该节点。
2. 插入节点在链表中插入节点分为两种情况:在链表头部插入和在链表中间或尾部插入。
在链表头部插入节点时,只需要创建一个新节点,并将新节点的指针指向原来的头节点,然后更新头指针指向新节点即可。
在链表中间或尾部插入节点时,需要先找到插入位置的前一个节点,然后创建新节点,并将新节点的指针指向原来的下一个节点,再将前一个节点的指针指向新节点。
3. 删除节点删除链表中的节点需要找到要删除节点的前一个节点,然后修改前一个节点的指针指向要删除节点的下一个节点,最后释放要删除节点的内存空间。
4. 遍历链表遍历链表是指依次访问链表中的每个节点,并对节点进行操作。
可以使用循环结构和指针来实现链表的遍历。
从链表头节点开始,通过指针指向下一个节点,直到指针为空或指向链表尾部。
链表的基本操作是在实际编程中经常使用的,它可以灵活地插入、删除和修改节点,适用于各种场景。
例如,可以使用链表来实现栈、队列等数据结构,也可以用于在内存中动态存储数据。
在使用链表时,需要注意以下几点:- 确保链表的头指针始终指向链表的起始位置,避免丢失链表的引用。
- 在插入和删除节点时,要注意更新链表的指针,以保持链表的正确性。
- 在释放链表内存空间时,要遍历链表并依次释放每个节点的内存空间,防止内存泄漏。
链表是一种重要的数据结构,灵活性和可扩展性使其在实际应用中具有广泛的用途。
c语言链表的基本操作(1)单链表的创建// 定义单链表结构体struct Node{int data; // 节点元素值struct Node *next; // 指向下一节点的指针};// 创建单链表struct Node * list_create(){struct Node *head; // 保存头节点struct Node *p1, *p2; // 临时指针int data;// 分配新节点p1 = (struct Node *)malloc(sizeof(struct Node));p2 = p1; // 维持p1指向新节点printf("Please input data:\n");scanf("%d", &data);// 保存数据和指针p1->data = data;p1->next = NULL;if(data != 0) {// 循环录入while(data != 0) {// 分配新节点p1 = (struct Node *)malloc(sizeof(struct Node));p1->next = NULL;// 保存数据scanf("%d", &data);p1->data = data;p2->next = p1;p2 = p1;}}head = p1;printf("Single list create success!!\n");return head;}(2)单链表的插入// 向单链表插入元素void list_insert(struct Node *list){struct Node *p1, *p2;int data;printf("Please input insert data:\n");scanf("%d", &data);// 分配新节点p1 = (struct Node *)malloc(sizeof(struct Node));p1->data = data; // 保存数据p2 = list; // p2指向头指针// 查找插入位置while ((p2 != NULL) && (p2->data < data)){p1 = p2;p2 = p2->next; // 遍历单链表}if (list == p2) // 在最前面插入{p1 = p2; // p1头指针指向头结点list = p1;}// 保存插入位置p1->next = p2;// 插入新节点p1->next->next = p2->next;printf("List insert success!!\n");}(3)单链表的删除// 删除单链表中的节点void list_delete (struct Node *list){struct Node *p1, *p2;int data;printf("Please input delete data:\n");scanf("%d", &data);p1 = list;// 查找删除位置while ((p1->next != NULL) && (p1->next->data < data)) {p1 = p1->next; // 遍历单链表}// 找到要删除的节点if (p1->next->data == data){p2 = p1->next; // 保存要删除的节点p1->next = p2->next; // 指针指向要删除的下一节点// 释放要删除的节点free(p2);printf("List delete success!!\n");}else{printf("No data in list!!\n");}}(4)单链表的查找// 查找单链表中的元素void list_fetch (struct Node *list){struct Node *p;int data;p = list;printf("Please input fetch data:\n");scanf("%d", &data);// 查找插入位置while (p != NULL){if (p->data == data){printf("Fetch success!!\n");break;}p = p->next; // 指针指向下一节点}if (p == NULL){printf("No data in list!!\n");}}(5)单链表的遍历// 遍历单链表void list_traverse (struct Node *list){struct Node *p;printf("Single list traverse: \n");p = list;while (p != NULL) // 遍历单链表{printf("%d ", p->data);p = p->next;}}(6)单链表的销毁// 销毁单链表void list_destory (struct Node *list){struct Node *p;while (list != NULL){p = list; // 保存头指针list = list->next; // 移除头节点// 释放free (p);}printf("Destory list!!\n");}。
链表的基本操作源代码//链表的基本操含有对链表的建⽴,插⼊,删除,查询,输出等基本操作/在此特别提醒链表的基础尤为重要,在这⾥重写此代码能够更加深刻的理解了链表的空间的申请,/头节点的建⽴以及头指针的重要和尾节点存在的必要性/这个源代码以链表的创建为核⼼,为了怕⿇烦就没有进⾏优化,但是创建和输出是这个代码的核⼼。
/希望这个能帮助到初学者,在这有不懂得地⽅可以看我的随笔,链表的整表的创建,那⾥有更加详细的介绍/在此附上图:⼀、初始化界⾯⼆、创建链表三、输出所创建的链表中元素源代码://先建⽴⼀个完整的链表,然后对其进⾏增删改查//在这⾥我们采⽤尾插⼊的⽅式来对其进⾏建⽴链表#include <iostream>#include <stdlib.h>#include <malloc.h>using namespace std;typedef int DataType;//声明节点typedef struct node{DataType data;struct node *next;}SLNode;//创建头指针SLNode *InitiateHead(SLNode*phead){phead = (SLNode*)malloc(sizeof(SLNode));phead->next = NULL;return phead;}//创建链表SLNode * Create_List(SLNode *head){//头节点开始的申请空间SLNode *r,*p;int x;char c ;if(head !=NULL){free(head);head = NULL;}head = (SLNode*)malloc(sizeof(SLNode));head->data=x;if(head !=NULL){r = head;cout<<"空间成功申请!"<<endl;}cout<<"创建链表:"<<endl;while(c !=NULL||c!='n'){cout<<"请输⼊:";cin>>x;p = (SLNode*)malloc(sizeof(SLNode));p->data = x;r->next = p;r = p;cout<<"是否继续输⼊:Y/N"<<endl;cin>>c;if(c == 'Y'||c == 'y'){continue;}else{r->next= NULL;cout<<"⾸地址1:"<<head<<endl;///cout<<"链表创建完成!"<<endl;return head;}}}//链表的插⼊int ListInsert(SLNode *head,int i ,DataType x){ SLNode *p,*q;p = head->next;int j = 0;while(p->next!= NULL && j < i-1){p = p->next;j++;}if(j != i -1){cout<<"插⼊位置参数错误!"<<endl;return 0;}q = (SLNode *)malloc(sizeof(SLNode));q->data= x;q->next= p->next;p->next = q;cout<<"插⼊成功 !"<<endl;return 1;}//链表的删除int ListDelete(SLNode *head,int i ,DataType *x){ SLNode *p ,*s;int j;p = head->next;j = 0;while( p ->next !=NULL && j<i -1){p = p->next;j++;}if(j != i -1){cout <<"删除位置参数错误!"<<endl;return 0;}s = p->next;*x = s->data;p->next = p->next->next;free(s);cout<<"删除成功!"<<endl;return 1;}//查询获取元素int ListGet(SLNode *head,int i ,DataType *x){ SLNode *p ;int j;p = head->next;j = 0;while(p->next!= NULL &&j <i){p = p->next;j++;}if(j != i){cout<<"取元素位置参数错误!"<<endl;return 0;}*x = p->data;cout<<"查找成功!"<<endl;return 1;}void OutPut_List(SLNode *phead){SLNode *p;// cout<<"⾸地址3:"<<phead<<endl;/////cout<<"⾸地址4:"<<phead->next<<endl;p = phead->next->next;//cout<<"data:"<<p->data<<endl;int i = 1;while(p!=NULL){cout<<"第"<<i<<"⼀个元素:"<<p->data<<endl;i++;p = p->next;}}//释放内存,避免内存的泄漏void Destroy(SLNode *head){SLNode *p = head ;SLNode *p1;while(p != NULL){p1 = p;p = p->next;free(p1);}head = NULL;cout<<"释放内存成功!"<<endl;}void menu(){cout<<"_________________________________________________________"<<endl;cout<<"|*******************************************************|"<<endl;cout<<"|*****************欢迎进⼊菜单选项*.********************|"<<endl;cout<<"|*****************进⼊初始化阶段请稍后....**************|"<<endl;cout<<"|*****************0、清屏 **************|"<<endl;cout<<"|*****************1、创建链表 **************|"<<endl;cout<<"|*****************2、输出链表 **************|"<<endl;cout<<"|*****************3、链表的插⼊ **************|"<<endl;cout<<"|*****************4、链表的删除 **************|"<<endl;cout<<"|*****************5、链表的查询 **************|"<<endl;cout<<"|*****************6、释放内存空间 **************|"<<endl;cout<<"|*******************************************************|"<<endl;cout<<"_________________________________________________________"<<endl;}void operation(SLNode *phead){SLNode *p,*p1;int n,i;int input;cout<<"请选择:"<<endl;cin>>input;//p1=InitiateHead(phead);//头指针switch(input){case 0:system("CLS");menu();operation(phead);case 1:p1=Create_List(p);/* cout<<"⾸地址2:"<<p1<<endl;//此为创建链表后返回的头节点的地址,头节点不存任何东西*/phead->next=p1; phead->next=p1;menu();operation(phead); break;case 2:cout<<"输出已创建好的链表中的数据:"<<endl;OutPut_List(phead);menu();operation(phead);break; case 3:cout<<"请输⼊要插⼊的元素:";cin>>n;cout<<endl;cout<<"请输⼊要插⼊的位置";cin>>i; ListInsert(phead,i ,n);menu();operation(phead);menu();operation(phead);break;case 4:cout<<"请输⼊要删除的元素:";cin>>n;cout<<endl;cout<<"请输⼊要删除的位置";cin>>i; ListDelete(phead,i ,&n);menu();operation(phead);menu();operation(phead);break;case 5:cout<<"请输⼊要查询的元素:";cin>>n;cout<<endl;cout<<"请输⼊要查询的位置";cin>>i;ListGet(phead,i ,&n);menu();operation(phead);menu();operation(phead);break;case 6:cout<<"释放存储空间:"; Destroy(phead);break;default :cout<<"请重新选择!"<<endl; menu();operation(phead);}}int main(){SLNode *phead;phead=InitiateHead(phead);cout<<"⾸地址2.1:"<<phead<<endl;//此为头指针的地址menu();operation(phead);return 0;}。
数据结构链表的基本操作一、引言链表是计算机科学中的一种数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
链表可以用于实现栈、队列和其他数据结构。
本文将详细介绍链表的基本操作。
二、链表的基本概念1. 节点:链表中的每个元素称为节点,它包含两部分:数据和指向下一个节点的指针。
2. 头结点:链表中第一个节点称为头结点,它不包含实际数据,只有指向第一个真正节点的指针。
3. 尾节点:链表中最后一个节点称为尾节点,它的指针为空。
4. 空链表:不包含任何元素的链表称为空链表。
三、链表的基本操作1. 创建链表创建一个空链表很简单,只需要让头结点指针为空即可。
如果需要创建带有多个元素的非空链表,则需要依次创建每个节点,并将前一个节点的指针指向当前节点。
2. 插入元素在插入元素时,需要先找到要插入位置前面的那个节点。
然后新建一个要插入的节点,并将其指针指向原来位置上后面那个节点。
最后将前面那个节点的指针改为新建立的节点。
3. 删除元素在删除元素时,需要先找到要删除的那个节点。
然后将前一个节点的指针指向后一个节点,从而跳过要删除的那个节点。
最后释放要删除的节点。
4. 遍历链表遍历链表是指依次访问链表中每个元素。
可以使用循环结构来实现遍历操作。
从头结点开始,依次访问每个节点,并将其数据输出即可。
5. 查找元素查找元素时,需要从头结点开始依次遍历每个节点,直到找到目标元素或者遍历完整个链表为止。
6. 反转链表反转链表是指将原来的链表顺序倒置。
可以使用三个指针分别表示当前节点、前一个节点和后一个节点,依次修改它们之间的指针即可实现反转操作。
四、链表的应用举例1. 栈和队列:栈和队列都可以用链表来实现。
栈是一种先进后出(FILO)的数据结构,而队列是一种先进先出(FIFO)的数据结构。
2. 链式存储文件系统:文件系统中通常采用基于树或者基于哈希表的存储方式。
但是在某些情况下,也可以采用基于链式存储方式来实现文件系统。
链表的基本操作实验报告链表的基本操作实验报告引言:链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
链表相较于数组拥有更灵活的操作,能够动态地增删节点。
本实验旨在通过实际操作链表,加深对链表基本操作的理解和掌握。
实验目的:1. 理解链表的基本概念和结构;2. 学会链表的插入、删除和遍历操作;3. 掌握链表的相关算法。
实验过程:1. 创建链表首先,我们需要创建一个链表。
链表可以是单链表、双链表或循环链表,本次实验我们选择创建一个单链表。
创建链表的过程如下:(1)定义一个链表的节点结构,包含数据和指向下一个节点的指针;(2)创建头节点,并将头节点的指针指向NULL,表示链表为空。
2. 插入节点链表的插入操作可以在链表的任意位置插入节点。
我们可以选择在链表的头部、尾部或指定位置插入节点。
下面以在链表头部插入节点为例,介绍插入节点的过程:(1)创建一个新节点,设置新节点的数据;(2)将新节点的指针指向原头节点;(3)将头节点的指针指向新节点,完成插入操作。
3. 删除节点链表的删除操作可以删除链表中的任意节点。
同样,我们可以选择删除链表的头部、尾部或指定位置的节点。
以下是删除链表头部节点的步骤:(1)将头节点的指针指向下一个节点,跳过原头节点;(2)释放原头节点的内存空间。
4. 遍历链表链表的遍历操作用于访问链表中的每个节点。
通过遍历链表,我们可以获取链表中的所有数据或执行特定的操作。
链表的遍历操作如下:(1)从链表的头节点开始,依次访问每个节点;(2)对每个节点执行相应的操作,如打印节点的数据。
实验结果:通过以上实验过程,我们成功地创建了一个链表,并实现了链表的插入、删除和遍历操作。
链表的基本操作能够灵活地处理数据,适用于各种场景。
链表的插入和删除操作可以在O(1)时间内完成,相较于数组的插入和删除操作具有更高的效率。
实验总结:链表作为一种常见的数据结构,具有灵活性和高效性的特点。
数据结构中链表的基本操作什么是链表链表是一种常见的数据结构,用于存储线性数据集合。
链表由一系列节点组成,每个节点都包含了数据项以及指向下一个节点的引用。
相比于数组,链表具有动态性,可以在运行时扩展或缩小。
链表的基本特点链表的基本特点包括:1.由节点构成:每个节点包含一个数据项和指向下一个节点的引用。
2.链表头:链表的开始节点。
3.链表尾:链表的结束节点,其下一个节点的引用为空。
4.单向性:节点之间是通过指针或引用单向连接的。
5.动态性:链表的长度可以在运行时根据需要进行动态调整。
链表的基本操作链表支持一系列基本操作,包括:1.创建链表:初始化一个链表,并设置头节点和尾节点的初始值。
2.插入节点:在链表的任意位置插入一个新节点。
3.删除节点:从链表中删除指定节点。
4.查找节点:根据给定值查找链表中的节点。
5.遍历链表:按顺序访问链表中的节点。
创建链表创建链表的步骤如下:1.创建一个空的链表。
2.初始化头节点,并将头节点的引用存储在链表的头指针中。
3.初始化尾节点,将尾节点的引用存储在链表的尾指针中。
4.将头指针和尾指针指向同一个节点,即初始时链表为空。
创建链表的代码示例:class Node:def __init__(self, data):self.data = dataself.next = Noneclass LinkedList:def __init__(self):self.head = Noneself.tail = Nonelinked_list = LinkedList()插入节点在链表的任意位置插入一个新节点的步骤如下:1.创建一个新的节点,并设置新节点的数据项。
2.将新节点的引用指向原位置的下一个节点。
3.将原位置的节点的引用指向新节点。
插入节点的代码示例:def insert_node(self, data, position):new_node = Node(data)if position == 0:new_node.next = self.headself.head = new_nodeelse:current = self.headcount = 0while count < position - 1:current = current.nextcount += 1new_node.next = current.nextcurrent.next = new_node删除节点从链表中删除指定节点的步骤如下:1.遍历链表,找到要删除的节点的前一个节点。