顺序链表的插入删除等操作 C语言

原创 2016年08月31日 15:57:14
//顺序表的操作
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
//定义表的最大长度
#define MAXLEN 100
//定义结点的关键字
typedef struct  
{
char key[10];
char name[10];
int age;
}DATA;
//定义顺序表的结构
typedef struct  
{
DATA ListData[MAXLEN+1];
//表的长度
int Listlen;
}SLType;
//初始化顺序表
void SLInit(SLType *SL)
{
SL->Listlen=0;
//SL->ListData=0;
}
//求顺序表的长度
int SLLength(SLType *SL)
{
return (SL->Listlen);
}
//插入
int SLInsert(SLType *SL,int n,DATA data)
{
int i;
if(SL->Listlen>=MAXLEN)
{
printf("顺序表已满,不能插入结点!\n");
//返回
return 0;
}
if(n<1||n>SL->Listlen-1)
{
printf("插入元素错误,不能再插入元素!\n");
return 0;
}
for(i=SL->Listlen;i>=n;i++)
{
SL->ListData[i+1]=SL->ListData[i];
}
SL->ListData[n]=data;
//插入节点后长度增加1
SL->Listlen++;
return 1;
}
//增加元素到顺序表的尾部
int SLAdd(SLType *SL,DATA data)
{
if(SL->Listlen>=MAXLEN)
{
printf("线性表已经满了,不能再添加!\n");
return 0;
}
SL->ListData[++SL->Listlen]=data;
return 1;
}
//删除顺序表中某个数据元素
int SLDelete (SLType *SL,int n)
{
int i;
//删除失败
if(n<1||n>SL->Listlen+1)
{
printf("删除错误结点,不能删除!\n");
return 0;
}
//删除后顺序表中的数据前移
for(i=0;i<SL->Listlen;i++)
{
SL->ListData[i]=SL->ListData[i++];
}
SL->Listlen--;//元素个数减少1
return 1;


}
//根据序号返回数据元素
DATA *SLFindByNum(SLType *SL,int n)
{
if(n<1||n>SL->Listlen+1)
{
printf("结点序号错误\n");
return NULL;
}
//返回要查找的数据
return &(SL->ListData[n]);
}
//按照关键字查找数据
int SLFindByCont(SLType *SL,char *key)
{
int i;
for(i=1;i<=SL->Listlen;i++)
{
//如果找到所需的结点 就返回
if(strcmp(SL->ListData[i].key,key)==0)
{
//返回结点序号
return i;
}
//否则就没找到  ?
return 0;
}
//return 0;
}
//显示顺序表中的所有结点
int SLAll(SLType *SL)
{


int i;
for (i=1;i<=SL->Listlen;i++)
{
printf("(%s,%s,%d)\n",SL->ListData[i].key,SL->ListData[i].name,SL->ListData[i].age);
}
return 0;
}
int main()
{
int i;
//定义顺序链表
SLType SL;
//结点保存数据
DATA data;
//结点保存指针
DATA *pdata;
//关键字
char key[10];
printf("顺序表操作演示:\n");
//初始化顺序表
SLInit(&SL);
printf("初始化顺序表完成!\n");
//循环添加结点
do 
{
printf("输入添加的结点(学号,姓名,年龄):");
//清空输入缓冲区
fflush(stdin);
scanf("%s%s%d",&data.key,&data.name,&data.age);
//跳出死循环
if(data.age)
{
//添加结点失败
if(!SLAdd(&SL,data))
{
break;
}
}
//跳出死循环
else
{
break;
}
} while (1);
printf("\n顺序表中的结点顺序为:\n");
//显示所有的数据
SLAll(&SL);
//清空缓冲区
fflush(stdin);
printf("\n要取出的结点的序号:");
//输入结点序号
scanf("%d",&i);
//按照序号查找结点
pdata=SLFindByNum(&SL,i);
//若返回的结点非空
if(pdata)
{
printf("第%d个结点为:(%d,%s,%d)\n",i,pdata->key,pdata->name,pdata->age);
}
//清空输入缓冲区
fflush(stdin);
printf("要查找的结点的关键字:\n");
scanf("%s",key);
i=SLFindByCont(&SL,key);
//按序号查找,返回结点指针
pdata=SLFindByNum(&SL,i);
if(pdata)
{
printf("第%d个结点为:(%s,%s%d)\n",pdata->key,pdata->name,pdata->age);
getchar();
return 0;
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

C语言实现链表的插入、删除、查询操作

前言本程序是数据结构上机实验内容,参考《数据结构(C语言版)》(清华大学出版社)中链表部分的伪代码实现。题目要求 设计链表结构体 建立一个链表,并录入n个原始数据 实现向链表中指定位置插入数据的功能 ...

C语言---双向链表的插入、删除、查找操作

/* *程序功能:对双向链表操作,主要包括:插入结点、删除结点、查找结点等基本操作 *需要注意的是,链表中附加了一个结点root_p *root_p是链表的根节点,root_p中的data字段存...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

C语言---双向链表的插入、删除、查找操作

/* *程序功能:对双向链表操作,主要包括:插入结点、删除结点、查找结点等基本操作 *需要注意的是,链表中附加了一个结点root_p *root_p是链表的根节点,root_p中的data字段存...

C语言实现链表插入,删除相关操作

#include #include #define SIZE 15 #define LEN sizeof(struct Node)struct Node { int data; st...

顺序表的创建、遍历、插入、删除等操作demo

如下代码为顺序表的创建、遍历、插入、删除等操作demo,并且在VC++6.0上验证通过#include #include #include #define OK 1 #define ERROR 0...

链表的基本操作(插入,删除,排序、逆置等)

链表是数据结构中最基本的,也是非常经典的,在面试笔试中也是经常出现的题,但是万变不离其宗,只要掌握了基本的操作,一起尽在掌控。 特别要注意的一点是处理时千万要把是否为头进行判断,做为一个特例,或者...

链表删除,反序操作等

//头文件 提供接口 #ifndef _LIST_H #define _LIST_H struct listnode { int Item; struct listnode *next; }; typ...

链表插入删除操作

#include using namespace std; // 定义单向链表节点 struct ListNode { int data; ListNode* next; }; // end o...

C语言实现线性表的插入和删除操作

设计程序建立一个顺序表,要求从键盘输入整数,并完成添加插入和删除元素功能,并将该顺序表的元素从屏幕显示出来。 使用malloc和realloc函数动态分配内存地址。

链表操作 (C语言)插入,合并,销毁,删除,冒泡排序

#include #include #include typedef struct Node{     int data;     struct Node *next; }node...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)