头插法建立单链表
头插法和尾插法建立单链表

#include "stdio.h"#include "stdlib.h"typedef struct List{int data;struct List *next; //指针域}List;void HeadCreatList (List *L) //头插法建立链表{List *s;L->next=NULL;for (int i=0;i<10;i++){s=(struct List*)malloc(sizeof(struct List));s->data=i;s->next=L->next; //将L指向的地址赋值给S;L->next=s;}}void TailCreatList(List *L) //尾插法建立链表{List *s,*r;r=L;for (int i=0;i<10;i++){s=(struct List*)malloc(sizeof(struct List));s->data=i;r->next=s;r=s;}r->next=NULL;}void DisPlay(List *L){List *p=L->next;while(p!=NULL){printf ("%d ",p->data);p=p->next;}printf("\n");}int main (){List *L1,*L2;L1=(struct List*)malloc(sizeof(struct List));L2=(struct List*)malloc(sizeof(struct List)); HeadCreatList(L1);DisPlay(L1);TailCreatList(L2);DisPlay(L2);}//头插法创建链表#include <stdio.h>#include <stdlib.h>struct node{int data;struct node * next;};//建立只含头结点的空链表struct node * create_list(){struct node * head = NULL;head = (struct node *)malloc(sizeof(struct node));if (NULL == head){printf("memory out of use/n");return NULL;}head->next = NULL;head->data = 0;return head;}//头插法建立链表int insert_form_head(struct node * head, int num){struct node * head_t = head->next;struct node * new_node = NULL;new_node = (struct node *)malloc(sizeof(struct node));if (NULL == new_node){printf("memory out of use/n");return -1;}//将新结点插入到链表的最后new_node->data = num;new_node->next = head_t;head->next = new_node;return 0;}//打印链表int show_list(struct node * head){struct node * temp;temp = head->next;while(temp){printf("%d/n",temp->data);temp = temp->next;}return 0;}// 按值删除结点,头结点不被删除int delete_node(struct node *head, int data){//head_t 保存要删除结点的上一个结点struct node * head_t = head;struct node * temp = NULL;if (head == NULL){printf("delete node from empty list!/n");return -1;}//查找删除的结点的前一个结点//如果此处查找的是删除的结点,则需要另加一个指针保存删除结点的前一个指针while(NULL != head_t->next){if (data == head_t->next->data)break;head_t = head_t->next;}//如果要删除的结点不存在,直接返回if (NULL==head_t->next){printf("node not found/n");return -1;}//删除操作temp = head_t->next;head_t->next = head_t->next->next;free(temp);return 0;}void main(int argc, char* argv[]){struct node * head;head = create_list();if (NULL == head)printf("create_list error/n");insert_form_head(head,123);insert_form_head(head,456);show_list(head);printf("delete once!/n");delete_node(head,123);show_list(head);printf("delete second!/n");delete_node(head,456);show_list(head);delete_node(head,0);show_list(head);}/*//尾插法创建链表#include<stdio.h>#include<stdlib.h>struct Node{int data;struct Node * next;};//建立只含头结点的空链表struct Node * create_list(){struct Node * head = NULL;head = (struct Node *)malloc(sizeof(struct Node));if (NULL == head){printf("memory out of use/n");return NULL;}head->next = NULL;head->data = 0;return head;//尾插法建立链表int insert_form_tail(struct Node * head, int num){struct Node * temp = head;struct Node * new_node = NULL;new_node = (struct Node *)malloc(sizeof(struct Node));if (NULL == new_node){printf("memory out of use/n");return -1;}//寻找尾结点while (temp->next != NULL){temp = temp->next;}//将新结点插入到链表的最后new_node->data = num;new_node->next = NULL;temp->next = new_node;return 0;}//打印链表int show_list(struct Node * head){struct Node * temp;temp = head->next;while(temp){printf("%d/n",temp->data);temp = temp->next;}return 0;}void main(int argc, char* argv[]){struct Node * head;head = create_list();if (NULL == head)printf("create_list error/n");insert_form_tail(head,123);insert_form_tail(head,456);show_list(head);*/。
描述单链表的创建过程

描述单链表的创建过程
单链表是一种常用的线性数据结构,它由一系列节点组成,每个节点包含数据元素和一个指向下一个节点的指针。
创建单链表的过程可以分为以下几个步骤:
定义节点结构:首先,需要定义节点的结构。
每个节点通常包含数据元素和一个指向下一个节点的指针。
在许多编程语言中,可以使用结构体或类来定义节点。
例如,在C++中,可以定义一个结构体来表示节点:
cpp
struct Node {
int data; // 数据元素
Node* next; // 指向下一个节点的指针
};
创建第一个节点:创建一个头节点,它是单链表的第一个节点。
头节点通常用于存储指向第一个节点的指针,以及执行一些额外的操作,如插入和删除。
头节点可以静态创建或动态创建。
插入节点:在单链表中插入新的节点涉及到在链表中找到正确的位置并将新节点添加到该位置。
有两种常见的插入方法:在头部插入和在尾部插入。
在头部插入时,新节点成为链表的第一个节点;在尾部插入时,新节点成为链表的最后一个节点。
删除节点:从单链表中删除节点需要找到要删除的节点,并将其从链表中移除。
这通常涉及到更新被删除节点的上一个节点的指针,使其指向被删除节点的下一个节点。
c语言单链表头插法实现链表逆置

c语言单链表头插法实现链表逆置链表是一种常用的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
在C语言中,我们可以使用单链表来实现各种操作,如插入、删除和查找等。
本文将介绍如何使用头插法实现链表的逆置。
首先,我们需要定义一个链表节点的结构体,包含数据和指向下一个节点的指针。
代码如下:```ctypedef struct Node {int data;struct Node* next;} Node;```接下来,我们需要实现链表的创建和逆置函数。
首先,创建一个空链表,并将头节点指针指向NULL。
代码如下:```cNode* createList() {Node* head = NULL;return head;}```然后,我们可以实现链表的插入函数,使用头插法将新节点插入到链表的头部。
代码如下:```cNode* insertNode(Node* head, int data) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = head;head = newNode;return head;}```接下来,我们可以实现链表的逆置函数,通过遍历链表,将每个节点插入到头部,从而实现链表的逆置。
代码如下:```cNode* reverseList(Node* head) {Node* newHead = NULL;Node* temp = NULL;while (head != NULL) {temp = head->next;head->next = newHead;newHead = head;head = temp;}return newHead;}```最后,我们可以编写主函数,测试链表的逆置功能。
代码如下:```cint main() {Node* head = createList();head = insertNode(head, 1);head = insertNode(head, 2);head = insertNode(head, 3);head = insertNode(head, 4);head = insertNode(head, 5);printf("原链表:");Node* temp = head;while (temp != NULL) {printf("%d ", temp->data);temp = temp->next;}printf("\n");head = reverseList(head);printf("逆置后的链表:");temp = head;while (temp != NULL) {printf("%d ", temp->data);temp = temp->next;}printf("\n");return 0;}```运行以上代码,输出结果如下:```原链表:5 4 3 2 1逆置后的链表:1 2 3 4 5```通过以上代码,我们成功地使用C语言的单链表头插法实现了链表的逆置。
《数据结构》-头插法建立单链表

LinkList head;
ListNode *s;
head=NULL;
printf("请输入链表各结点的数据(字符型):\n");
while((ch=getchar())!='\n')
{
s=(ListNode *)malloc(sizeof(ListNode ));
if(s==NULL)
{
printf("申请存储空间失败!");return head;
2020
数据结构
Data structure
头插法建立单链表
讲授:XXX
0.5 头插法建立单链表
要 假三设求、线:性链表表中的结插点入的数据类型是字符型,逐个输入这些字符,并以换行符‘\n’作为输入结束的条
件,使用头插法动态地建立单链表(不带头结点)。
算法思路:
从一个空表开始,重复读入数据,生成新结点,将读入数据存放在新结点的数据域中,然后将新结 点插入到当前链表的表头上,直到读入换行符'\n'为止。
图2-6 新结点前插
图2-7 头指针指向新结点
重复进行第②步到第⑥步,便可建立一个含有多个结点的 不带头结点的单链表,如图2-8。
head s
d
c
b
a^
图2-8 头插法建单链表
04
0.5
05
头插法建立单链表
具体算法:
LinkList CreatListF(void)
{//头插法建立单链表
DataType ch;
算法步骤:
①将头指针head置为
②读取字符ch,判断ch与'\n'是否不相
NULL,转向②。如图2-3。 等,若是转向③,否则,返回head。
单链表的头插法和尾插法c语言实现

单链表的头插法和尾插法c语⾔实现/*单链表的头插法和尾插法c语⾔实现*/#include <stdio.h>#include <stdlib.h>#include <string.h>#define SIZE 100/*简单的定义⼀个链表节点的数据单元*/typedef struct student_t{int num;char name[SIZE];struct student_t* pNext;}studentList, *pStudentList;/*定义⼀个全局的静态的链表头节点指针*/static pStudentList g_pstStudentList = NULL;/*创建⼀个学⽣信息的链表节点*/pStudentList createaOneStudentListNode(){pStudentList pNewNode = NULL;pNewNode = (pStudentList)malloc(sizeof(studentList));return pNewNode;}/*在链表头插⼊数据节点*/int addOneStudentToListHead(int num, char* name){pStudentList pNewNode = NULL;int result = 0;if ((num < 0) || (name == NULL)){result = -1;printf("error inoput parameter!\n");return result;}pNewNode = createaOneStudentListNode();pNewNode->num = num;memcpy(pNewNode->name, name, strlen(name));pNewNode->pNext = g_pstStudentList;g_pstStudentList = pNewNode;return result;}/*在链表尾部插⼊数据节点*/int addOneStudentToListTail(int num, char* name){pStudentList pTempHead = NULL;pStudentList pTailNode = NULL;pStudentList pNewNode = NULL;int result = 0;if ((num < 0) || (name == NULL)){result = -1;printf("error input parameter!\n");return result;}pTempHead = g_pstStudentList;while(pTempHead){if (pTempHead->pNext == NULL){pTailNode = pTempHead;}pTempHead = pTempHead->pNext;}pNewNode = createaOneStudentListNode();pNewNode->num = num;memcpy(pNewNode->name, name, strlen(name));pNewNode->pNext = NULL;pTailNode->pNext = pNewNode;return result;}/*输出整个链表中的学号信息,检查插⼊的是否正确,插⼊时没有考虑是否有相同学号*/ void printList(){pStudentList pTempHead = NULL;pTempHead = g_pstStudentList;while(pTempHead){printf("studnet num = %d\n", pTempHead->num);pTempHead = pTempHead->pNext;}}/*释放整个链表的资源*/void freeList(){pStudentList pTempHead = NULL;pStudentList pFree = NULL;int i = 0;pTempHead = g_pstStudentList;pFree = g_pstStudentList;while(pTempHead){pFree = pTempHead;printf("free studnet num = %d\n", pTempHead->num);pTempHead = pTempHead->pNext;if (pFree != NULL){printf("i = %d\n", i);/*测试是否正确释放资源*/free(pFree);}++i;}}int main(){/*构建头节点*/char* cName = "allan";g_pstStudentList = createaOneStudentListNode();g_pstStudentList->num = 0;memcpy(g_pstStudentList->name, cName, strlen(cName));g_pstStudentList->pNext = NULL;/*使⽤尾插法插⼊数据*/char* cName1 = "allan1";addOneStudentToListTail(1,cName1);/*使⽤尾插法插⼊数据*/char* cName2 = "allan2";addOneStudentToListTail(2,cName2);/*使⽤头插法插⼊数据*/char* cName3 = "allan3";addOneStudentToListHead(3,cName3);/*输出当前链表中存储的学号,没有考虑学号的唯⼀性,假设输⼊的都是不同数字*/ printList();/*使⽤完资源后进⾏释放资源,防⽌内存泄漏*/freeList();return 0;}使⽤VS2008运⾏结果如下图所⽰:。
单链表的创建算法

当一个序列中只含有指向它的后继结点的链接时,就称该链表为单链表。
单链表的创建算法如下:
创建一个结点,并为结点的数据部分赋予一个初始值。
创建一个指向下一个结点的指针,并将其初始化为NULL。
将新创建的结点插入到链表的头部或尾部。
重复步骤2和3,直到所有需要插入的结点都已插入链表。
在单链表中,最后一个结点的指针域被定义为空指针(NULL),以标识链表的结束。
此外,单链表可以有带头结点和不带头结点之分,具体根据实际需求选择。
单链表之头部插入节点

朱ቤተ መጻሕፍቲ ባይዱ鹏
1、单链表的算法之从头部插入节点 1.1、链表头部插入思路解析
在分析链表的算法的时候一定要注意心里有数,先搞清楚完成这个算法需要 哪几步,每步做什么,然后再去思考每步的代码实现是什么,否则就会只看到指 针指来指去,很快就晕头转向了。
头插入节点的两个重要步骤: (1)新节点的 pNext 指向原来的第一个节点的首地址,即新节点和原来的 第一个节点 相连。 (2)头结点的 pNext 指向新节点的首地址,即头结点和新节点相连。 经过这两步新节点就插入了头结点和原来的第一个节点之间,成为新的第一 个节点。 这两个步骤简单来讲就是先连接尾巴,后连接头部。
1.2、箭头非指向 (1)先回顾一下如何访问结构体当中的成员?没错,有符号“.”和符号“->” 两种方 式,这两种方式的区别这里就不在重复,理解这一点对与链表的学习有
很大的帮助。 (2)注意写代码过程中的箭头符号,和指针的指向是没有关系的,它们是两码 事,很 容易搞混。在现实生活中用->表示指向是常识,但是在 C 语言中->是用 指针的方式来访 问结构体当中的某个成员。换句话说链表中节点的连接过程 和程序中的->没有关系;链 表中的节点是通过指针的指向来连接的,编程中表 现为给指针变量赋值,实质是把后一 个节点的首地址赋值给前一个节点的 pNext 元素。请记住,箭头非指向,否则对链表的 理解会造成不小的困扰。
伪代码: insert_head() {
第 1 步: 新节点的 pNext 指向原来的第一个节点 第 2 步: 头节点的 pNext 指向新节点的地址 } 具体代码实现: void insert_head(struct node *pH, struct node *new) { new->pNext = pH->pNext; pH->pNext = new; } 请思考一下第一步和第二步的顺序可不可以交换一下? 如果我们先执行第二步,将头结点的 pNext 指针指向了新节点的首地址, 当我们想要执行第一步的时候就会发现原来的第一个有效节点的地址已经 丢失了,第一步自然也就做不下去了,所以这两步的顺序还是要注意一下的。
链表-头插法

1、请采用从链表头部插入的方式重新设计上述例子程序中的create( )函数(函数的功能和函数头都不变):每次插入的新节点都插入在链表的头部(即head指针指向刚插入的节点,刚插入节点的next指针指向原先head指针所指向的节点)。
#include<stdlib.h> /*包含malloc()的头文件*/#include<stdio.h>struct node /*链表节点的结构*/{int num;struct node * next;};struct node * create(struct node * head) /*返回新创建的链表的首指针*/ {int n;struct node * p1,* p2;p1=NULL;p2=NULL;while(1){scanf("%d",&n);if(n<0)break;p1=(node *)malloc(sizeof(node));p1->num=n;p2=p1;p1->next=head;head=p2;}return head; /*返回链表的头指针*/}void print(struct node * head) /*输出以head为头的链表各节点的值*/ {struct node * temp;temp=head; /*取得链表的头指针*/while(temp!=NULL) /*只要是非空表*/{printf("%d ",temp->num); /*输出链表节点的值*/temp=temp->next; /*跟踪链表增长*/}}void main(){struct node * head; /*定义头指针*/head=NULL; /*建一个空表*/head=create(head); /*创建单链表*/print(head); /*打印单链表*/}2、以下代码是从键盘上输入n个整数,将这些整数按从小到大的顺序依次保存到一个链表中,请仔细阅读代码并写出其是如何将一个节点按从小到大的顺序插入到链表中的。