C语言链表的建立、插入和删除
纯C语言实现循环双向链表创建,插入和删除
纯C语⾔实现循环双向链表创建,插⼊和删除#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct DLNode{
ElemType data;
struct DLNode *next;
struct DLNode *prior;
}DLNode;
DLNode *InitList(DLNode *DL);//初始化
int ListEmpty(DLNode *DL);//判空
int ListLength(DLNode *DL);//返回链表长度
int ListInsert(DLNode *DL, int i, ElemType e);//插⼊元素
int ListDelete(DLNode *DL, int i);//删除第i个元素
void TraverseList(DLNode *DL);//遍历线性表
//初始化
DLNode* InitList(DLNode *DL){
int x;
DLNode *p = NULL;
DLNode *r = NULL;
DL = (DLNode *)malloc(sizeof(DLNode));
DL->next = DL;
DL->prior = DL;
r = DL;
printf("输⼊直到-1为⽌\n");
while(1){
scanf("%d", &x);
if(x == -1){
printf("初始化成功\n");
break;
}
p = (DLNode *)malloc(sizeof(DLNode));
数据结构C语言单链表上实现插入和删除的算法实验报告
一、实验目的
1.掌握单链表的基本操作:插入、删除、查找以及表的合并等运算。2.掌握运用C语言上机调试单链表的基本方法。
二、实验任务
1.试编写在单链表上实现插入和删除的算法。
三、程序流程图
四、测试过程及结果
五、总结
1.程序特点:最小化、模块化、for循环。
2.单链表特点:动态分配内存、必须从已知指针逐一查找数据、通过改变数据间的链接改变顺序。
附录程序清单
#include <stdio.h>
#include <stdlib.h>
struct NODE{
int data;
NODE *next;
};
NODE *creatlink()
{
NODE *head,*p,*s;
int i,n;
head=(NODE *)malloc(sizeof(NODE));
p=head;
scanf("%d",&n);
for(i=0;i<n;i++)
{
s=(NODE *)malloc(sizeof(NODE));
scanf("%d",&s->data);
p->next=s;
p=s;
}
p->next=0;
return head;
}
void print(NODE *p)
{
for(p=p->next;p!=0;p=p->next)
printf("%d ",p->data);
printf("\n");
}
void insert(NODE *p,int i,int x)
{
NODE *s;
int j;
for(j=1;j<i;j++)
p=p->next;
c语言单链表头插法实现链表逆置
c语言单链表头插法实现链表逆置链表是一种常用的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在C语言中,我们可以使用单链表来实现各种操作,如插入、删除和查找等。本文将介绍如何使用头插法实现链表的逆置。
首先,我们需要定义一个链表节点的结构体,包含数据和指向下一个节点的指针。代码如下:
```c
typedef struct Node {
int data;
struct Node* next;
} Node;
```
接下来,我们需要实现链表的创建和逆置函数。首先,创建一个空链表,并将头节点指针指向NULL。代码如下:
```c
Node* createList() {
Node* head = NULL;
return head;
}
```
然后,我们可以实现链表的插入函数,使用头插法将新节点插入到链表的头部。代码如下:
```c
Node* insertNode(Node* head, int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = head;
head = newNode;
return head;
}
```
接下来,我们可以实现链表的逆置函数,通过遍历链表,将每个节点插入到头部,从而实现链表的逆置。代码如下:
```c
Node* reverseList(Node* head) {
Node* newHead = NULL;
Node* temp = NULL;
数据结构——链表的创建、插入、删除
~
忸
ຫໍສະໝຸດ Baidu
~
顺序有什 么顾 虑,如图 2 示) 所 。
图4
( )双链表 的插入 二 对于双链表而言 , 一方面存在前 向链 , 另一方面存在后 向 链 ,这使得插入不仅仅变得方便,更变 的快捷 。对双链表完成
插入操作 ,就像 图 5 所示 。
图2
b .第二种方式较第一种而言更好 ,使将要放入 的新结点 的存储 内容与特定结 点的存储 内容相互置换 , 之后使得新放入 的结 点与特定 结点的最后 相链接 ,就是 依照后插 法实现功 能 ( 3所示就是 图 p指 向的特定 结点的存储 内容与 x中存储 内
s > a a x 一dt= :
/ 令 S指 向结点的存储 内容为 x / 半 * ① s >e t p > e t 一nx=一nx : 令新创设的结点 的指针指于 P 相邻 后方 的结点 /
② P >e ts 一nx= : p之 后 ,指 于 相 邻 后 方 的结 点 /
这样一来。便实 现了于单链表中数据的后插放置 。 ①②行顺序我们 不能去忽略, 因为常常这里就是很容产生 错误的地方 , 以说 , 可 这两句顺序错误 , 插入操作便不 能实现 , 因为 a 5的地址被存储在 a 4结点的指针域中 , 不是 明确 的, 如 果我们选择②先运行 ,则 a 5的地 址将 由于 x结点的地址数据 的抹去 , 不能够指 向 a 5以及其最 后的结点了。因为这个原因 , 我们不仅仅需要知道涉及结点 的指针为 明确或者 隐含 , 并且要 谨记将隐含结点先于别的结点执行 。
c语言链表的创建方法
c语言链表的创建方法
在C语言中,链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个值和一个指向下一个节点的指针。链表可以动态地添加或删除节点,因此在许多应用程序中被广泛使用。
链表的创建方法大致可以分为以下几个步骤:
1. 定义一个节点结构体
链表的节点通常包含一个值和一个指针,指针指向下一个节点。因此,我们需要定义一个结构体来表示节点:
```
struct Node {
int data;
struct Node* next;
};
```
其中,`data`表示节点的值,`next`表示指向下一个节点的指针。
2. 创建第一个节点
创建第一个节点时,我们需要先分配一段内存,然后将节点的值和指针都赋值为NULL:
```
struct Node* head = NULL;
head = (struct Node*)malloc(sizeof(struct Node));
head->data = 1;
head->next = NULL;
```
这里我们使用了`malloc`函数来分配内存,并将返回的指针强制转换为`struct Node*`类型,然后将节点的值和指针赋值为1和NULL。
3. 添加新节点
添加新节点时,我们需要先找到链表的末尾,然后在末尾添加新节点:
```
struct Node* newNode = NULL;
newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = 2;
newNode->next = NULL;
单片机 c语言 链表
单片机 c语言链表
在单片机上使用C语言实现链表通常涉及以下几个步骤:
1. 定义链表结构:链表由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在C语言中,这可以通过结构体来实现。例如:
```c
typedef struct Node {
int data; // 存储的数据
struct Node next; // 指向下一个节点的指针
} Node;
```
2. 创建新节点:在链表中添加新节点时,需要创建一个新的Node实例。例如:
```c
Node createNode(int data) {
Node newNode = (Node) malloc(sizeof(Node)); // 分配内存
if (newNode == NULL) { // 检查内存是否成功分配
printf("Memory allocation failed!\n");
return NULL;
}
newNode->data = data; // 设置节点数据
newNode->next = NULL; // 初始化指向下一个节点的指针为NULL return newNode;
}
```
3. 添加节点到链表:将新节点添加到链表的末尾,需要遍历链表找到最后一个节点,并将其next指针指向新节点。例如:
```c
void appendNode(Node head, int data) {
Node newNode = createNode(data); // 创建新节点
if (head == NULL) { // 如果链表为空,新节点就是头节点
单链表基本操作
单链表基本操作
在计算机科学里,链表是一种常见的数据结构,它可以用来解决各种
复杂的问题。其中,单链表是最常见的一种,它由一系列节点组成,
每个节点包含了一个数据元素和一个指针,指向下一个节点。这篇文
章将介绍单链表的基本操作,包括创建、插入、删除和遍历等。
创建单链表
创建单链表是基本操作之一,它有两种方法:头插法和尾插法。
头插法是从链表的头节点开始,逐个将新节点插入。具体来说,创建
一个空链表,设置一个头节点,将头节点的指针指向空;依次输入新
节点,将新节点的指针指向表头,将表头的指针指向新节点。这样,
每插入一个新节点就成为了新的表头,即最后插入的节点为新的表头。
尾插法则是从链表的尾节点开始,逐个将新节点插入。具体来说,创
建一个空链表,设置一个头节点,将头节点的指针指向空;依次输入
新节点,将新节点的指针指向空,将最后一个节点的指针指向新节点。这样,最后插入的节点为尾节点,它的指针值为空。
插入节点
插入节点是指在单链表的任意位置插入一个新节点。插入节点的前提是找到插入位置,可以通过遍历单链表来查找插入位置。插入新节点的基本步骤如下:
1、创建新节点;
2、将新节点的指针指向待插入节点的后继节点;
3、将待插入节点的指针指向新节点。
删除节点
删除节点是指删除单链表中的任意节点。删除节点的前提是找到删除的节点位置,可以通过遍历单链表来查找删除位置。删除节点的基本步骤如下:
1、找到要删除的节点;
2、将该节点的前驱节点的指针指向该节点的后继节点;
3、删除该节点。
遍历节点
遍历节点是指按照链表的顺序依次访问链表中的各个节点。遍历节点
C语言 单链表的基本操作(创建插入,删除,排序,逆置,释放,打印)
//单链表基本操作:创建(头插法,尾插法),排序,删除结点,打印,释放,逆置。//头结点存放数据,经本人测试编译通过无任何问题!
#include <stdio.h>
#include<stdlib.h>
typedef struct node
{
int num;
struct node *next;
}lnode;
lnode *head_insert(lnode *head) //头插法
{
lnode *p;
p=(lnode*)malloc(sizeof(lnode));
scanf("%d",&p->num);
if(head==NULL)
{
head=p;
head->next=NULL;
}
else
{
p->next=head;
head=p;
}
return head;
}
lnode *tail_insert(lnode *head) //尾插法
{
lnode *p,*q;
p=(lnode*)malloc(sizeof(lnode));
scanf("%d",&p->num);
if(head==NULL)
{
q=p;
head=q;
}
else
{
for(q=head;q->next!=NULL;q=q->next);
q->next=p;
q=p;
}
q->next=NULL;
return head;
}
lnode *del(lnode *head) //删除结点
{
lnode *p,*q;
int n;
int flag=0;
p=q=head;
printf("请输入删除的数据\n");
【IT专家】用c语言完成一个双向链表的创建,插入,删除
本文由我司收集整编,推荐下载,如有疑问,请与我司联系
用c 语言完成一个双向链表的创建,插入,删除2014/09/13 2471 /*dlist.h*/
#ifndef DList_H #define DList_H typedef int Item; typedef struct Node * PNode; //节点指针typedef PNode Position; //节点位置/*定义节点类型*/ typedef struct Node { Item data; /*数据域*/ PNode previous; /*指向前驱*/ PNode next; /* 指向后继*/ }Node; /*定义链表类型*/ typedef struct { PNode head; /*指向头节
点*/ PNode tail; /*指向尾节点*/ int size; //链表长度}DList; /*分配值为i 的节点,并返回节点地址*/ Position MakeNode(Item i); /*释放p 所指的节点*/ void FreeNode(PNode p); /*构造一个空的双向链表*/ DList* InitList(); /*删除一个
双向链表*/ void DestroyList(DList *plist); /*将一个链表置为空表,释放原链表节
点空间*/ void ClearList(DList *plist); /*返回头节点地址*/ Position GetHead(DList *plist); /*返回尾节点地址*/ Position GetTail(DList *plist); /*返
c语言list定义
c语言list定义
C语言中的List(链表)定义和使用
链表(List)是一种常见的数据结构,它在C语言中被广泛使用。链表是由节点(Node)组成的,每个节点包含数据以及指向下一个节点的指针。相比于数组,链表的长度可以动态调整,更加灵活。
1. 链表的定义与结构
在C语言中,我们可以使用结构体来定义链表的节点。一个简单的链表节点定义如下:
```c
struct Node {
int data; // 存储的数据
struct Node* next; // 指向下一个节点的指针
};
```
2. 创建链表
要创建一个链表,我们首先需要定义一个指向链表头部的指针,通常称为头指针(head)。创建一个空链表的步骤如下:
```c
struct Node* head = NULL; // 初始化头指针为空
```
3. 插入节点
链表的插入操作通常包括在链表的头部或尾部插入节点,以及在指定位置插入节点。下面是几个常见的插入操作示例:
在链表头部插入节点:
```c
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); // 创建新节点
newNode->data = 1; // 设置新节点的数据
newNode->next = head; // 将新节点的next指针指向当前头节点head = newNode; // 更新头指针,使其指向新节点
```
在链表尾部插入节点:
```c
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); // 创建新节点
数据结构链表的基本操作
数据结构链表的基本操作
一、引言
链表是计算机科学中的一种数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表可以用于实现栈、队列和其他数据结构。本文将详细介绍链表的基本操作。
二、链表的基本概念
1. 节点:链表中的每个元素称为节点,它包含两部分:数据和指向下一个节点的指针。
2. 头结点:链表中第一个节点称为头结点,它不包含实际数据,只有指向第一个真正节点的指针。
3. 尾节点:链表中最后一个节点称为尾节点,它的指针为空。
4. 空链表:不包含任何元素的链表称为空链表。
三、链表的基本操作
1. 创建链表
创建一个空链表很简单,只需要让头结点指针为空即可。如果需要创建带有多个元素的非空链表,则需要依次创建每个节点,并将前一个节点的指针指向当前节点。
2. 插入元素
在插入元素时,需要先找到要插入位置前面的那个节点。然后新建一个要插入的节点,并将其指针指向原来位置上后面那个节点。最后将前面那个节点的指针改为新建立的节点。
3. 删除元素
在删除元素时,需要先找到要删除的那个节点。然后将前一个节点的指针指向后一个节点,从而跳过要删除的那个节点。最后释放要删除的节点。
4. 遍历链表
遍历链表是指依次访问链表中每个元素。可以使用循环结构来实现遍历操作。从头结点开始,依次访问每个节点,并将其数据输出即可。
5. 查找元素
查找元素时,需要从头结点开始依次遍历每个节点,直到找到目标元素或者遍历完整个链表为止。
6. 反转链表
反转链表是指将原来的链表顺序倒置。可以使用三个指针分别表示当前节点、前一个节点和后一个节点,依次修改它们之间的指针即可实现反转操作。
实现链表的插入和删除操作(C++)
实现链表的插入和删除操作(C++)链表是一种常见的数据结构,它由一系列节点组成,每个节点包
含数据和指向下一个节点的指针。链表的特点是插入和删除操作的时
间复杂度为O(1),即常数时间复杂度。这使得链表在需要频繁进行插
入和删除操作的场景下非常高效。
在C++中,可以通过定义一个节点类来实现链表的插入和删除操作。节点类包含一个数据成员和一个指向下一个节点的指针成员。具体实
现如下:
```cpp
class 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) {
//未找到匹配的节点
c语言链表定义
c语言链表定义
链表是一种非常基础的数据结构,它的定义可以用多种编程语言来实现,其中最为常见的就是C语言。本文将着重介绍C语言的链表定义。
第一步:首先,我们需要定义一个链表节点的结构体,用来存储链表中每个节点的数据信息以及指向下一个节点的指针。具体代码如下所示:
```
struct ListNode {
int val;
struct ListNode *next;
};
```
在这个结构体中,我们定义了两个成员变量,一个是表示节点值的val,一个是表示指向下一个节点的指针next。其中,节点值可以是任意类型的数据,而指针next则是一个指向结构体类型的指针。
第二步:我们需要定义链表的头节点,通常会将头节点的指针定义为一个全局变量,方便在程序的不同部分中都能够访问。这个头节点的作用是指向链表的第一个节点,同时也充当了哨兵节点的作用,使得链表的操作更加方便。具体代码如下所示:
```
struct ListNode *list_head = NULL;
```
在这个全局变量中,我们定义了一个指向链表头节点的指针
list_head,并将它初始化为NULL,表示目前链表为空。
第三步:链表的基本操作主要包括创建、插入、删除和遍历等。我们将逐一介绍它们的定义方法。
1. 创建链表
创建链表时,我们需要动态地分配内存,以保证每个节点的空间
都是连续的而不会被覆盖。具体代码如下所示:
```
struct ListNode *create_list(int arr[], int n) {
struct ListNode *head = NULL, *tail = NULL;
链表基本操作
链表基本操作
链表作为一种重要的数据结构,在计算机程序设计中被广泛应用。链表是一种元素之间通过指针相连接的线性结构,每个元素包含数据和指向下一个元素的指针。链表能够灵活地增加和删除元素,适用于许多需要频繁插入和删除数据的场景。在本文中,我们将介绍链表的基本操作,并按照类别进行介绍。
创建链表
链表的创建是链表操作的第一步。首先需要声明链表节点类型的结构体,并定义链表头指针。然后通过动态内存分配函数malloc为链表节点动态分配内存,建立链表节点之间的关系,直到最后一个节点。
struct Node
{
int data;
Node* next;
};
Node* createLinkedList(int n)
{
Node* head = NULL;
Node* tail = NULL;
for(int i = 0; i < n; i++)
{
Node* node = (Node*)malloc(sizeof(Node));
node->data = 0;
node->next = NULL;
if(head == NULL)
{
head = node;
}
else
{
tail->next = node;
}
tail = node;
}
return head;
}
插入数据
链表的插入操作包括在链表头插入和在链表尾插入两种情况。在链表头插入时,新节点的指针指向链表头,链表头指针指向新节点。在链表尾插入时,先找到链表尾节点,然后将新节点插入在尾节点后面。
void insertAtFront(Node** head, int data)
C语言链表的建立、插入和删除
数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性。但数组也同样存在一些弊病。如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中针对不同问题有时需要3 0个大小的数组,有时需要5 0个数组的大小,难于统一。我们只能够根据可能的最大需求来定义数组,常常会造成一定存储空间的浪费。我们希望构造动态的数组,随时可以调整数组的大小,以满足不同问题的需要。链表就是我们需要的动态数组。它是在程序的执行过程中根据需要有数据存储就向系统要求申请存储空间,决不构成对存储区的浪费。
链表是一种复杂的数据结构,其数据之间的相互关系使链表分成三种:单链表、循环链表、双向链表,下面将逐一介绍。
7.4.1 单链表
图7 - 3是单链表的结构。
单链表有一个头节点h e a d,指向链表在内存的首地址。链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员(实际需要保存的数据)和指向下一个结构体类型节点的指针即下一个节点的地址(事实上,此单链表是用于存放整型数据的动态数组)。链表按此结构对各节点的访问需从链表的头找起,后续节点的地址由当前节点给出。无论在表中访问那一个节点,都需要从链表的头开始,顺序向后查找。链表的尾节点由于无后续节点,其指针域为空,写作为N U L L。
图7 - 3还给出这样一层含义,链表中的各节点在内存的存储地址不是连续的,其各节点的地址是在需要时向系统申请分配的,系统根据内存的当前情况,既可以连续分配地址,也可以跳跃式分配地址。
看一下链表节点的数据结构定义:
c语言中操作list的方法
c语言中操作list的方法
在C语言中,操作链表(list)的方法主要包括以下几个方面:
1. 创建链表,首先需要定义一个链表的结构体,包含数据和指
向下一个节点的指针。然后通过动态内存分配函数(如malloc)来
创建节点,并建立节点之间的关系,形成链表。
2. 插入节点,可以在链表的任意位置插入新的节点。插入操作
需要修改指针的指向,将新节点插入到指定位置,并调整前后节点
的指针。
3. 删除节点,可以删除链表中的指定节点。删除操作需要修改
指针的指向,将待删除节点的前后节点连接起来,并释放待删除节
点的内存。
4. 遍历链表,通过遍历链表,可以访问链表中的每个节点,并
对节点进行操作。可以使用循环来遍历链表,从头节点开始,依次
访问每个节点,直到链表结尾。
5. 查找节点,可以按照指定的条件在链表中查找节点。可以通
过遍历链表,逐个比较节点的值,找到符合条件的节点。
6. 修改节点,可以修改链表中指定节点的值。可以通过遍历链表,找到需要修改的节点,然后修改节点的值。
7. 销毁链表,当链表不再使用时,需要释放链表所占用的内存空间。可以通过遍历链表,释放每个节点的内存,最后释放链表的头节点。
总结起来,操作链表的方法包括创建链表、插入节点、删除节点、遍历链表、查找节点、修改节点和销毁链表。通过这些方法,可以对链表进行各种操作,实现对数据的存储和处理。在具体实现过程中,需要注意指针的操作和内存管理,确保链表的正确性和高效性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性。但数组也同样存在一些弊病。如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中针对不同问题有时需要3 0个大小的数组,有时需要5 0个数组的大小,难于统一。我们只能够根据可能的最大需求来定义数组,常常会造成一定存储空间的浪费。我们希望构造动态的数组,随时可以调整数组的大小,以满足不同问题的需要。链表就是我们需要的动态数组。它是在程序的执行过程中根据需要有数据存储就向系统要求申请存储空间,决不构成对存储区的浪费。
链表是一种复杂的数据结构,其数据之间的相互关系使链表分成三种:单链表、循环链表、双向链表,下面将逐一介绍。
7.4.1 单链表
图7 - 3是单链表的结构。
单链表有一个头节点h e a d,指向链表在内存的首地址。链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员(实际需要保存的数据)和指向下一个结构体类型节点的指针即下一个节点的地址(事实上,此单链表是用于存放整型数据的动态数组)。链表按此结构对各节点的访问需从链表的头找起,后续节点的地址由当前节点给出。无论在表中访问那一个节点,都需要从链表的头开始,顺序向后查找。链表的尾节点由于无后续节点,其指针域为空,写作为N U L L。
图7 - 3还给出这样一层含义,链表中的各节点在内存的存储地址不是连续的,其各节点的地址是在需要时向系统申请分配的,系统根据内存的当前情况,既可以连续分配地址,也可以跳跃式分配地址。
看一下链表节点的数据结构定义:
struct node
{
int num;
struct node *p;
} ;
在链表节点的定义中,除一个整型的成员外,成员p是指向与节点类型完全相同的指针。在链表节点的数据结构中,非常特殊的一点就是结构体内的指针域的数据类型使用了未定义成功的数据类型。这是在C中唯一规定可以先使用后定义的数据结构。
•单链表的创建过程有以下几步:
1 ) 定义链表的数据结构。
2 ) 创建一个空表。
3 ) 利用m a l l o c ( )函数向系统申请分配一个节点。
4 ) 将新节点的指针成员赋值为空。若是空表,将新节点连接到表头;若是非空表,将新
节点接到表尾。
5 ) 判断一下是否有后续节点要接入链表,若有转到3 ),否则结束。
•单链表的输出过程有以下几步
1) 找到表头。
2) 若是非空表,输出节点的值成员,是空表则退出。
3 ) 跟踪链表的增长,即找到下一个节点的地址。
4) 转到2 )。
[例7-5] 创建一个存放正整数(输入- 9 9 9做结束标志)的单链表,并打印输出。#include
#include
struct node /*链表节点的结构* /
{
int num;
struct node *next;
} ;
m a i n ( )
{
struct node *creat(); / *函数声明* /
void print();
struct node *head; / * 定义头指针* /
head=NULL;/*建一个空表*/
head=creat(head);/*创建单链表*/
print(head);/*打印单链表*/
}
/******************************************/
struct node*creat(structnode*head)函/数*返回的是与节点相同类型的指针*/
{
struct node*p1,*p2;
p1=p2=(structnode*)malloc(sizeof(structnode));申请/*新节点*/
scanf("%d",&p1->num);/*输入节点的值*/
p1->next=NULL;/*将新节点的指针置为空*/
while(p1->num>0)/*输入节点的数值大于0*/
{
if(head==NULL)head=p1;/*空表,接入表头*/
elsep2->next=p1;/*非空表,接到表尾*/
p2=p1;
p1=(structnode*)malloc(sizeof(structnode));申/请*下一个新节点*/
scanf("%d",&p1->num);/*输入节点的值*/
}
return head;/*返回链表的头指针*/
}
/*******************************************/
void print(struct node*head)输/*出以head为头的链表各节点的值*/
{
struct node *temp;
temp=head;/*取得链表的头指针*/
while(temp!=NULL)/*只要是非空表*/
{
printf("%6d",temp->num);/*输出链表节点的值*/
temp=temp->next;/*跟踪链表增长*/
}
}
在链表的创建过程中,链表的头指针是非常重要的参数。因为对链表的输出和查找都要从链表的头开始,所以链表创建成功后,要返回一个链表头节点的地址,即头指针。
7.4.2 单链表的插入与删除
在链表这种特殊的数据结构中,链表的长短需要根据具体情况来设定,当需要保存数据时向系统申请存储空间,并将数据接入链表中。对链表而言,表中的数据可以依此接到表尾或连结到表头,也可以视情况插入表中;对不再需要的数据,将其从表中删除并释放其所占空间,但不能破坏链表的结构。这就是下面将介绍的链表的插入与删除。
1. 链表的删除
在链表中删除一个节点,用图7 - 4描述如下:
[例7-6] 创建一个学生学号及姓名的单链表,即节点包括学生学号、姓名及指向下一个节点的指针,链表按学生的学号排列。再从键盘输入某一学生姓名,将其从链表中删除。
首先定义链表的结构:
struct
从图7 - 4中看到,从链表中删除一个节点有三种情况,即删除链表头节点、删除链表的中间节点、删除链表的尾节点。题目给出的是学生姓名,则应在链表中从头到尾依此查找各节点,并与各节点的学生姓名比较,若相同,则查找成功,否则,找不到节点。由于删除的节点可能在链表的头,会对链表的头指针造成丢失,所以定义删除节点的函数的返回值定义为