单链表的使用(插入,查找,删除,链表的倒置,删除相同结点)


typedef struct node//该结构体代表一个结点
{
int data; //结点的数据域
struct node *next; //结点的指针域
}lnode,*linklist; //定义一个结构体变量和指向结构体的指针
//用头插法创建一个链表
linklist create_begin()
{
linklist head=(linklist)malloc(sizeof(lnode));//定义头结点并开辟空间
head->next=NULL; //为避免指针乱指,将头结点下一个指针赋空
int x;
printf("please input the data:\n");
scanf("%d",&x);
while(x!=-1) //数据为-1时停止继续输入
{
lnode *s=(linklist)malloc(sizeof(lnode));//s指向要插入的新结点,并为它开辟空间
s->data=x;
s->next=head->next; //将s结点的next指针 指向 头结点next指针 所指向的空间
head->next=s; //将头结点的next指针指向s结点,实现头插
printf("please input the data:\n");
scanf("%d",&x);
}
return head;
}
linklist create_end()
{
linklist head=(linklist)malloc(sizeof(lnode));//定义头结点并开辟空间
head->next=NULL; //为避免指针乱指,将头结点下一个指针赋空
lnode *p=head,*s; //定义指向结构体的p指针和s指针,使p指针指向头指针所指向的
int x;
printf("please input the data:\n");
scanf("%d",&x);
while(x!=-1) //数据为-1时停止继续输入
{
s=(linklist)malloc(sizeof(lnode));//s指向要插入的新结点,并为它开辟空间
s->data=x;
s->next=p->next; //新结点的next指针指向p结点next指针所指向的,且p结点的next始终为空
p->next=s; //p结点的next指向新结点
p=s; //p指向s所指向的,确保p指针指向的结点始终为最后一个结点
printf("please input the data:\n");
scanf("%d",&x);
}
return head;
}
//打印结点中的数据
void print(lnode *p)
{
p=p->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
//查找链表中的结点,按照结点在链表中的次序查找,x代表顺序,默认头结点的下一个为1
linklist findone(linklist p,int x)
{
p=p->next;//p从第一个结点开始查找
int j=1;//记录结点数
while(p)
{
if(j==x)
return p;
p=p->next;
j++; //指针每后移一次结点数+1
}
return NULL;//循环跳出代表p指针为空,即没有查找到次序为x的结点
}
//查找链表中的结点,按照结点中的数据查找,x代表具体数据
linklist findtwo(linklist p,int x)
{
p=p->next;
while(p)
{
if(p->data==x)
return p; //找到则返回该结点
p=p->next;
}
return NULL;//遍历结束则返回空
}
//向链表中插入数据,i代表插入的位置,x代表插入的具体数据
int insert(linklist head,int i,int x)
{
lnode *p,*s;
p=findone(head,i-1);//要向指定位置插入新结点,必须找到指定位置的直接前驱结点,所以用p指向要插入位置的直接前驱结点
if(p==NULL)
{
return false;//找不到直接前驱结点,插入失败
}
else
{
s=(linklist)malloc(sizeof(lnode));
s->data=x;
s->next=p->next;//要插入的结点s的next指针指向直接前驱结点的next指针所指向的结点,即指向当前要插入位置所在的结点
p->next=s; //直接前驱结点的next指针指向新结点
return true;//插入成功
}
}
//删除链表中的指定位置结点,head为头指针,i为要删除结点在链表中的次序
int del(linklist head,int i)
{
lnode *p,*s;
p=findone(head,i-1); //p指向要删除结点的前一个结点是否存在
//判断要删除结点的前一个结点是否存在
if(p==NULL)
{
return false;
}
else
{
//判断要删除结点(p->next)是否存在
if(p->next==NULL)
{
return false;
}
else
{
s=p->next; //s指向要删除的结点
p->next=s->next;//p的next指向s的next指向的结点
free(s); //释放s结点的空间
return true;
}
}
}
//链表的倒置,思路:依次取原链表的每个结点,用头插法插入到新的链表中
void reserve(linklist head)
{
lnode *p,*s;
p=head->next;
head->next=NULL;//创建一个新链表
//p指向当前结点,判断p是否为空
while(p)
{
//s表示要插入的结点,p用来标记下一个要插入的结点,防止丢失
s=p;
p=p->next;
//用头插法依次插入
s->next=head->next;
head->next=s;
}
}
//删除链表中重复的结点,思路:利用两个循环,p指向第一个结点,从它直接后继结点开始查找和它相同的结点,找到则删除,然后p依次向下指,直到最后结点
void del_same(linklist head)
{
lnode *p,*s,*r;
p=head->next;
if(p!=NULL)
while(p->next)//判断p的下一个结点是否存在
{
s=p;
while(s->next)//从p的后继结点开始循环查找,此处和删除结点类似,必须要知道要删结点的直接前驱,如果找到相同的结点,s为直接前驱
{
if(s->next->data==p->data)
{
r=s->next;
s->next=r->next;
free(r);
}
else
{
s=s->next;//依次向后遍历
}
}
if(p->next!=NULL)//如果p的下一个结点不为空,p指向下一个结点,否则的话,p指向空,循环条件(p->next)会出错
p=p->next;
}
}

单链表的使用(插入,查找,删除,链表的倒置,删除相同结点)

时间: 2024-11-05 16:36:46

单链表的使用(插入,查找,删除,链表的倒置,删除相同结点)的相关文章

单链表的初始化,整表创建,单个元素插入,单个元素删除,整表删除等操作

很早之前学的数据结构,放了很久后,以致对里面的一些操作都有些遗忘,故而再次温习了一下数据结构,并整理了一点儿笔记,放在这里和大家分享, 我的代码注释的已经很详细了,对于容易出错的地方我也都有标注,欢迎大家交流. #include "stdafx.h" #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <time.h> #define OK 1 #defi

头插法尾插法按位置插入创建删除链表

/* * 时间:2015年7月28日07:54:10 * 项目:单链表(头插法和尾插法) */ # include <stdio.h> typedef int ElemType; typedef struct Node{ Node *next; ElemType data; }LinkList; /*头插法,拥有头指针*/ void InitLinkListHead(LinkList *headList) { headList->next = NULL; headList->dat

数据结构-编程实现一个单链表节点的插入

1:向链表中某个位置(第pos个节点)之后插入节点,这里分别插入到链表首部.插入到链表中间,以及链表尾端3个位置.代码如下: // ConsoleApplication15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <malloc.h> #include <iostream> using namespace std; typedef struct node//定义链表结构体 { int data;/

链表(创建,插入,删除和打印输出(转载)

链表(创建,插入,删除和打印输出 /*----------------------------------------------------------------------------- 文件功能:实现了动态建立一个学生信息的链表包括链表的创建.插入.删除.和打印输出学生信息包括姓名和分数本链表是带有头结点的,头结点的内容为空内容-----------------------------------------------------------------------------*//*

链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述

关于数据结构等的学习,以及学习算法的感想感悟,听了郝斌老师的数据结构课程,其中他也提到了学习数据结构的或者算法的一些个人见解,我觉的很好,对我的帮助也是很大,算法本就是令人头疼的问题,因为自己并没有学习过算法的系统性的课程,现在还是处于不断摸索的阶段,好多算法题目根本就没有什么思路,导致自己对好多题目都很是头疼,就算是自己做过的一些算法的题目,再次遇到也还是不一定会做出来,他给出的建议就是,看懂别人的程序,然后自己去敲,一定会出错,然后调试,有错误接着调试,一直到没有错误为止,并且要时常的去复习

链表学习一:单链表创建-头插入与尾插入

链表的创建过程是一个动态的生成过程,创建链表有两种思路,一种是从表头插入,另一种是从表尾插入. 表头插入思路:从一个空表开始,重复读入数据,生成新结点,将读入数据存放在新结点的数据域中,然后将新结点插入到当前链表的表头上,直到读入结束标志为止. 表尾插入思路:从一个空表开始,重复读入数据,生成新结点,将读入数据存放在新结点的数据域中,然后将新结点插入到当前链表的表尾上,直到读入结束标志为止. 两种方法C++实现如下: 1 #include<iostream> 2 using namespace

链表《4》删除链表中的结点

下图是一个创建好的链表 下面我们需要删除一个结点,例如删除第3个结点 首先定义一个指针p,并且将p指向第二个结点 然后定义一个指针q,将q指向需要删除的结点 将p指向的结点和q指向的结点相连 p->pNext = q->pNext 清空q指向的结点 free(q); q = NULL; 删除后的链表 程序代码: #include <stdio.h> #include <stdlib.h> typedef struct Node//结点结构 { int data;//数据

剑指Offer之在O(1)时间删除链表节点

题目描述 给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 解题思路 在单向链表中删除一个节点,最常规的做法无疑是从链表的头结点开始,顺序的遍历查找要删除的节点,并在链表中删除该节点.这种思路由于需要顺序查找,时间复杂度自然就是$O(n)$了. 之所以需要从头开始查找,是因为我们需要得到将删除的节点的前面一个节点.在单向链表中,节点中没有指向前一个节点的指针,所以只好从链表的头结点开始顺序查找.那是不是一定需要得到被删除的节点的前一个节点呢?答案是否定的.我们可以很方便

C语言实现链表节点的插入

对链表进行增删改查是最基本的操作.我在上一篇博客<C语言实现链表节点的删除>实现了删除链表中的某个节点.这里我们要来实现在某个位置插入节点.示例代码上传至https://github.com/chenyufeng1991/InsertList  . 核心代码如下: Node *InsertToPosition(Node *pNode,int pos,int x){ if (pos < 0 || pos > sizeList(pNode) ) { printf("%s函数执

[LeetCode]79. Delete Node in a Linked List删除链表节点

Write a function to delete a node (except the tail) in a singly linked list, given only access to that node. Supposed the linked list is 1 -> 2 -> 3 -> 4 and you are given the third node with value 3, the linked list should become 1 -> 2 ->