链表的基本操作
单链表的基本操作实验报告

湖南第一师范学院信息科学与工程系实验报告课程名称:数据结构与算法成绩评定:实验项目名称:单链表的基本操作指导教师:学生姓名:沈丽桃学号: 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里的一对双引号不是英文状态下的。
单链表的基本操作

10)调用头插法的函数,分别输入10,20,分别回车:
11)调用尾插法的函数,分别输入30,40
12)查找单链表的第四个元素:
13)主函数中传入参数,删除单链表的第一个结点:
14)主函数传入参数,删除第0个未位置的元素,程序报错:
15)最后,输出单链表中的元素:
return 0;
}
6)编译,连接,运行源代码:
7)输入8,回车,并输入8个数,用空格分隔开,根据输出信息,可以看出,链表已经拆分为两个
五、实验总结
1.单链表采用的是数据+指针的表示形式,指针域总是指向下一个结
点(结构体)的地址,因此,在内存中的地址空间可以是不连续的,操作比顺序存储更加的方便
2.单链表使用时,需要用malloc函数申请地址空间,最后,删除元
素时,使用free函数释放空间。
c链表库函数

c链表库函数全文共四篇示例,供读者参考第一篇示例:C语言是一种广泛应用于系统编程的高级语言,而链表(Linked List)是C语言中常用的数据结构之一。
在C语言中,链表并不像数组一样有现成的库函数可以直接调用,需要通过自定义函数来实现链表的操作。
为了方便使用链表,不少开发者封装了链表操作的库函数,提供了一些常用的链表操作接口,以供开发者使用。
本文将介绍一些常见的C链表库函数及其用法。
一、链表的概念及基本操作链表是一种线性表的存储结构,由若干节点(Node)组成,每个节点包含数据域和指针域。
数据域用于存放数据,指针域用于指向下一个节点。
链表的最后一个节点指针域为空(NULL),表示链表的末尾。
常见的链表操作包括创建链表、插入节点、删除节点、遍历链表、查找节点等。
下面我们来看看C语言中常用的链表库函数。
二、常见的C链表库函数1. 创建链表在C语言中,创建链表的函数通常包括初始化链表头节点和链表节点的操作。
```#include <stdio.h>#include <stdlib.h>//定义链表节点typedef struct node {int data;struct node* next;} Node;2. 插入节点插入节点是链表操作中的重要操作,可以在链表的任意位置插入新节点。
常见的插入方式包括头部插入和尾部插入。
```//头部插入节点void insertNodeAtHead(Node* head, int data) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = head->next;head->next = newNode;}以上是常见的C链表库函数,这些函数可以帮助我们更方便地操作链表。
在实际开发中,可以根据需要自定义更多的链表操作函数,以满足具体的需求。
链队列的基本操作

链队列的基本操作
链队列是一种基于链表实现的队列,它具有链表的灵活性和队列的先进先出的特点。
链队列的基本操作包括初始化、入队、出队、判空和销毁等。
1. 初始化
链队列的初始化操作是创建一个空的链表作为队列的存储结构。
具体实现可以通过创建一个头结点来实现,头结点不存储任何数据,只是用来方便操作链表。
2. 入队
链队列的入队操作是在队列尾部插入一个新元素。
具体实现可以通过创建一个新的结点来实现,将新结点插入到队列尾部,并更新队列尾指针。
3. 出队
链队列的出队操作是从队列头部删除一个元素。
具体实现可以通过删除队列头部结点来实现,并更新队列头指针。
4. 判空
链队列的判空操作是判断队列是否为空。
具体实现可以通过判断队列头指针和队列尾指针是否相等来实现。
5. 销毁
链队列的销毁操作是释放队列占用的内存空间。
具体实现可以通过遍历整个链表,释放每个结点的内存空间来实现。
综上所述,链队列的基本操作包括初始化、入队、出队、判空和销毁等。
链队列的实现相对简单,但需要注意的是,在进行入队和出队操作时,需要更新队列头指针和队列尾指针,以保证队列的正确性。
同时,在进行销毁操作时,需要遍历整个链表,释放每个结点的内存空间,以避免内存泄漏的问题。
单链表的基本操作实验问题与对策

单链表的基本操作实验问题与对策单链表是一种非常基础且常见的数据结构,被广泛应用于计算机科学和相关领域中。
它通过使用一系列节点来存储元素,每个节点都包含一个值和一个指向下一个节点的指针。
这些节点以线性方式连接,形成了一个单向链表。
在进行单链表的基本操作实验时,可能会遇到一些常见的问题和挑战。
例如,在进行插入操作时,可能会出现指针错误或内存分配失败的问题。
在删除操作中,可能会遇到无法找到指定元素或无法正确更新节点指针的问题。
在进行查找操作时,可能会遇到查找效率低下或无法找到特定元素的问题。
而在遍历操作中,可能会遇到指针断裂或无限循环的问题。
为了解决这些问题,我们可以采取一些对策。
例如,在进行插入操作时,我们可以使用更高效的数据结构或算法来避免指针错误和内存分配失败的问题。
在删除操作中,我们可以使用更精确的查找算法来找到指定元素并正确更新节点指针。
在进行查找操作时,我们可以使用更优化的查找算法或数据结构来提高查找效率并找到特定元素。
而在遍历操作中,我们可以使用更安全的遍历算法来避免指针断裂和无限循环的问题。
总之,单链表是一种非常有用的数据结构,在进行基本操作实验时可能会遇到一些问题和挑战。
但只要我们采取适当的对策,就可以有效地解决这些问题并更好地应用单链表这种数据结构。
问题1:插入节点时如何确保正确的位置?对策:在插入节点之前,需要遍历链表以找到正确的位置。
可以使用循环来遍历链表,确保插入的位置是正确的。
另外,可以考虑维护一个指向前一个节点的指针,以便在插入时更容易操作。
问题2:如何删除节点?对策:删除节点时,需要找到待删除节点的前一个节点,并将其指针指向待删除节点的下一个节点,然后释放待删除节点的内存。
确保在删除节点之前释放内存,以避免内存泄漏。
问题3:如何遍历链表?对策:遍历链表通常需要使用循环,从链表的头节点开始,沿着指针依次访问每个节点,直到达到链表的末尾。
可以使用循环结构来实现遍历,或者使用递归方法。
单链表 头指针 尾指针 删除指定节点的方法

单链表的头指针和尾指针是单链表中非常重要的概念,它们分别指向链表的第一个节点和最后一个节点。
删除指定节点也是单链表中常见的操作之一。
本文将介绍单链表的头指针、尾指针以及删除指定节点的相关方法。
一、单链表简介单链表是由节点构成的链式结构,每个节点包括数据域和指针域。
数据域存储节点的数据,指针域指向下一个节点。
单链表中的第一个节点被称为头节点,最后一个节点的指针域为NULL。
二、头指针和尾指针1. 头指针头指针是指向链表中第一个节点的指针,它的作用是方便对链表的操作。
通过头指针可以找到链表的第一个节点,从而对链表进行遍历或其他操作。
2. 尾指针尾指针是指向链表中最后一个节点的指针,它的作用是快速定位链表的尾部。
通过尾指针可以直接找到链表的最后一个节点,而不需要遍历整个链表。
三、删除指定节点的方法单链表中的节点删除操作是常见而重要的操作,通过删除指定节点可以对链表进行精确的控制。
1. 删除指定节点的基本思路要删除单链表中的指定节点,需要找到待删除节点的前一个节点,然后修改指针域将其指向待删除节点的下一个节点。
具体步骤如下:- 遍历链表,找到待删除节点的前一个节点prev;- 将待删除节点的指针域赋值给prev的指针域,跳过待删除节点;- 释放待删除节点的内存空间。
2. 删除指定节点的实现实现删除指定节点的方法可以通过编程语言来完成。
下面以C语言为例,给出删除指定节点的代码示例:```cvoid deleteNode(Node* head, int value){Node* prev = head;Node* cur = head->next;while (cur != NULL){if (cur->data == value){prev->next = cur->next;free(cur);return;}prev = cur;cur = cur->next;}}```以上代码中,首先定义了两个指针prev和cur,分别指向头节点和下一个节点。
单链表的 基本操作

单向链表单向链表的基本操作,创建一个由6个节点组成的单向链表,显示链表中每个节点的数据,并且做增加、删除、查找节点以及计算单链表的长度等处理。
➢需求分析:1.功能(1)用尾插法创建一带头结点的由6个节点组成的单向链表:从键盘读入一组整数,作为单链表中的元素,输入完第6个结点后结束;将创建好的单链表元素依次输出到屏幕上。
(2)显示链表中每个节点的数据(3)从键盘输入一个数,查找在以上创建的单链表中是否存在该数;如果存在,显示它的位置,即第几个元素;如果不存在,给出相应提示如“No found node!”。
(4)在上述的单链表中的指定位置插入指定数据,并输出单链表中所有数据。
(5)删除上述单链表中指定位置的结点,并输出单链表中所有数据。
(6)求单链表的长度并输出.2.输入要求先输入单链表中结点个数n,再输入单链表中所有数据,在单链表中需查找的数据,需插入的数据元素的位置、值,要删除的数据元素的位置。
3。
测试数据单链表中所有数据:12,23,56,21,8,10在单链表中需查找的数据:56;24插入的数据元素的位置、值:1,28;7,28;0,28要删除的数据元素的位置:6➢概要设计:1.算法思想:由于在操作过程中要进行插入、删除等操作,为运算方便,选用带头结点的单链表作数据元素的存储结构.对每个数据元素,由一个数据域和一个指针域组成,数据域放输入的数据值,指针域指向下一个结点。
2.数据结构:单链表结点类型:typedef struct Liistnode {int data;struct Listnode *next;}NODE;3.模块划分:a)用尾插法建立带头结点的单链表*CreateList函数;b)显示链表中每个结点的数据PrintList函数;c)从键盘输入一个数,查找单链表中是否存在该数FoundList函数;d)在单链表中指定位置插入指定数据并输出单链表中所有数据InsertList函数;e)删除单链表中指定位置的结点并输出单链表中所有数据DeleteList函数;f)计算单链表的长度并在屏幕上输出LengthList函数;g)主函数main(),功能是给出测试数据值,建立测试数据值的带头结点的单链表,调用PrintList函数、FoundList函数、InsertList函数、DeleteList函数、LengthList函数实现问题要求。
qt 链表用法

qt 链表用法在Qt中,QList是一个模板类容器,可以存储多种数据类型。
与QString和QStringList类似,QList也提供了很多常用的方法。
以下是一些常用的QList方法:1. append():在链表尾部插入元素。
2. prepend():在链表头部插入元素。
3. insert():在指定位置插入元素。
4. replace():替换元素。
5. at():用下标访问元素。
6. removeFirst():删除第一个元素。
7. removeLast():删除最后一个元素。
8. removeAt():删除指定位置的元素。
9. removeOne():删除已知元素。
10. clear():清空链表。
此外,Qt还提供了两种风格的迭代器,Java风格和STL风格。
Java 风格的迭代器是QMutableListIterator,可以用链表进行初始化,并进行读写操作。
STL风格的迭代器则可以通过begin()和end()方法获取,用于遍历链表。
以下是一个简单的例子,展示如何使用QList:```cpp#include <QList>#include <QDebug>int main() {QList<int> list; // 创建一个存储整数的QListlist << 1 << 2 << 3 << 4 << 5; // 向链表中插入元素list.append(6); // 在链表尾部添加元素list.prepend(0); // 在链表头部添加元素list.insert(1, 99); // 在指定位置插入元素list[0] = 100; // 直接修改下标为0的元素list.replace(2, 66); // 替换下标为2的元素list.removeFirst(); // 删除第一个元素list.removeLast(); // 删除最后一个元素list.removeAt(2); // 删除指定位置的元素list.removeOne(7); // 删除已知元素list.clear(); // 清空链表// 使用迭代器遍历链表QList<int>::iterator it = list.begin();while (it != list.end()) {qDebug() << *it; // 输出当前元素的值++it; // 指向下一个元素}return 0;}```。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.链表的基本操作
对链表施行的操作有很多种,最基本的操作是在链表中插入结点、在链表中删除结点、在链表中查找结点等。
(1) 链表结点的插入
①在空链表中插入一个结点
空链表就是头指针为空的链表。
a)用如下语句申请一个new结点:
new=(struct node)calloc(1,sizeof(struct node));
b)为new结点填充数据:将要存储的数据对应传递给new结点数据域的各个成员。
c)修改有关指针的指向:将new的next成员置空,使new结点成为链表的最后一个结点;将head指向new结点。
②在链表的结点之后插入一个结点
要在链表head的C、D结点之间出入一个new结点,就是将new结点变成C结点的下一个结点,而new结点的下一个结点为D结点.
操作过程为:
a) 使new的指针域存储结点D的首地址。
b) 使C结点的指针域存储结点new的地址。
例2 建立学生成绩链表,链表有3个结点。
#include <stdio.h>
#define N 3
struct s_node
{
char num[4];
int score;
struct s_node *next;
};
main()
{
struct s_node *creat_node(void); /*生成链表结点的函数*/ struct s_node *creat_list(int n); /*建立链表的函数*/ void out_list(struct s_node *head); /*输出链表函数*/
struct s_node *head=NULL;
head=creat_list(N);
out_list(head);
}
struct s_node *creat_node(void) /*生成链表结点的函数*/ {
struct s_node *p;
int score;
fflush(stdin);
p=(struct s_node *)calloc(1,sizeof(struct s_node));
gets(p->num);
scanf("%d",&score);
p->score=score;
p->next=NULL;
return(p);
}
struct s_node * creat_list(int n) /*建立链表的函数*/ {
struct s_node *new,*p;
struct s_node *head;
int i;
if(n>=1)
{
new=creat_node();
head=new;
p=new;
}
for(i=2;i<=n;i++)
{
new=creat_node();
p->next=new;
p=new;
}
if(n>=1)
return(head);
else
return(NULL);
}
void out_list(struct s_node *head) /*输出链表函数*/
{
struct s_node *p;
if(head!=NULL)
{
p=head;
while(p!=NULL)
{
printf("%s %d\n",p->num,p->score);
p=p->next;
}
}
}
(2) 链表结点的删除
从链表中删除结点,就是撤销结点在链表中的链接,把结点从链表中孤立出来。
在链表链表中删除结点一般有两个过程:一是把指定的结点从链表中拿下来,它需要通过修改有关结点的指针域来完成;二是释放该结点使用的内存空间,它需要使用free()函数来完成。
如下是在head链表中删除p结点的delete_p()函数:
void delete_p(struct node *head,struct node *p)
{
struct node *q;
if(p==NULL)
{
printf("no found\n");
return;
}
if(p==head)
{
head=p->next;
q=p;
}
else
{
q=p->next;
p->next=q->next;
}
printf("\ndelete :%d\n",q->data);
free(q);
}
(3) 链表结点的查找
在链表中进行查找,就是从链表的第一个结点开始,沿着指针链,用查找值与链表结点逐个比较的过程。
找到符合要求的结点之后,停止查找过程,返回相应的结点指针,否则返回一个空指针。
例3 查找值为x的结点并删除
#include <stdio.h>
struct node
{
int data;
struct node *next;
};
struct node * creat_number(int n) /*建立链表的函数*/ {
struct node *new,*p;
struct node *head;
int i;
if(n>=1)
{
new=(struct node *)malloc(sizeof(struct node));
new->data=1;
new->next=NULL;
head=new;
p=new;
}
for(i=2;i<=n;i++)
{
new=(struct node *)malloc(sizeof(struct node));
new->data=i;
new->next=NULL;
p->next=new;
p=new;
}
if(n>=1)
return(head);
else
return(NULL);
}
void out_list(struct node *head) /*输出链表函数*/ {
struct node *p;
if(head!=NULL)
{
p=head;
while(p!=NULL)
{
printf("%d\n",p->data);
p=p->next;
}
}
}
struct node *find_x(struct node *head,int x) /*在链表中查找的函数*/
{
struct node *p,*q;
p=q=head;
while(p!=NULL&&p->data!=x)
{
q=p;
p=p->next;
}
if(p==NULL)
return(NULL);
else
return(q);
}
void delete_p(struct node *head,struct node *p) /*在链表中删除p结点的函数*/
{
struct node *q;
if(p==NULL)
{
printf("no found\n");
return;
}
if(p==head)
{
head=p->next;
q=p;
}
else
{
q=p->next;
p->next=q->next;
}
printf("\ndelete :%d\n",q->data); free(q);
}
main()
{
int n,x;
struct node *head=NULL,*p;
printf("Enter n,x:");
scanf("%d,%d",&n,&x);
head=creat_number(n);
out_list(head); p=find_x(head,x); delete_p(head,p); out_list(head); }。