单链表的基本操作代码
顺序表的定义及基本操作和单链表的定义及基本操作

数据结构实验报告壹题目一:顺序表的定义及基本操作题目二:单链表的定义及基本操作班级:信息一班姓名:学号:得分:____ (满分2.5分)线性表#include<iostream.h>#define OVERFLOW -2#define OK 1#define ERROR 0#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef int ElemType;typedef int status;typedef struct{ElemType *elem;int length;int listsize;}sqlist;status lnitlist_sq(sqlist &L){L.elem=new ElemType[LIST_INIT_SIZE];if(!L.elem)cout<<OVERFLOW;L.length=0;L.listsize=LIST_INIT_SIZE;return OK;}int LocateElem(sqlist L, ElemType e){int *p ;p=L.elem; int i=1;while(i<=L.length && *p++!=e) i++;return i<=L.length ? i : 0;}status GetElem(sqlist L, int i, ElemType &e) {if(i<1||i>L.length) return ERROR; //i非法e=*(L.elem + i - 1);return OK;}status ListInsert(sqlist &L, int i, ElemType e) {//前插操作int *newbase,*q,*p;if(i<1||i>L.length+1) return ERROR; // i非法if(L.length>=L.listsize){ //需要扩展数组newbase=new ElemType[L.listsize+LISTINCREMENT];if(!newbase)cout<<OVERFLOW;L.elem=newbase;L.listsize+=LISTINCREMENT;} //end ifq=L.elem+i-1; //令q指向aifor( p=L.elem+L.length-1; p>=q; p--)*(p+1)=*p; //右移一位*q=e; //将e放入第i个元素的位置上++L.length;return OK;} //ListInsertstatus ListDelete(sqlist &L, int i, ElemType &e){//删除顺序表的第i 个元素,用e返回被删元素的值int *p;if(i<1||i>L.length) return ERROR; //i非法p=&(L.elem[i-1]); //令指针p指向aie=*p;for(++p; p<=L.elem+L.length-1; ++p)*(p-1)=*p; //ai+1…an左移一位--L.length ; //表的长度减1return e;} //ListDeletestatus DestroyList(sqlist &L){delete []L.elem;return OK;}void ListTraverse(sqlist L){if(L.length){for(int i=0;i<L.length;i++){cout<<L.elem[i]<<"\t";}}else cout<<"此顺序表为空!"<<endl;}void main(){int m,n;sqlist a;lnitlist_sq(a);cout<<"线性表初始长度:"<<a.length<<endl;cout<<"请输入线性表的10个元素:"<<endl;for(int i=0;i<10;i++,a.length++)cin>>a.elem[i] ;cout<<"线性表当前长度:"<<a.length<<endl;cout<<"调用遍历函数"<<endl; ListTraverse(a );cout<<"调用定位函数"<<endl;cout<<LocateElem(a,9)<<endl;cout<<"调用读表元函数"<<endl;cout<<GetElem(a, 5, m)<<endl;cout<<"在第五个元素前插入8"<<endl;cout<<ListInsert(a, 5, 8)<<endl;ListTraverse(a );cout<<endl;cout<<"删除第五个元素并返回"<<endl;cout<<ListDelete(a, 5, n)<<endl;ListTraverse(a );cout<<endl;cout<<"销毁线性表"<<DestroyList(a)<<endl;}单链表#include<iostream.h>#define OVERFLOW -2#define OK 1#define ERROR 0#define LIST_INIT_SIZE 10typedef int status;typedef struct LNode {int data ;struct LNode *next ;} LNode, *LinkList;status InitList ( LinkList &L ){//L是带头结点的单链表的头指针L=new LNode[LIST_INIT_SIZE]; //申请头结点if(!L)cout<<OVERFLOW;L->next=NULL;return OK;}status GetElem (LinkList L, int i, int &e){//L是带头结点的单链表,读L的第i个元素,用e返回其值LNode *p;int j;p=L->next; j=1; //指针p指向a1while(p && j<i){p=p->next; j++;} //指针p右移i-1次if(!p||j>i)return ERROR; //i非法!p--i太大,j>i--i太小e=p->data;return e;} //GetElemstatus ListLength ( LinkList L ){// L是带头结点的单链表int n;LNode *p;p=L->next; n=0;while(p) {n++; p=p->next;}cout<<n;return OK;} //ListLength O(n)status ListInsert( LinkList &L, int i, int e ){// L是带头结点的单链表,在ai之前插入新结点eLNode *s;LNode *p;int j;p=L; j=0; //p指向头结点,j是计数器while(p && j<i-1){ p=p->next; j++; } //令p指向ai-1if (!p || j>i-1) return ERROR; //i非法s=new LNode[LIST_INIT_SIZE+2];s->data=e;s->next=p->next; p->next=s; //修改指针return OK;} // ListInsertstatus ListDelete( LinkList &L, int i, int &e ){// L是带头结点的单链表,删除ai,用参数e返回被删结点的值LNode *q,*p;int j;p=L; j=0; //p指向头结点,j是计数器while(p && j<i-1){p=p->next; j++;} //p指向ai-1 if (!(p->next) || j>i-1) return ERROR; // i非法q=p->next; e=q->data;p->next=q->next; delete(q); //修改指针return OK;} // ListInsert O(n)int LocateElem(LinkList L, int e){LNode *p;p=L->next ;int i=1;while(i && p->data!=e){ i++;*p++;}return i;}void main(){int m,n ;LinkList a;LNode s1, s2, s3, s4, s5;InitList (a );a->next=&s1 ;s1.next=&s2 ;s2.next=&s3;s3.next=&s4;s4.next=&s5;cout<<"请输入5个元素:"<<endl;cin>>s1.data>>s2.data>>s3.data>>s4.data>>s5.data; cout<<"执行读表元操作"<<endl;cout<<GetElem (a, 3, m)<<endl;cout<<"执行插入操作"<<endl;cout<<ListInsert(a, 3, 8 ) <<endl;cout<<"执行删除操作"<<endl;cout<<ListDelete( a, 3, n )<<endl;cout<<"执行定位操作"<<endl;cout<<LocateElem( a, 3)<<endl;}。
单链表的基本操作实验报告

湖南第一师范学院信息科学与工程系实验报告课程名称:数据结构与算法成绩评定:实验项目名称:单链表的基本操作指导教师:学生姓名:沈丽桃学号: 10403080118 专业班级: 10教育技术实验项目类型:验证实验地点:科B305 实验时间: 2011 年 10 月20 日一、实验目的与要求:实验目的:实现线性链表的创建、查找、插入、删除与输出。
基本原理:单链表的基本操作二、实验环境:(硬件环境、软件环境)1.硬件环境:奔ⅣPC。
2.软件环境:Windows XP 操作系统,TC2.0或VC++。
三、实验内容:(原理、操作步骤、程序代码等)#include<stdio.h>#include<stdlib.h>#include<malloc.h>struct celltype{int element;struct celltype*next;};typedef int position;void main(){struct celltype*head,*p;int x,choice;void INSERT(int x,struct celltype*p);void LOCATE(int x,struct celltype*p);void DELETE(int x,struct celltype*p);p=(struct celltype*)malloc(sizeof(struct celltype));head=p;p->element=0;p->next=NULL;printf(“Please option:1:Insert 2:Locate 3:Delete\n”);printf(“Please choose:”);scanf(“%d”,&choice);switch(choice)case 1:printf(“Please input a node:”);scanf(“%d”,&x);p=head;INSERT(x,p);for(p=head;p!=NULL;p=p->next)printf(“%d”,p->element);printf(“\n”);break;case 2:printf(“Please input the data you want to locate:”); scanf(“%d”,&x);p=head;LOCATE(x,p);break;case 3:printf(“Please input the data you want to delete:”); scanf(“%d”,&x);DELETE(x,p);for(p=head;p!=NULL;p=p->next)printf(“%d”,p->next);printf(“\n”);break;}void INSERT(int x,struct celltype*p){struct celltype*t,*q;q=(struct celltype*)malloc(sizeof(struct celltype)); q->next=x;while((x>p->element)&&(p!=NULL)){t=p;p=p->next;}if((x>p->element)&&(p->next!=NULL)){p->next=q;q->next=NULL;}else{q->next=p;t->next=q;}}void LOCATE(int x,struct celltype*p){while(p->next!=NULL)if(p->next->element==x)printf(“the number %d is in %d\n”,x,p);else printf(“the number not exist!\n”);}void DELETE(int x,struct celltype*p){while((p->element!=x)&&(p->next!=NULL)){t=p;p=p->next;}if(p->element==x)t->next=p->next}error C2018:unknown character ’Oxal’error C2065:’Please’:undeclared identifiererror C4024:’printf’:different types for formal and actual parameter 1error C4047:’function’:’const*differs in levers of indirection from ’int’error C2146:syntaxerror:missing’)’before identifier’option’error C2017:illegal escape sequenceerror C2059:syntax error:’)’error C2143:syntax error:missing’)’before’%’出现了很多错误,主要是因为printf里的一对双引号不是英文状态下的。
单链表头插法代码

单链表头插法代码单链表是一种常见的数据结构,它由多个节点组成,每个节点包括两部分:一个数据存储区和一个指向下一个节点的指针。
插入操作是单链表的基本操作之一,在插入一个节点时,可以采用两种方法:头插法和尾插法。
在本篇文章中,我们将重点讲解单链表的头插法。
头插法是指在单链表的头节点之前插入一个新节点。
这种方法需要先创建一个新节点,并将其指针指向原头节点所指向的节点。
然后再将头节点的指针指向新节点。
相当于是在链表的头部插入新节点。
下面是头插法的代码实现:```struct node {int data;struct node *next;};void insert_node(struct node **head, int value) {struct node *new_node = (struct node*)malloc(sizeof(struct node));new_node->data = value;new_node->next = *head;*head = new_node;}```在上面的代码中,我们首先定义了一个节点结构体node,其中包含一个int类型的数据成员data和一个指向下一个节点的指针成员next。
然后,我们定义一个函数insert_node,这个函数的作用是向单链表中插入新的节点。
其中,head是指向链表头节点的指针,value 是要插入的节点的值。
在insert_node函数体中,我们首先通过malloc函数动态分配内存,创建一个新节点new_node。
然后,将新节点的data成员赋值为value,将新节点的next指针指向原head指针所指向的节点,最后将head指针指向新节点new_node。
这样,新节点就插入到链表的头部了。
总结一下,头插法是单链表中比较常用的一种插入节点的方式,通过这种方法,可以很方便地在链表头部插入新节点。
在实现的过程中需要注意,在创建新节点时要手动分配内存,否则会发生内存错误。
数据结构-单链表基本操作实现(含全部代码)

数据结构-单链表基本操作实现(含全部代码)今天是单链表的实现,主要实现函数如下:InitList(LinkList &L) 参数:单链表L 功能:初始化时间复杂度 O(1)ListLength(LinkList L) 参数:单链表L 功能:获得单链表长度时间复杂度O(n)ListInsert(LinkList &L,int i,ElemType e) 参数:单链表L,位置i,元素e 功能:位置i后插时间复杂度O(n)[加⼊了查找]若已知指针p指向的后插 O(1)ListDelete(LinkList &L,int i) 参数:单链表L,位置i 功能:删除位置i元素时间复杂度O(n)[加⼊了查找]若已知p指针指向的删除最好是O(1),因为可以与后继结点交换数据域,然后删除后继结点。
最坏是O(n),即从头查找p之前的结点,然后删除p所指结点LocateElem(LinkList L,ElemType e) 参数:单链表L,元素e 功能:查找第⼀个等于e的元素,返回指针时间复杂度O(n)代码:/*Project: single linkeed list (数据结构单链表)Date: 2018/09/14Author: Frank YuInitList(LinkList &L) 参数:单链表L 功能:初始化时间复杂度 O(1)ListLength(LinkList L) 参数:单链表L 功能:获得单链表长度时间复杂度O(n)ListInsert(LinkList &L,int i,ElemType e) 参数:单链表L,位置i,元素e 功能:位置i后插时间复杂度O(n)[加⼊了查找]若已知指针p指向的后插 O(1)ListDelete(LinkList &L,int i) 参数:单链表L,位置i 功能:删除位置i元素时间复杂度O(n)[加⼊了查找]若已知p指针指向的删除最好是O(1),因为可以与后继结点交换数据域,然后删除后继结点。
数据结构(c语言版)课后习题答案完整版

数据结构(c语言版)课后习题答案完整版数据结构(C语言版)课后习题答案完整版一、数据结构概述数据结构是计算机科学中一个重要的概念,用来组织和存储数据,使之可以高效地访问和操作。
在C语言中,我们可以使用不同的数据结构来解决各种问题。
本文将提供完整版本的C语言数据结构的课后习题答案。
二、顺序表1. 顺序表的定义和基本操作顺序表是一种线性表,其中的元素在物理内存中连续地存储。
在C 语言中,我们可以通过定义结构体和使用指针来实现顺序表。
以下是顺序表的一些基本操作的答案:(1)初始化顺序表```ctypedef struct{int data[MAX_SIZE];int length;} SeqList;void InitList(SeqList *L){L->length = 0;}```(2)插入元素到顺序表中```cbool Insert(SeqList *L, int pos, int elem){if(L->length == MAX_SIZE){return false; // 顺序表已满}if(pos < 1 || pos > L->length + 1){return false; // 位置不合法}for(int i = L->length; i >= pos; i--){L->data[i] = L->data[i-1]; // 向后移动元素 }L->data[pos-1] = elem;L->length++;return true;}```(3)删除顺序表中的元素```cbool Delete(SeqList *L, int pos){if(pos < 1 || pos > L->length){return false; // 位置不合法}for(int i = pos; i < L->length; i++){L->data[i-1] = L->data[i]; // 向前移动元素 }L->length--;return true;}```(4)查找顺序表中的元素```cint Search(SeqList L, int elem){for(int i = 0; i < L.length; i++){if(L.data[i] == elem){return i + 1; // 找到元素,返回位置 }}return -1; // 未找到元素}```2. 顺序表习题解答(1)逆置顺序表```cvoid Reverse(SeqList *L){for(int i = 0; i < L->length / 2; i++){int temp = L->data[i];L->data[i] = L->data[L->length - 1 - i]; L->data[L->length - 1 - i] = temp;}}```(2)顺序表元素去重```cvoid RemoveDuplicates(SeqList *L){for(int i = 0; i < L->length; i++){for(int j = i + 1; j < L->length; j++){if(L->data[i] == L->data[j]){Delete(L, j + 1);j--;}}}}```三、链表1. 单链表单链表是一种常见的链式存储结构,每个节点包含数据和指向下一个节点的指针。
单链表基本操作的实现

单链表基本操作的实现单链表是一种常见的数据结构,它由多个节点组合而成,每个节点包含一个数据元素和一个指向下一个节点的指针。
通过指针,我们可以方便地在单链表中进行插入、删除和遍历等操作。
以下是关于单链表基本操作的实现。
1. 单链表的创建单链表的创建需要定义一个空的头结点,它的作用是方便在链表的头部进行添加和删除节点操作。
一个空的头节点可以在链表初始化的过程中进行创建。
```typedef struct Node{int data;struct Node *next;}Node;Node *createList(){Node *head = (Node*)malloc(sizeof(Node)); //创建空的头节点head->next = NULL;return head; //返回头节点的地址}```2. 单链表的插入单链表的插入可以分为在链表头部插入、在链表尾部插入和在链表中间插入三种情况。
a. 在链表头部插入节点:```void insertAtHead(Node *head, int data){Node *node = (Node*)malloc(sizeof(Node));node->data = data;node->next = head->next;head->next = node;}```b. 在链表尾部插入节点:```void insertAtTail(Node *head, int data){Node *node = (Node*)malloc(sizeof(Node));node->data = data;node->next = NULL;Node *p = head;while(p->next != NULL){p = p->next;}p->next = node;}```c. 在链表中间插入节点:```void insertAtMid(Node *head, int data, int pos){ Node *node = (Node*)malloc(sizeof(Node)); node->data = data;node->next = NULL;Node *p = head;int count = 0;while(p->next != NULL && count < pos-1){ p = p->next;count++;}if(count == pos-1){node->next = p->next;p->next = node;}else{printf("插入位置错误!");}}```3. 单链表的删除单链表的删除可以分为在链表头部删除、在链表尾部删除和在链表中间删除三种情况。
JAVA数据结构——单链表的操作

单链表的操作方法一:package ch02;(1)建立结点类Node.javapublic class Node {public Object data;//存放结点数据值public Node next;//存放后继结点//无参构造函数public Node(){ this(null,null);}//只有结点值的构造函数public Node(Object data){ this(data,null);}//带有节点值和后继结点的构造函数public Node(Object data,Node next){ this.data=data;this.next=next;}}(2)建立链表及操作LinkList.javapackage ch02;import java.util.Scanner;public class LinkList implements IList{public Node head;//单链表的头指针//构造函数初始化头结点public LinkList(){head=new Node();}//构造函数构造长度为n的单链表public LinkList(int n,boolean Order) throws Exception{ this();if(Order)create1(n); //头插法顺序建立单链表elsecreate2(n); //尾插法逆序建立单链表}//头插法顺序建立单链表public void create1(int n) throws Exception{Scanner sc=new Scanner(System.in);System.out.println("请输入结点的数据(头插法):”);for(int i=0;i<n;i++){insert(0,sc.next());}}//尾插法逆序建立单链表public void create2(int n) throws Exception{Scanner sc=new Scanner(System.in);System. out.println("请输入结点的数据(尾插法):");for(int i=0;i<n;i++){insert(length(),sc.next());}}//将链表置空public void clear(){head.data=null;head.next=null;}//判断链表是否为空public boolean isEmpty(){return head.next==null;}//返回链表长度public int length(){Node p=head.next;int length=0;while(p!=null){p=p.next;length++;//返回P不空长度length加1}return length;}//读取并返回第i个位置的数据元素public Object get(int i) throws Exception {Node p=head.next;int j;//从首结点开始向后查找,直到9指向第i个结点或者p为nullfor(j=0;j<i&&p!=null;j++){ p=p.next;}if(j>i||p==null)//i不合法时抛出异常throw new Exception("第"+i+”个数据元素不存在”);return p.data;}//插入乂作为第i个元素public void insert(int i, Object x) throws Exception{ Node p=head;int j=-1;//寻找第i个结点的前驱i-1while(p!=null&&j<i-1){p=p.next;j++;}if(j>i-l||p==null)//i不合法时抛出异常throw new Exception("插入位置不合法”);Node s=new Node(x);s.next=p.next;p.next=s;}//删除第i个元素public void remove(int i) throws Exception{ Node p=head;int j=-1;while(p!=null&&j<i-1){//寻找第i-1 个节点p=p.next;j++;}if(j>i-1||p.next==null)throw new Exception("删除位置不合法”);p.next=p.next.next;}//返回元素x首次出现的位序号public int indexOf(Object x) {Node p=head.next;int j=0;while(p!=null&&!p.data.equals(x)){p=p.next;j++;if(p!=null)return j;elsereturn -1;}public void display(){Node p=head.next;while(p!=null){if(p.next==null)System.out.print(p.data);elseSystem.out.print(p.data+"f );p=p.next;}}}(3)建立测试类Test.javappublic class test {public static void main(String[] args) throws Exception { // TODO Auto-generated method stubScanner sc=new Scanner(System.in);boolean or;int xz,xx;System.out.println("请选择插入的方法:0、头插法,1、尾插法");xz=sc.nextInt();if(xz!=0)or=true;elseor=false;System. out.println("请插入的结点的个数:”);xx=sc.nextInt();LinkList L=new LinkList(xx,or);System.out.println("建立的链表为:");L.display();System.out.println();System.out.println("链表的长度:"+L.length());System. out.println(”请输入查找的结点的数据:”);Object x=sc.next();int position=L.indexOf(x);System.out.println("结点的数据为:"+x+"的位置为:"+position); System. out.println("请输入删除的结点的位置:”);int sr=sc.nextInt();L.remove(sr);L.display();System.out.println();System.out.println("链表的长度:"+L.length()); }品P rob I em & J a vs d oc / Declaration Q Error Log 里Con sole-M、、■=:termin8ted> test [3] [Java Application] C U &ert\Ad im i n i st rat o r\Ap p Data\L o cs I请选择插入.的方法:0、头插法,lv星插法请插入的特点的个数:请愉入结点的颓据(尾插法):A B C E D F建立的旌表为;A+B T C+E T D+F链表的长度:6请输入查找的结点的数据:结点的数据为:E的位置为:3请输入删除的结点的位置,R+B T E+DW道表的长度:S方法二(引入get和set方法)Package sy;import java.util.Scanner;//单链表的结点类public class Node {private Object data; //存放结点值private Node next; //后继结点的引用public Node() { //无参数时的构造函数this(null, null);}public Node(Object data) { // 构造值为data 的结点this(data, null);}public Node(Object data, Node next) {//构造值为data 和next 的结点构造函数this.data = data;this.next = next;}public Object getData() { return data;}public void setData(Object data) {this.data = data;}public Node getNext() { return next;public void setNext(Node next) { this.next = next;}}//实现链表的基本操作类public class LinkList {Node head=new Node();//生成一个带头结点的空链表//根据输入的一系列整数,以0标志结束,用头插法建立单链表public void creat() throws Exception {Scanner sc = new Scanner(System.in); //构造用于输入的对象for (int x=sc.nextInt(); x!=0; x=sc.nextInt()) //输入若干个数据元素的值(以0结束) insert(0, x);//生成新结点,插入到表头}//返回带头结点的单链表中第i个结点的数据域的值。
实验2 单链表基本操作

实验1#include<stdio.h>#include<stdlib.h>#include <malloc.h>#define OK 1#define ERROR 0typedef int Status;typedef int ElemType;//定义存储结构typedef struct Lnode{int data; /*每个元素数据信息*/struct Lnode *next; /*存放后继元素的地址*/} LNode,*LinkList;int main(){void Create_L(LinkList &L,int n);void Print_L(LinkList L);Status ListInsert_L(LinkList &L,int i,ElemType e);Status ListDelete_L(LinkList &L,int i,ElemType &e);Status Find_L(LinkList L,int e);LinkList La;//创建单链表Laint n;printf("请输入链表La中的元素个数:\n");scanf("%d",&n);Create_L(La,n);//初始化单链表printf("现在La中的元素为:\n");Print_L(La);printf("-------------------------------------\n\ n");printf("现在准备插入元素,请输入插入位置及所插入元素的值\n");int i,e;scanf("%d %d",&i,&e);ListInsert_L(La,i,e);printf("插入后La中的元素为:\n");Print_L(La);printf("-------------------------------------\n\ n");printf("现在准备删除元素,请输入删除位置\n");scanf("%d",&i);ListDelete_L(La,i,e);printf("删除后La中的元素为:\n");Print_L(La);printf("-------------------------------------\n\n");printf("请输入所要查找元素的值:\n");scanf("%d",&e);Find_L(La,e);printf("所要查找元素的位置为:%d\n",Find_L(La,e));}void Create_L(LinkList &L,int n){int j=1;L=(LinkList)malloc(sizeof(Lnode));L->next =NULL;//先建立一个带头结点的单链线性表Lfor(int i=n;i>0;--i){LinkListp=(LinkList)malloc(sizeof(Lnode));printf("请输入链表La中的第%d个元素:\n",j++);scanf("%d",&p->data);p->next=L->next;L->next =p;}//(逆序实现)/*LinkList q=L;for(int i=1;i<=n;i++){LinkList p=(LinkList)malloc (sizeof(Lnode));q->next=p;p->next=NULL;q=q->next ;printf("请输入链表La中的第%d个元素:\n",i);scanf("%d",&p->data);}//(正序实现)*/}//初始化单链表//输出单链表void Print_L(LinkList L){LinkList p;p=L->next;while(p){printf("%d ",p->data );p=p->next;}printf("\n");}//在单链表L的第i个位置前插入元素e Status ListInsert_L(LinkList &L,int i,ElemType e){LinkList p=L;int j=0;while(p&&j<i-1){p=p->next; ++j;}if(!p||j>i-1) return ERROR;LinkLists=(LinkList)malloc(sizeof(LNode));s->data=e; s->next=p->next;p->next=s;return OK;} //ListInsert_L//删除单链表L中第i个位置上的元素Status ListDelete_L(LinkList &L,int i,ElemType &e){LinkList p=L;int j=0;while( p->next && j<i-1){p=p->next; ++j;}if(!p->next||j>i-1) return ERROR;LinkList q=p->next; p->next=q->next;e=q->data;free(q);return OK;}//LinkDelete_L/*查找元素并返回位置*/Status Find_L(LinkList L,int e){LinkList p=L->next;int j=1;while(p->data!=e&&p->next){p=p->next;j++;}if(p->data==e) return j;else{printf("无当前元素\n");return ERROR;}if(!p){printf("无当前元素\n");return ERROR;}}//定位实验2#include<stdio.h>#include<stdlib.h>#include <malloc.h>#define OK 1#define ERROR 0typedef int Status;typedef int ElemType;//定义存储结构typedef struct Lnode{int data; /*每个元素数据信息*/struct Lnode *next; /*存放后继元素的地址*/} LNode,*LinkList; int main(){void Create_L(LinkList &L,int n);void Print_L(LinkList L);void MergeList_L(LinkList &La, LinkList &Lb,LinkList &Lc);LinkList La,Lb,Lc;//创建单链表La,Lb,Lcint n;printf("请输入链表La中的元素个数:\n");scanf("%d",&n);Create_L(La,n);//初始化单链表printf("现在La中的元素为:\n");Print_L(La);printf("请输入链表Lb中的元素个数:\n");scanf("%d",&n);Create_L(Lb,n);//初始化单链表printf("现在Lb中的元素为:\n");Print_L(Lb);Create_L(Lc,0);printf("-------------------------------------\n\ n");printf("开始合并:\n");MergeList_L(La, Lb,Lc);printf("-------------------------------------\n\ n");printf("合并后,Lc的元素为\n");Print_L(Lc);}void Create_L(LinkList &L,int n){int j=1;L=(LinkList)malloc(sizeof(Lnode));L->next =NULL;//先建立一个带头结点的单链线性表Lfor(int i=n;i>0;--i){LinkListp=(LinkList)malloc(sizeof(Lnode));printf("请输入链表中的第%d个元素:\n",j++);scanf("%d",&p->data);p->next=L->next;L->next =p;}//(逆序实现)/*LinkList q=L;for(int i=1;i<=n;i++){LinkList p=(LinkList)malloc (sizeof(Lnode));q->next=p;p->next=NULL;q=q->next ;printf("请输入链表La中的第%d个元素:\n",i);scanf("%d",&p->data);}//(正序实现)*/}//初始化单链表//有序单链表La和Lb的归并void MergeList_L(LinkList &La, LinkList &Lb,LinkList &Lc){LinkList pa=La->next;LinkList pb=Lb->next;LinkList pc;Lc=pc=La;while (pa&&pb){if (pa->data<=pb->data){pc->next=pa;pc=pa;pa=pa->next;}else {pc->next=pb; pc=pb;pb=pb->next; }}pc->next=pa?pa:pb;free(Lb);printf("");}//MergeList//输出单链表void Print_L(LinkList L){LinkList p;p=L->next;while(p){printf("%d ",p->data );p=p->next;}printf("\n");}实验3#include<stdio.h>#include<stdlib.h>#include <malloc.h>//定义存储结构typedef struct Lnode{int data; /*每个元素数据信息*/struct Lnode *next; /*存放后继元素的地址*/} LNode,*LinkList;int main(){void Create_L(LinkList &L,int n);void Print_L(LinkList L);void ReverseList(LinkList L);LinkList La;//创建单链表Laint n;printf("请输入链表La中的元素个数:\n");scanf("%d",&n);Create_L(La,n);//初始化单链表printf("现在La中的元素顺序为:\n");Print_L(La);printf("-------------------------------------\n\ n");ReverseList(La);printf("逆置后,La的元素顺序为:\n");Print_L(La);}void Create_L(LinkList &L,int n){int j=1;L=(LinkList)malloc(sizeof(Lnode));L->next =NULL;//先建立一个带头结点的单链线性表Lfor(int i=n;i>0;--i){LinkListp=(LinkList)malloc(sizeof(Lnode));printf("请输入链表中的第%d个元素:\n",j++);scanf("%d",&p->data);p->next=L->next;L->next =p;}//(逆序实现)/*LinkList q=L;for(int i=1;i<=n;i++){LinkList p=(LinkList)malloc (sizeof(Lnode));q->next=p;p->next=NULL;q=q->next ;printf("请输入链表La中的第%d个元素:\n",i);scanf("%d",&p->data);}//(正序实现)*/}//初始化单链表//输出单链表void Print_L(LinkList L){LinkList p;p=L->next;while(p){printf("%d ",p->data );p=p->next;}printf("\n");}void ReverseList(LinkList L){LinkList p,q;p=L->next;L->next=NULL;while(p!=NULL){q=p->next; /*q指针保留p->next得值*/p->next=L->next;L->next=p; /*将p结点头插入到单链表L中*/p=q; /*p指向下一个要插入的结点*/}} 思考1#include<stdio.h>#include<stdlib.h>#include <malloc.h>#define OK 1#define ERROR 0typedef int Status;typedef int ElemType;//定义存储结构typedef struct Lnode{int data; /*每个元素数据信息*/struct Lnode *next; /*存放后继元素的地址*/} LNode,*LinkList;int main(){void Create_L(LinkList &L,int n);void Print_L(LinkList L);void MergeList_L(LinkList &La, LinkList &Lb,LinkList &Lc);LinkList La,Lb,Lc;//创建单链表La,Lb,Lcint n;printf("请输入链表La中的元素个数:\n");scanf("%d",&n);Create_L(La,n);//初始化单链表printf("现在La中的元素为:\n");Print_L(La);printf("请输入链表Lb中的元素个数:\n");scanf("%d",&n);Create_L(Lb,n);//初始化单链表printf("现在Lb中的元素为:\n");Print_L(Lb);Create_L(Lc,0);printf("-------------------------------------\n\n");printf("开始合并:\n");MergeList_L(La, Lb,Lc);printf("-------------------------------------\n\n");printf("合并后,Lc的元素为\n"); Print_L(Lc);}void Create_L(LinkList &L,int n){int j=1;L=(LinkList)malloc(sizeof(Lnode)); L->next =NULL;//先建立一个带头结点的单链线性表L/*for(int i=n;i>0;--i){LinkListp=(LinkList)malloc(sizeof(Lnode));printf("请输入链表中的第%d个元素:\n",j++);scanf("%d",&p->data);p->next=L->next;L->next =p;}//(逆序实现)*/LinkList q=L;for(int i=1;i<=n;i++){LinkList p=(LinkList)malloc (sizeof(Lnode));q->next=p;p->next=NULL;q=q->next ;printf("请输入链表La中的第%d 个元素:\n",i);scanf("%d",&p->data);}//(正序实现) }//初始化单链表//有序单链表La和Lb的归并void MergeList_L(LinkList &La, LinkList &Lb,LinkList &Lc){ LinkList q;LinkList pa=La->next;LinkList pb=Lb->next;LinkList pc;Lc=pc=La;while (pa&&pb){if (pa->data<pb->data){pc->next=pa;pc=pa;pa=pa->next;}elseif(pa->data>pb->data){pc->next=pb;pc=pb;pb=pb->next; }else{pc->next=pa;pc=pa;pa=pa->next;q=pb->next;delete pb;pb=q;}}pc->next=pa?pa:pb;delete Lb;printf("");}//MergeList//输出单链表void Print_L(LinkList L){LinkList p;p=L->next;while(p){printf("%d ",p->data );p=p->next;}printf("\n");}void Delete_LinkList(LinkList &L) {LinkList p=NULL,s,t;if(L){p=p->next;while(p!=NULL){}}} 思考2#include<stdio.h>#include<stdlib.h>typedef struct node{int data;//数据域struct node *next;//指针域}L;void Initial_List(L * &h){L *p;//用于插入L *r;//尾结点h=(L *)malloc(sizeof(L));h->next = NULL;r=h;//尾结点始指向结点printf("输入数据(空格间隔数据回车结束):\n");//尾插入结点do{p=(L *)malloc(sizeof(L));scanf("%d",&(p->data));r->next = p;r = p;}while(getchar()!='\n');r->next = NULL;}void Disp_List(L * h){L *p=h->next;if(!p){printf("空!\n");return;}while(p){printf("%-3d",p->data);p=p->next;}printf("\n");}void Separate(L * &la,L * &lb,L *lc)//链表l3l1l2 l1保存奇数号结点l2保存偶数号结点{int flag=0;//结点号标记L *p = lc->next;//用于遍历链表l3L *r1,*r2,*x,*y;la=(L *)malloc(sizeof(L));lb=(L *)malloc(sizeof(L));r1=la;r2=lb;la->next = lb->next =NULL;while(p){flag++;if(flag%2 == 1){x=(L *)malloc(sizeof(L));x->data = p->data;r1->next = x;r1 = x;}else{y = (L *)malloc(sizeof(L));y->data = p->data;r2->next = y;r2 = y;}p=p->next;}r1->next = r2->next = NULL; }int main(){L *la,*lb,*lc;Initial_List(lc); Separate(la,lb,lc); printf("lc:\n"); Disp_List(lc); printf("la:\n"); Disp_List(la); printf("lb:\n"); Disp_List(lb); return 0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单链表的基本操作代码
1. 什么是单链表
单链表是一种常见的数据结构,由多个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。
每个节点都只知道下一个节点的地址,而不知道前驱节点的地址。
单链表中的第一个节点称为头结点,最后一个节点称为尾节点。
单链表的基本操作包括插入、删除、查找等。
2. 单链表的节点定义
在编写单链表的基本操作代码之前,我们首先需要定义单链表的节点结构。
一个节点包含两部分信息:数据元素和指向下一个节点的指针。
typedef struct Node {
int data; // 数据元素
struct Node* next; // 指向下一个节点的指针
} Node;
3. 创建单链表
创建单链表的基本操作是不断在链表的末尾添加节点,直至达到指定的长度。
下面是创建单链表的代码示例:
Node* createList(int length) {
Node* head = NULL; // 头结点
Node* tail = NULL; // 尾节点
for (int i = 0; i < length; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
printf("请输入第 %d 个节点的数值:", i + 1);
scanf("%d", &(newNode->data));
newNode->next = NULL;
if (head == NULL) {
head = newNode;
tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
return head;
}
以上代码中,我们通过循环输入节点的数据元素,并依次添加到链表的末尾。
首先创建一个空链表,并使用head和tail两个指针分别指向头结点和尾节点。
每次添加节点时,我们将其设置为尾节点,更新tail指针即可。
4. 遍历单链表
遍历单链表是指依次访问链表中的每个节点,并对其进行操作或输出。
下面是遍历单链表的代码示例:
void traverseList(Node* head) {
Node* p = head;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
}
以上代码中,我们使用一个指针p初始化为头结点,并进行循环遍历。
每次迭代时,输出当前节点的数据元素,并将指针p更新为下一个节点。
5. 在单链表中插入节点
在单链表中插入节点是指在指定位置之前插入一个新的节点。
具体的插入操作需要考虑两种情况:插入位置为头结点和插入位置为其他节点。
以下是在单链表中插入节点的代码示例:
void insertNode(Node* head, int position, int value) {
Node* p = head;
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = NULL;
if (position == 0) { // 插入位置为头结点
newNode->next = head;
head = newNode;
} else { // 插入位置为其他节点
for (int i = 0; i < position - 1 && p != NULL; i++) {
p = p->next;
}
if (p == NULL) {
printf("插入位置无效!\n");
return;
}
newNode->next = p->next;
p->next = newNode;
}
}
以上代码中,我们首先根据插入位置创建一个新的节点,并将其值设置为指定值。
然后,我们分别考虑了插入位置为头结点和其他节点的情况。
如果插入位置为头结点,我们将新节点的指针指向原头结点,并将头指针指向新节点。
如果插入位置为其他节点,我们需要遍历链表找到插入位置的前一个节点,并进行相应的插入操作。
6. 在单链表中删除节点
在单链表中删除节点是指从链表中删除指定位置的节点。
具体的删除操作也需要考虑两种情况:删除位置为头结点和删除位置为其他节点。
以下是在单链表中删除节点的代码示例:
void deleteNode(Node** head, int position) {
Node* p = *head;
if (position == 0) { // 删除位置为头结点
*head = (*head)->next;
free(p);
} else { // 删除位置为其他节点
Node* prev = NULL;
for (int i = 0; i < position && p != NULL; i++) {
prev = p;
p = p->next;
}
if (p == NULL) {
printf("删除位置无效!\n");
return;
}
prev->next = p->next;
free(p);
}
}
以上代码中,我们分别考虑了删除位置为头结点和其他节点的情况。
如果删除位置为头结点,我们首先将头指针指向下一个节点,并释放原头结点的内存空间。
如果删除位置为其他节点,我们需要遍历链表找到指定位置的节点,并记录其前一个节点。
然后,将前一个节点的指针指向要删除节点的下一个节点,并释放要删除节点的内存空间。
7. 单链表的查找操作
在单链表中进行查找操作是指查找给定值的节点,并返回其位置或相关信息。
单链表的查找操作包括按值查找和按位置查找两种方式。
以下是单链表的查找操作的代码示例:
int findNodeByValue(Node* head, int value) {
Node* p = head;
int position = 0;
while (p != NULL && p->data != value) {
p = p->next;
position++;
}
if (p == NULL) {
return -1; // 未找到指定值的节点
}
return position;
}
Node* findNodeByPosition(Node* head, int position) {
Node* p = head;
for (int i = 0; i < position && p != NULL; i++) {
p = p->next;
}
return p;
}
以上代码中,按值查找操作通过遍历链表的方式找到指定值的节点,并返回其位置。
如果找到了该节点,则返回其位置;如果未找到该节点,则返回 -1。
按位置查找
操作通过遍历链表的方式找到指定位置的节点,并返回该节点的指针。
8. 单链表的基本操作总结
单链表的基本操作包括创建、遍历、插入、删除和查找等操作。
通过创建一个节点结构体和相应的操作函数,我们可以方便地对单链表进行操作。
在创建单链表时,我们通过不断向链表的末尾添加节点来创建一个完整的链表。
遍历单链表时,我们使用一个指针从头结点开始依次访问每个节点,并对其进行操作或输出。
在插入和删除节点时,我们需要考虑插入或删除位置为头结点和其他节点的不同情况,并进行相应的操作。
在查找节点时,我们可以按值或按位置进行查找,并返回相应的信息。
通过掌握单链表的基本操作,我们可以更灵活地处理链表相关的问题。
同时,也可以应用到各种算法和数据结构的实现中。