顺序表与单链表基本运算算法

顺序表的基本运算实现

假设表中数据元素的值为整数;

#define MAX 100 //定义表最大长度容量, 实际用不到那么多

//顺序表结构定义

typedef struct

{

int data[MAX]; //存放表结点

int length; //当前表长度

} SeqList;

//创建初始顺序表

SeqList *createList(int size)

{

int i;

SeqList *list;

list=(SeqList *)malloc(sizeof(SeqList)); //分配空间

printf("请输入顺序表中的整数, 元素个数为%d\n",size);

for(i=0;i

scanf("%d",&list->data[i]) ; //逐一向顺序表中输入元素

list->length=size; //顺序表的长度赋值

return list;

}

//打印顺序表中的现有元素

printList(SeqList *list)

{

int i;

printf("\n目前顺序表中有%d个元素\n", list->length);

printf("这些元素分别是:\n");

for(i=0;ilength;i++)

printf("%d ",list->data[i]); //依次打印输出顺序表中的元素

printf("\n");

}

//在顺序表中查找值为e 的元素, 并返回它在表中的位置

Int locate(SeqList *list, int e)

{

int i=0;

while(ilength && list->data[i]!=e)

i++ ; //依次比较顺序表中各个元素

if(ilength) return i+1; //找到元素的处理

else printf("找不到元素!\n",); //未找到元素的处理

}

//在表中第i 个元素之前插入新元素e

insert(SeqList *list, int i , int e)

{

int j;

if (ilist->length+1 ) //检查插入位置的合法性

printf("插入位置非法!不能插入\n!");

else if (list->length==MAX)

printf("表满,不能插入!\n"); //检查表空满情况

else {for(j=list->length-1;j>=i-1;j--)

list->data[j+1]=list->data[j];

//从第n 个元素开始到第i 个元素依次向后移动一个位置

list->data[i-1]=e; //新元素e 插入i 位置

list->length++; //表长加1

}

}

//删除表中第i 个元素

delete(SeqList *list, int i)

{

int j;

if (ilist->length ) printf("删除位置非法!不能删除!\n");

//检查删除位置的合法性

else if (list->length==0) printf("表空,不能删除!\n");

//检查表空满情况

else

{for(j=i;jlength;j++)

list->data[j-1]=list->data[j];

//从第i 个元素开始到第n 个元素依次向前移动一个位置

list->length--; //表长减1

}

}

单链表的基本运算实现

以下算法都是带头结点的算法;

假设表中数据元素的值为整数;

//链表结点结构定义

typedef struct node

{

int data; //存放表结点值

struct node *next; //存放表结点的直接后驱元素的地址

} ListNode,*LinkList;

//头插法创建初始链表

LinkList create_h(int size)

{

LinkList head,p;

int i;

head=(LinkList)malloc(sizeof(ListNode));//申请头结点的存储空间

head->next=Null;//头结点的next 域为Null

printf("请输入这%d个元素的值:\n",size);

for(i=0;i

{

p=(LinkList)malloc(sizeof(ListNode));

scanf("%d",&p->data);

p->next=head->next;

head->next=p;

}

return head;

}

//尾插法创建初始链表

LinkList create_t(int size)

{

LinkList head,p,r;

int i;

head=(LinkList)malloc(sizeof(ListNode)); //申请头结点的存储空间

head->next=Null; //头结点的next 域为Null

r=head;//尾指针指向头结点

printf("请输入这%d个元素的值:\n",size);

for(i=0;i

{

p=(LinkList)malloc(sizeof(ListNode));

scanf("%d",&p->data);

p->next=Null;

r->next=p;

r=p;//尾指针指向新增结点

} return head; }

//求链表的长度

int length(LinkList head)

{

LinkList p;

int i;

p=head->next;//工作指针指向表中第一个结点

i=0;//计数器置0

while(p!=Null)

{

i++;//计数器计数

p=p->next;//工作指针后移到下一个结点

}

return i;

}

//打印链表中的现有元素

printList(LinkList head)

{

LinkList p;

p=head->next;//工作指针指向表中第一个结点

while(p!=Null)

{

printf("%d ",p->data);//打印当前指针所指结点的值

p=p->next;//工作指针后移到下一个结点

}

}

//按位查找元素

DataType get(LinkList head ,int i)

{

LinkList p;

int j;

p=head->next; //工作指针指向表中第一个结点

j=1; //计数器置1

while(p!=Null && j

{

p=p->next;

j++;

}

if(p!=Null && j==i) return p->data;//查找成功,p 指向第i 个结点, 返回第i 个结点值 else return Null;//i值非法, 查找失败

}

//按值查找元素

LinkList locate(LinkList head,int x)

{

LinkList p;

p=head->next;

while(p!=Null && p->data!=x)

p=p->next;

if (p!=Null && p->data==x)

{printf("找到该元素! ”);return p;}

else

{printf("找不到该元素!\n");return Null;}

}

//在链表中第i 个元素前插入新元素

insert(LinkList head,int i,int x)

{

LinkList p,s;

int j;

p=head;//工作指针指向头结点, 方便在第1个结点之前插入新元素 j=0;//计数器置0

while(p!=Null && j

p=p->next;

j++;

}

if (p!=Null && j==i-1)//定位成功

{

s=(LinkList)malloc(sizeof(ListNode));//申请新结点存储空间 s->data=x;

s->next=p->next;//新结点插入

p->next=s;//新结点插入

}

Else//插入位置非法

printf("插入位置非法!\n");

}

//在链表中删除第i 个结点元素

delete(LinkList head,int i)

{

LinkList p,q;

int j;

p=head; //工作指针指向头结点

j=0; //计数器置0

while(p->next!=Null && j

//将p 指针定位到第i 个结点的直接前驱接点上;

} { p=p->next; j++; } if(p->next!=Null && j==i-1) { q=p->next;//q指向要被删除的结点 p->next=q->next;//删除结点 free(q);//释放已被删除结点的存储空间 } else printf("空表或删除位置不合法!\n");

顺序表的基本运算实现

假设表中数据元素的值为整数;

#define MAX 100 //定义表最大长度容量, 实际用不到那么多

//顺序表结构定义

typedef struct

{

int data[MAX]; //存放表结点

int length; //当前表长度

} SeqList;

//创建初始顺序表

SeqList *createList(int size)

{

int i;

SeqList *list;

list=(SeqList *)malloc(sizeof(SeqList)); //分配空间

printf("请输入顺序表中的整数, 元素个数为%d\n",size);

for(i=0;i

scanf("%d",&list->data[i]) ; //逐一向顺序表中输入元素

list->length=size; //顺序表的长度赋值

return list;

}

//打印顺序表中的现有元素

printList(SeqList *list)

{

int i;

printf("\n目前顺序表中有%d个元素\n", list->length);

printf("这些元素分别是:\n");

for(i=0;ilength;i++)

printf("%d ",list->data[i]); //依次打印输出顺序表中的元素

printf("\n");

}

//在顺序表中查找值为e 的元素, 并返回它在表中的位置

Int locate(SeqList *list, int e)

{

int i=0;

while(ilength && list->data[i]!=e)

i++ ; //依次比较顺序表中各个元素

if(ilength) return i+1; //找到元素的处理

else printf("找不到元素!\n",); //未找到元素的处理

}

//在表中第i 个元素之前插入新元素e

insert(SeqList *list, int i , int e)

{

int j;

if (ilist->length+1 ) //检查插入位置的合法性

printf("插入位置非法!不能插入\n!");

else if (list->length==MAX)

printf("表满,不能插入!\n"); //检查表空满情况

else {for(j=list->length-1;j>=i-1;j--)

list->data[j+1]=list->data[j];

//从第n 个元素开始到第i 个元素依次向后移动一个位置

list->data[i-1]=e; //新元素e 插入i 位置

list->length++; //表长加1

}

}

//删除表中第i 个元素

delete(SeqList *list, int i)

{

int j;

if (ilist->length ) printf("删除位置非法!不能删除!\n");

//检查删除位置的合法性

else if (list->length==0) printf("表空,不能删除!\n");

//检查表空满情况

else

{for(j=i;jlength;j++)

list->data[j-1]=list->data[j];

//从第i 个元素开始到第n 个元素依次向前移动一个位置

list->length--; //表长减1

}

}

单链表的基本运算实现

以下算法都是带头结点的算法;

假设表中数据元素的值为整数;

//链表结点结构定义

typedef struct node

{

int data; //存放表结点值

struct node *next; //存放表结点的直接后驱元素的地址

} ListNode,*LinkList;

//头插法创建初始链表

LinkList create_h(int size)

{

LinkList head,p;

int i;

head=(LinkList)malloc(sizeof(ListNode));//申请头结点的存储空间

head->next=Null;//头结点的next 域为Null

printf("请输入这%d个元素的值:\n",size);

for(i=0;i

{

p=(LinkList)malloc(sizeof(ListNode));

scanf("%d",&p->data);

p->next=head->next;

head->next=p;

}

return head;

}

//尾插法创建初始链表

LinkList create_t(int size)

{

LinkList head,p,r;

int i;

head=(LinkList)malloc(sizeof(ListNode)); //申请头结点的存储空间

head->next=Null; //头结点的next 域为Null

r=head;//尾指针指向头结点

printf("请输入这%d个元素的值:\n",size);

for(i=0;i

{

p=(LinkList)malloc(sizeof(ListNode));

scanf("%d",&p->data);

p->next=Null;

r->next=p;

r=p;//尾指针指向新增结点

} return head; }

//求链表的长度

int length(LinkList head)

{

LinkList p;

int i;

p=head->next;//工作指针指向表中第一个结点

i=0;//计数器置0

while(p!=Null)

{

i++;//计数器计数

p=p->next;//工作指针后移到下一个结点

}

return i;

}

//打印链表中的现有元素

printList(LinkList head)

{

LinkList p;

p=head->next;//工作指针指向表中第一个结点

while(p!=Null)

{

printf("%d ",p->data);//打印当前指针所指结点的值

p=p->next;//工作指针后移到下一个结点

}

}

//按位查找元素

DataType get(LinkList head ,int i)

{

LinkList p;

int j;

p=head->next; //工作指针指向表中第一个结点

j=1; //计数器置1

while(p!=Null && j

{

p=p->next;

j++;

}

if(p!=Null && j==i) return p->data;//查找成功,p 指向第i 个结点, 返回第i 个结点值 else return Null;//i值非法, 查找失败

}

//按值查找元素

LinkList locate(LinkList head,int x)

{

LinkList p;

p=head->next;

while(p!=Null && p->data!=x)

p=p->next;

if (p!=Null && p->data==x)

{printf("找到该元素! ”);return p;}

else

{printf("找不到该元素!\n");return Null;}

}

//在链表中第i 个元素前插入新元素

insert(LinkList head,int i,int x)

{

LinkList p,s;

int j;

p=head;//工作指针指向头结点, 方便在第1个结点之前插入新元素 j=0;//计数器置0

while(p!=Null && j

p=p->next;

j++;

}

if (p!=Null && j==i-1)//定位成功

{

s=(LinkList)malloc(sizeof(ListNode));//申请新结点存储空间 s->data=x;

s->next=p->next;//新结点插入

p->next=s;//新结点插入

}

Else//插入位置非法

printf("插入位置非法!\n");

}

//在链表中删除第i 个结点元素

delete(LinkList head,int i)

{

LinkList p,q;

int j;

p=head; //工作指针指向头结点

j=0; //计数器置0

while(p->next!=Null && j

//将p 指针定位到第i 个结点的直接前驱接点上;

} { p=p->next; j++; } if(p->next!=Null && j==i-1) { q=p->next;//q指向要被删除的结点 p->next=q->next;//删除结点 free(q);//释放已被删除结点的存储空间 } else printf("空表或删除位置不合法!\n");


相关内容

  • 数据结构与算法面试总结
  • 一. 算法的基本概念 计算机解题的过程实际上是在实施某种算法,这种算法称为计算机算法. 1. 算法的基本特征:可行性,确定性,有穷性,拥有足够的情报. 2. 算法的基本要素:算法中对数据的运算和操作.算法的控制结构. 3. 算法设计的基本方法:列举法.归纳法.递推.递归.减半递推技术.回溯法. 4. ...

  • 单链表.双链表.循环链表和静态链表的习题
  • 单链表.双链表.循环链表和静态链表的习题 一.单项选择题 1. 关于线性表的顺序存储结构和链式存储结构的描述中,正确的是( ). Ⅰ. 线性表的顺序存储结构优于其链式存储结构 Ⅱ. 链式存储结构比顺序存储结构能更方便地表示各种逻辑结构 Ⅲ. 如频繁使用插入和删除结点操作,顺序存储结构更优于链式存储结 ...

  • 线性表习题
  • 线性表习题 一 判断题 1.线性表的逻辑顺序与存储顺序总是一致的.× 2.顺序存储的线性表可以按序号随机存取. 3.顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动. × 4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此是属于同 ...

  • 数据结构-任意长整数加法
  • <数据结构与算法> 课程设计报告 题目: 任意长整数加法 学期: 2017春 班号: 学号:姓名: 代号 成绩: 哈尔滨华德学院电子与信息工程学院 年 月 日 一. 课程设计的目的与要求 (一) 课程设计目的 1.通过课程设计,加深对<数据结构>课程所学知识的理解,熟练掌握和 ...

  • [数据结构]教学大纲
  • <数据结构>教学大纲 Data Structure 课程编号:J6110G0003 课程性质:学科基础课程 适用专业:计算机科学与技术.网络工程.数字媒体技术 先行课:计算机科学导论.离散数学.高级语言程序设计: 后续课:无 . 学分数:5 主讲教师:任燕.王命延.冯豫华.周石林.王玮立 ...

  • 2011年澳门特别行政区C++答案 数据结构试卷及答案考试重点和考试技巧
  • 1.深度为k的完全二叉树所含叶结点的个数最多为( B). A)2k B) 2k-1 C)k D) 2k 2.在数据结构中,与所使用的计算机无关的是数据的 A 结构. A.逻辑 B.存储 C.逻辑和存储 D.物理 3.广义表A=(x,((y),((a)),A))的深度是 A.2 B.3 C.4 D.∞ ...

  • 数据结构实验报告一
  • 数据结构 实验报告 实验题目: 班 级: 学 号: 姓 名: 完成日期: 一.需求分析 1. 问题描述(Problem Description): 给定两个不超过10000位的非负整数A 和B, 计算出A+B的值.要求计算并输出A+B的值. 2. 根据实验任务的要求分析: 大整数要利用两个顺序表存储 ...

  • 数据结构笔试面试的总结
  • 堆和栈的区别: 一.堆栈空间分配区别: 1.栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈: 2.堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS 回收,分配方式倒是类似于链表. 二.堆栈缓存方式区别: 1.栈 ...

  • 数据结构填空总题目
  • 1. 一个算法应该具有以下几个五个特征:(有穷性)(确定性)(输入)(输出)(可行性) 2. 算法的复杂度有(时间)和(空间)之分 3. 数据结构指的是数据之间的相互关系,,既数据的组织形式,一般包括三个方面的内容(逻辑结构)(存储结构)(数据的运算) 4. (数据元素)是数据的基本单位 5. (算 ...