资讯专栏INFORMATION COLUMN

数据结构—线性表

roundstones / 2696人阅读

摘要:线性表的操作一单链表的操作用随机函数生成个位整数,把这些整数存于单链表中输出单链表的内容读入一个整数,查看该整数是否在表中,若在,输出其位置首位置为读入一个整数,以及要插入的位置,把该整数插入到单链表中,输出单链表的内

线性表的操作

(一)单链表的操作

(1)用随机函数生成8个3位整数(100~999),把这些整数存于单链表中;

(2)输出单链表的内容;

(3)读入一个整数,查看该整数是否在表中,若在,输出其位置(首位置为1);

(4)读入一个整数,以及要插入的位置,把该整数插入到单链表中,输出单链表的内容(要求判断输入的位置是否合理);

(5)读入一个整数,若该整数在单链表里,删除该整数,输出单链表的内容;

(6)把链单表的内容翻转,输出单链表的内容。

//链式存储的线性表/*李子木*/#include#include#include#include#includetypedef int ElementType; // ElementType 可定义为任意类型typedef struct LNode *List;struct LNode{	ElementType Data;   //数据域 	List Next;   // 下一个链表的地址 }; List L;List MakeEmpty(); //初始化链表 int Length(List L);  // 以遍历链表的方法求链表长度 List FindKth(int K,List L);  // 按序号查找 int Find(ElementType X,List L);  // 按值查找 List Insert(ElementType X,int i,List L);  //将 X 插入到第 i-1(i>0) 个结点之后 List Delete(ElementType X,List L); // 删除第 i(i>0) 个结点 void Print(List L); // 输出链表元素 List biu1(List L);	//内容反转(迭代)List biu2(List L);	//内容反转(递归)// 初始化链表 List MakeEmpty(){	List L = (List)malloc(sizeof(struct LNode));	List p = (List)malloc(sizeof(struct LNode));	L = p;	srand((unsigned)time(NULL));	for(int i = 0;i < 8;i++){		p->Data=rand()%900+100;		if(i<7){			p->Next=(List)malloc(sizeof(struct LNode));			p=p->Next;		}	}	p->Next=NULL;	return L;}//求表长 int Length(List L){	List p = L;	int len=0;	while(p){  // 当 p 不为空 		p = p->Next;		len++;	}	return len;} // 按序查找 List FindKth(int K,List L){	List p = L;	int i = 1;  //从 1 开始 	while(p && iNext;		i++;	}	if(i == K)    // 找到了 		return p;	else    // 未找到 		return NULL;} // 按值查找  int Find(ElementType X,List L){	List p = L;	int len=1;	while(p && p->Data!=X){		p=p->Next;		len++;	}	if(p==NULL)	return -1;	return len;   } /* 插入1. 用 s 指向一个新的结点2. 用 p 指向链表的第 i-1 个结点 3. s->Next = p->Next,将 s 的下一个结点指向 p 的下一个结点 4. p->Next = s,将 p 的下一结点改为 s   */List Insert(ElementType X,int i,List L){	List p,s;	if(i == 1){     // 新结点插入在表头 		s = (List)malloc(sizeof(struct LNode));		if(s==NULL){			printf("分配内存错误!");			return L;		}		s->Data = X;		s->Next = L;		return s;     //插入的结点为头结点 	}	p = FindKth(i-1,L);   // 找到第 i-1 个结点	if(!p){   // 第 i-1 个结点不存在 		printf("结点错误");		return NULL;	}else{		s = (List)malloc(sizeof(struct LNode));		if(s==NULL){			printf("分配内存错误!");			return L;		}		s->Data = X;		s->Next = p->Next;   //将 s 的下一个结点指向 p 的下一个结点 		p->Next = s;   // 将 p 的下一结点改为 s		return L;	}}/* 删除1. 用 p 指向链表的第 i-1 个结点 2. 用 s 指向要被删除的的第 i 个结点3. p->Next = s->Next,p 指针指向 s 后面4. free(s),释放空间 */List Delete(ElementType X,List L){	List p,s;	int k;	k=Find(X,L);	if(k==1){   //如果要删除头结点 		s = L;		if(L)   // 如果不为空 			L = L->Next;		else			return NULL;		free(s);   // 释放被删除结点 		return L; 	}	p = FindKth(k-1,L);    // 查找第 i-1 个结点	if(!p || !(p->Next)){     // 第 i-1 个或第 i 个结点不存在 		printf("结点错误");		return NULL;	}else{		s = p->Next;    // s 指向第 i 个结点 		p->Next = s->Next;  //从链表删除 		free(s);  // 释放被删除结点 		return L;	}}// 输出链表元素 void Print(List L){	List t;	int flag = 1;	printf("当前链表为:");	for(t = L;t;t =t->Next){		printf("%d  ",t->Data);		flag = 0;	}	if(flag)		printf("NULL");	printf("/n"); }//内容反转(迭代)List biu1(List L) {	List p,s;	p = (List)malloc(sizeof(struct LNode));	p = L;	if (L == NULL || L->Next == NULL) {		return L;	}	s = NULL;	while (p != NULL) {		List tmp = p->Next;   //暂存p后面一个元素		p->Next = s;    		s = p;			//p->Next指向前一个元素		p = tmp;   //p指向原始链表的下一个元素	}	return s;}//内容反转(递归)List biu2(List L) {	if (L == NULL || L->Next == NULL) {		return L;	}	List s = biu2(L->Next);	L->Next->Next = L;	L->Next = NULL;	return s;}int main() {	List L;	L = MakeEmpty();	int x, k;	Print(L);	printf("请输入一个整数:");	scanf("%d", &x);	if (Find(x, L) == -1) {		printf("查无此值!/n");	}	else {		printf("该值所在位置为:%d/n", Find(x, L));	}	printf("请输入需要插入的元素值以及插入位置:");	scanf("%d%d", &x, &k);	L = Insert(x, k, L);	Print(L);	printf("请输入需要删除的元素:");	scanf("%d", &x);	L = Delete(x, L);	Print(L);	system("pause");   //等待用户按任意键,然后返回, 等同于getchar()	L = biu1(L);	printf("执行链表反转.../n");	system("pause");	Print(L);	L = biu2(L);	printf("执行链表反转.../n");	system("pause");	Print(L); 	return 0;}


(二)顺序表的操作

(1)用随机函数生成8个3位整数(100~999),把这些整数存于顺序表中;

(2)输出顺序表的内容;

(3)读入一个整数,查看该整数是否在顺序表中,若在,输出其位置(首位置为1);

(4)读入一个整数,以及要插入的位置,把该整数插入到顺序表中,输出顺序表的内容(要求判断输入的位置是否合理);

(5)读入一个整数,若该整数在顺序表里,删除该整数,输出顺序表的内容;

(6)把顺序表的内容翻转,输出顺序表的内容。

//顺序存储的线性表/*李子木*/#include#include#include#include#include#define MAXSIZE 100  // MAXSIZE 定义为 Data 数组的大小typedef int ElementType;  // ElementType 可定义为任意类型typedef struct LNode *List; struct LNode{   ElementType Data[MAXSIZE];    int Last;  // Last 定义线性表的最后一个元素};List L;//访问下标为 i 的元素:L->Data[i]//线性表的长度:L->LastList MakeEmpty(); //初始化顺序表 int Find(ElementType X,List L); //查找 X 第一次出现的下标 void Insert(ElementType X,int i,List L); //在下标为 i 的地方插入 X void Delete(int i,List L);   //删除下标为 i 的当前值 ElementType FindS(int i,List L);  //返回下标为 i 的当前值int Length(List L);  //返回顺序表的长度     可以不用,但不能不会 void biu(List L);  //使线性表内内容反转   //初始化 List MakeEmpty(){    List L;    L = (List)malloc(sizeof(struct LNode));    L->Last = 0;    return L;}// 按值查找 int Find(ElementType X,List L){    int i=1;    while(i <= L->Last && L->Data[i] != X)          i++;    if(L->Last < i)  //如果没找到,返回 -1        return -1;     else    // 找到后返回下标         return i;}// 插入void Insert(ElementType X,int i,List L){    int j;    if(L->Last == MAXSIZE-1){  //位置已满         printf("表满");        return;    }    if(i < 0 || L->Last + 1 < i){  //位置越界        printf("位置不合法");        return;    }    for(j=L->Last;j>=i;j--)   // 从后往前依次向后挪一个          L->Data[j+1] = L->Data[j];       L->Data[i] = X;    //新元素插入    L->Last++;    // Last仍然指向最后元素    return;} //删除void Delete(ElementType x,List L){	if(L->Last==0){		printf("空表");		return;	}	int i,j;	for(i=1;i<=L->Last;i++){		if(L->Data[i]==x){			for(j=i;jLast;j++)  //被删除的元素后面的元素前移 			L->Data[j]=L->Data[j+1];  			L->Last--;  //Last指向最后元素 			return;		}	}	printf("未找到该值");}//按下标查找 ElementType FindS(int i,List L){	if(i < 0 || L->Last < i)  return;	return L->Data[i];}//表长 int Length(List L){	return L->Last; }//内容反转void biu(List L){	int i,t;	for(i=1;i<=((L->Last+1)/2);i++){		t=L->Data[i];		L->Data[i]=L->Data[L->Last-i+1];		L->Data[L->Last-i+1]=t;	}}int main(){	List L;	L=MakeEmpty();	int i,x;	srand((unsigned)time(NULL));   //设置种子,使得产生的随机数是可变化的 	for(i=1;i<=8;i++){  //插入三个随机100-999之间的整数		Insert(rand()%900+100,i,L);  	}  	printf("单链表中的内容为:");	for(i=1;i<=8;i++)  //输出链表中的的内容 	printf("%d ",L->Data[i]);	printf("/n");	printf("请输入一个整数:");	scanf("%d",&x);	if(Find(x,L)!=-1) 	printf("查找值为%d的下标为:%d/n",x,Find(x,L));	if(Find(x,L)==-1)	printf("未找到该值/n");	printf("请输入需要插入的整数:");	scanf("%d",&x);	Insert(x,L->Last+1,L);	printf("此时单链表中的内容为:");	for(i=1;i<=9;i++)	printf("%d ",L->Data[i]);	printf("/n");	printf("请输入需要删除的整数:");	scanf("%d",&x);	Delete(x,L);	printf("删除元素后单链表中的内容为:"); 	for(i=1;i<=L->Last;i++)	printf("%d ",L->Data[i]);	printf("/n");	biu(L);	printf("内容反转后链表中内容为:");	for(i=1;i<=L->Last;i++)	printf("%d ",L->Data[i]); 	return 0;}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121789.html

相关文章

  • 程序员“修炼成神”的必经之路——数据结构(第2章 线性

    摘要:线性表的基本运算置空表,构造一个空的线性表。三线性表的链式存储结构单链表线性链表链式存储结构除了存储本身的信息之外,还需要一个存储指示其后继元素存储位置的指针,由这两个部分组成元素的存储映像通常称为结点。用这种方法存储的线性表称为链表。 目录 前言 一、线性表的定义和基本运算 1.线...

    SolomonXie 评论0 收藏0
  • 数据结构线性(手绘版)

    摘要:就可以称之为线性表。这种可以根据位序得到数据元素也是一种很重要的线性表操作。瀏除线性表中第个位置元素并用返回其值。线性表的长度是线性表中数据元素的个数随着线性表插入和删除操作的进行这个量是变化的。 目录 一,写在前面 二,线性表的定义 三,线性表的抽象数据类型 四,线性表的顺序存储结构 4....

    Maxiye 评论0 收藏0
  • 数据结构》第二章 | 线性 知识梳理(应对期末考)

    摘要:案例引入一元多项式的运算了解每一项的指数与其在线性表中的对应关系。线性表的链式表示又称为非顺序映像或链式映像。问题三头结点的数据域内装的是什么答头结点的数据域可以为空,也可存放线性表长度等附加信息,但此结点不能计入链表长度值。 ...

    ChanceWong 评论0 收藏0
  • 算法学习之数据结构线性、堆、栈

    摘要:栈底是固定的,而栈顶浮动的如果栈中元素个数为零则被称为空栈。入栈将数据保存到栈顶。链栈链栈是指栈的链式存储结构,是没有附加头节点的运算受限的单链表,栈顶指针是链表的头指针。 一、喜欢单挑线性表 1.线性表的特性 线性表是一个线性结构,它是一个含有n≥0个节点的有限序列。在节点中,有且仅有一个开始节点没有前驱并有一个后继节点,有且仅有一个终端节点没有后继并有一个前驱节点。其他的节点都有且...

    huaixiaoz 评论0 收藏0
  • js数据结构和算法(一)概述

    摘要:程序设计数据结构算法数据结构数据结构就是关系,没错,就是数据元素相互之间存在的一种或多种特定关系的集合。物理结构是指数据的逻辑结构在计算机中的存储形式。 程序设计=数据结构+算法 数据结构 数据结构就是关系,没错,就是数据元素相互之间存在的一种或多种特定关系的集合。 传统上,我们把数据结构分为逻辑结构和物理结构。 逻辑结构:是指数据对象中数据元素之间的相互关系,也是我们今后最...

    xumenger 评论0 收藏0
  • 线性的链式存储结构 ( 链 )

    摘要:缺点存储密度小,查找和修改需要遍历整个链表。顺序存储时,相邻数据元素的存放地址也相邻逻辑与物理统一要求内存中可用存储单元的地址必须是连续的。缺点插入或删除元素时不方便存储空间利用率低,预先分配内存可能造成存储空间浪费。 ...

    Yuqi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<