基于单链表的操作

单链表



功能设计

1从首元结点开始输出数据域即p->data直到p->next=NULL。typedef struct Node

定义一个链式存储的单链表Node *为结构体指针类型例如对于单链表Lp=L—〉next通过p->data 访问该元素的数据值。

2creatlist(linklist *H)

从空表开始每次读入数据生成新结点将读入的数据存放到新结点的数据域中然后将新结点插入到当前链表的表头结点之后直至读入结束位置为止。

3Leng(linklist *H )

在单链表中整个链表由“头指针”来表示单链表的长度在从头到尾遍历的过程中统计计数。

4GetElem(linklist *H,int i)

要查找单链表的第i个结点则需要从单链表的头指针出发顺着链域扫描用指针p指向当前扫描到的结点处治指向头结点用k作计数器j==i时指针p指向的结点就是要查找的第i个结点。

5Insert(linklist *H,int i,int x)

查找在单链表中找到第i-1个结点并有指针pre 指示。

申请申请新结点s将其数据域的值置为e。

插入元素通过修改指针域将新元素插入链表。

6Delete(linklist *H,int x)

通过计数方式第i-1个结点并由pre指针指示。

删除第i个结点并释放结点空间。

7print(linklist *H)

链表操作示意图

1单链表

2头插法构造单链表

3尾插法构造单链表

3单链表结点的删除

代码

#include<stdio.h>

#include<stdlib.h>

typedef struct node

{

int data;

struct node *next;

}linklist;

void setnull(linklist *H)

{

H->next=NULL;

}

void creatlist(linklist *H)

{

linklist *p,*s;

int x;

p=H;

printf("please input x:");

scanf("%d",&x);

while(x!=-1)

{

s=(linklist *)malloc(sizeof(linklist));

s->data=x;

s->next=p->next;

p->next=s;

p=p->next;

printf("please input x:");

scanf("%d",&x);

}

p->next=NULL;

}

void Leng(linklist *H )

{

linklist *p;

int k;

p=H;

k=0;

while(p->next!=NULL)

{

p=p->next;

k++;

}

printf("The linklist is:%d\n",k);

}

int GetElem(linklist *H,int i)

{

linklist *p;

int k;

p=H;

k=0;

while(p->next!=NULL&&k<i)

{

p=p->next;

k++;

}

if(k==i&&p!=NULL)

printf("i position data is %d\n",p->data);

else

printf("No find!\n");

return 0;

}

void Insert(linklist *H,int i,int x)

{

linklist *p;

int k;

linklist *s;

p=H;

k=0;

while(p->next!=NULL&&k<i-1)

{

p=p->next;

k++;

}

if(k==i-1&&p->next!=NULL)

{

s=(linklist *)malloc(sizeof(linklist));

s->data=x;

s->next=p->next;

p->next=s;

}

else

printf("插入错误");

}

void Delete(linklist *H,int x)

{

linklist *p,*q;

int k;

p=H;

k=0;

while(p->next!=NULL&&p->next->data!=x)

{

p=p->next;

k++;

}

if(p->next->data==x)

{

q=p->next;

p->next=q->next;

free(q);

}

else printf("no find!\n");

}

void print(linklist *H)

{

linklist *p;int k;

p=H;

k=0;

if(p->next==NULL)

printf("链表为空!");

while(p->next!=NULL)

{

k++;

p=p->next;

printf("%3d",p->data);

}

}

int Locate(linklist *H,int x)

{

linklist *p;int k;

p=H;

k=0;

while(p->next!=NULL&&p->data!=x)

{

p=p->next;

k++;

}

if(p->data==x)

printf("要查询元素的位置%d\n",k);

else

printf("没有找到!\n");

return 0;

}

int  main()

{

linklist *H;

int k,x,i;

int f;

H=(linklist *)malloc(sizeof(linklist));

setnull(H);

printf("\n请选择以下操作数,选择-1为结束");

printf("\n1:createlinklist(H)");

printf("\n2:leng(H)");

printf("\n3:GetElem(H,i)");

printf("\n4:Insert(H,i,x)");

printf("\n5:Delete(H,x)");

printf("\n6:print(H)");

printf("\n7:Located(H,x)\n");

scanf("%d",&f);

while(f!=-1)

{

switch(f)

{

case 1:

creatlist(H);

break;

case 2:

Leng(H);

break;

case 3:

printf("请输入要得到的元素");

scanf("%d",&i);

GetElem(H,i);

break;

case 4:

printf("\n请输入插入的位置长度以及元素");

scanf("%d,%d",&i,&x);

Insert(H,i,x);

break;

case 5:

printf("\n请输入要删除的位置元素");

scanf("%d",&x);

Delete(H,x);

break;

case 6:

print(H);

break;

case 7:

printf("请输入要查找的元素:");

scanf("%d",&x);

Locate(H,x);

break;

}

printf("\n请选择以下操作数,选择-1为结束");

printf("\n1:creatlinklist(H)");

printf("\n2:leng(H)");

printf("\n3:GetElem(H,i)");

printf("\n4:Insert(H,i,x)");

printf("\n5:Delete(H,x)");

printf("\n6:print(H)");

printf("\n7:Locate(H,x)\n");

scanf("%d",&f);

}

return 0;

}

时间: 2024-10-21 01:10:40

基于单链表的操作的相关文章

java数据结构:单链表常见操作代码实现

一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashMap等集合的底层结构都是链表结构.链表以结点作为存储单元,这些存储单元可以是不连续的.每个结点由两部分组成:存储的数值+前序结点和后序结点的指针.即有前序结点的指针又有后序结点的指针的链表称为双向链表,只包含后续指针的链表为单链表,本文总结的均为单链表的操作. 单链表结构: Java中单链表采用No

单链表的操作和指针函数基础

/* ============================================================================ Name : TestLinkedList.c Author : lf Version : Copyright : Your copyright notice Description : 1 单链表的增删改查等操作 2 指针函数的使用.如示例中的:void (*visit)(link) ==========================

线性单链表的操作

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define INFEASIBLE -1 #define OVERFLOW -2 /* #define ElemType int #define Status int */ typedef int ElemType; typedef int Status; /* #define LNo

数据结构之 线性表---单链表的操作B(先逆序+再删除重复元素)

数据结构上机测试2-2:单链表操作B Time Limit: 1000MS Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个). 输入 第一行输入元素个数n: 第二行输入n个整数. 输出 第一行输出初始链表元素个数: 第二行输出按照逆位序所建立的初始链表: 第三行输出删除重复元素后的单链表元素个数: 第四行输出删除重复元素后的单链表. 示例输入 10 21 30 14 55 32 63

单链表插入操作

URL:http://jpkc.onlinesjtu.com/CourseShare/Courses/ResourceModule/PreReading.aspx?courseid=701018&nodid=238&chapterid=238&preid=16 单链表的插入操作 1)已知线性链表head,在p指针所指向的结点后插入一个元素x. 在一个结点后插入数据元素时,操作较为简单,不用查找便可直接插入. 操作过程如下图所示: 相关的语句如下: { s=(slnodetype*)

合并两个有序单链表的操作

/*以合并两个2个长度均为n的递增单链表为例 演示连个单链表的合并操作*/ #include<iostream>#include<algorithm>#include<cstring>#include<vector>#include<stdio.h>#include<queue>#include<math.h>#define INF 0x3f3f3f3f#define MAX 1000005#define Temp 100

数据结构——单链表及其操作

1 #include<iostream> 2 #include<string> 3 #include<stdlib.h> 4 5 using namespace std; 6 7 typedef int ElemType; 8 typedef int Status; 9 #define OK 1 10 #define ERROR 0 11 12 13 //单链表的存储结构 14 typedef struct LNode 15 { 16 ElemType data; //

【复习数据结构】单链表的操作

#include <stdio.h> #include <malloc.h> typedef char ElemType; typedef struct LNode{ //定义单链表结点类型 ElemType data; //数据域 struct LNode *next; //指针域 }LNode,*LinkList; /** * 头插法初始化链表 **/ LinkList CreateListhead(void){ char ch; LinkList L; //初始化链表 LNo

java单链表常用操作

总结提高,与君共勉 概述. 数据结构与算法亘古不变的主题,链表也是面试常考的问题,特别是手写代码常常出现,将从以下方面做个小结 [链表个数] [反转链表-循环] [反转链表-递归] [查找链表倒数第K个节点] [查找链表中间节点] [判断链表是否有环] [从尾到头打印单链表-递归] [从尾到头打印单链表-栈] [由小到大合并有序单链表-循环] [由小到大合并有序单链表-递归] 通常在java中这样定义单链表结构 <span style="font-family:Microsoft YaHe