数据结构线性表代码(数据结构线性表代码及分析书籍管理)
数据结构如何建立1个线性表?
建立顺序表代码如下:
由数组元素a[0..n-1]创建顺序表L。将a中的每个元素依次放入顺序表中,并将n赋值给顺序表的长度域。算法为:
void CreateList(SqList * L, ElemType a[], int n){
? int i=0, k=0;
? L = (SqList *)malloc(sizeof(SqList));? ? //分配存储线性表的空间
? while(in){
? ? ? L-data[k] = a[i];
? ? ? k++; i++;
? }
? L-length = k;? ? ? ? //设置线性表的实际长度,设置为k(即a的长度n)
}
扩展资料
线性表的特点:
1、对于同一个线性表,其每一个数据元素的值虽然不同,但必须具有相同的数据类型;
2、数据元素之间具有一种线性的或“一对一”的逻辑关系。
3、第一个数据元素没有前驱,这个数据元素被称为开始节点;
4、最后一个数据元素没有后继,这个数据元素被称为终端节点;
5、除了第一个和最后一个数据元素外,其他数据元素有且仅有一个前驱和一个后继。
线性表的抽象数据类型描述
基本操作如下:
1、线性表的置空操作clear():将一个已经存在的线性表置为空表。
2、线性表判空操作isEmpty():判断线性表是否为空,若为空,则返回true;否则,返回为false。
3、求线性表的长度操作length():求线性表中的数据元素的个数并返回其值。
数据结构线性表的问题,一个插入操作的代码是否有错。
这句话没有错,骚年~是你错了。
if(i1 || iL-length+1)为什么这么判定,你一定很奇怪吧,哈哈。
你看清楚了,人家说的是插入时候的算法,对吧。
插入的位置是第i个位置之前,对吧!
看到这里你还不明白吗?
再看看—— 之前——懂了吗?
还不懂?好吧...:
你可以在第一个位置之前插入一个元素,此时 i=1。你当然知道此时为什么i不能小于1,因为1之前只有第零个元素的位置(C语言下标从零开始)。
同理,你在最后一个元素之后插入,是不是他的确切位置是Length+1之前?
第Length个元素的 存储位置 是 Length-1,对吧?
所以你这个插入的元素,它的存储位置应该是Length。
Length当然在Length+1之前!
所以插入位置当然是Length+1。大于这个值的话,就是程序断言错误了,因此返回error。
再想想!
这次明白了吧!
话说严蔚敏版的数据结构确实不太好理解,很多注释都不是太详尽。经常会有这样的情况。
线性表的创建,删除插入等操作
线性表的操作类似于数组,都是连续存储,所以相关的操作也是类似。
插入:在第t个位置插入元素,需要将从第t个位置到第n个位置向后移动。
删除:删除第t个元素,从t+1位置元素往前移动
插入和删除都需要将元素移动,顺序存储结构线性表所需要的平均时间复杂度为O(n)。
下面是根据数据结构实现的代码;
#include
#include
#define TRUE 1;
#define FALSE 0;
#define OK 1;
#define ERROR 0;
#define OVERFLOW -2;
typedef int Status;
typedef int ElemType;
typedef struct {
ElemType *elem;//线性表的基地址
int Length;//长度
int Listsize;//当前分配的存储容量
}SqList;
Status InitList(SqList L)//初始化线性表
{
L.elem = (ElemType*)malloc(100 * sizeof(ElemType));//分配内存
if (!L.elem) exit(-2);
L.Length = 0;
L.Listsize = 100;
return OK;
}
Status ListInsert(SqList L,int i,ElemType e)//在顺序表第i个位置之前插入新的元素e
{
if (i 1 || iL.Length + 1) return ERROR;//i值不合法
if (L.Length = L.Listsize)//存储空间已满
{
ElemType *newbase = (ElemType*)realloc(L.elem, (L.Listsize + 10) * sizeof(ElemType));
if (!newbase)
{
exit(-2);
}
L.elem = newbase;
L.Listsize += 10;
}
ElemType *q = (L.elem[i - 1]); //将L表中第i个元素的地址信息传递给指针q
for (ElemType *p = (L.elem[L.Length - 1]); p = q; --p)//p为末尾元素的地址
{
*(p + 1) = *p;
}
*q = e;
++L.Length;
return OK;
}
Status OutputList(SqList L)//输出线性表中的元素
{
int i = 0;
for (i ; i L.Length ; i++)
{
printf("%d ", L.elem[i]);
}
return OK;
}
Status ListLength(SqList L)//返回线性表的表长
{
return L.Length;
}
Status GetElem(SqList L, int i, ElemType e)//用e返回第i个元素的值
{
if (iL.Length) return ERROR;
e = L.elem[i-1];
return OK;
}
Status ClearList(SqList L)//清除线性表的数据
{
L.Length = 0;
return OK;
}
Status DeleteList(SqList L,int i,ElemType e)//删除第i个元素,并用e返回其值
{
if (iL.Length) return ERROR;
e = L.elem[i - 1];//通过下标找到第i个元素的值
ElemType *p = (L.elem[i - 1]);
ElemType *q = L.elem + L.Length - 1;
for (p; p
高分在线等~!数据结构:求把指定的链表转成顺序表(线性表)的C语言代码!!
//xieai999
#include stdio.h
typedef struct stduy
{
char r[1000];
int len;
}Sqlist;//顺序表
typedef struct edu
{
char e;
struct edu *next;
}LT;//链表
void CreatLT(LT **s,char a[])//初始化链表
{
LT *p,*q;
(*s)=(LT *)malloc(sizeof(LT));
(*s)-e=a[0];
(*s)-next=NULL;
q=(*s);
int i=1;
while(a[i]!='\\0')
{
p=(LT *)malloc(sizeof(LT));
p-e=a[i];
p-next=NULL;
q-next=p;
q=q-next;
i++;
}
}
void linkTOlist(LT *s,Sqlist **r)//转换
{
(*r)=(Sqlist *)malloc(sizeof(Sqlist));
int i=0;
while(s!=NULL)
{
(*r)-r[i]=s-e;//链表转换成顺序表
s=s-next;
i++;
}
(*r)-len=i;
}
main()
{
char s[1000];
printf("请输入初始化的字符串\
");
scanf("%s",s);
LT *A;Sqlist *B;
CreatLT(A,s);
printf("转换进行中......\
");
linkTOlist(A,B);
printf("转换后输出为\
");
int k=0;
for(k;kB-len;k++)
printf("%c ",B-r[k]);
return 0;
}
不知是否满意???
数据结构 将X插入到线性表的适当位置 保持线性表的有序性 有部分代码 求补充
#include iostream.h
#define MAXSIZE 100
void Disp_A(int A[],int num) /*输出向量*/
{
if(num==0) return; /*如果向量为空直接返回*/
for(int i=0;inum;i++) /*利用循环语句依次输出各个元素*/
coutA[i]" ";
coutendl;
}
int insert(int A[],int num,int x) //成功返回1、否则返回0
{
if(num==MAXSIZE) return 0;//向量已满
int i=num-1; //i指向尾元素
while(i=0A[i]x)
{
A[i+1]=A[i];//比x大的元素后移
i--;
}
A[i]=x;//新元素插入
num++;//表长增1
return 1;
}
main()
{
int a[MAXSIZE]={3,11,14,17,21,22,26,29,30,32,35,37,42,48,53,57,60,71,74,88};
/*定义长度为arrsize的整型向量,并对前20个元素赋初值*/
int num=20; //定义顺序表当前表长
int x;
cout"初始的有序向量:"endl;
Disp_A(a,num);/* 调用输出函数*/
coutendl"输入要插入的元素x=";
cinx; //输入要插入的元素值
insert(a,num,x);/* 调用插入函数*/
coutendl"插入新元素后的有序向量:"endl;
Disp_A(a,num);/* 调用输出函数*/
}
亲,采纳吧~
C语言数据结构线性表单链表的基本操作,写好了代码,编译无错,运行有错,求找错误在哪?给改正一下。谢谢
修改如下:
//---------------------------------------------------------------------------
#include "stdio.h"
#include "stdlib.h"
typedef char DataType;
typedef struct node{
DataType data;
struct node *next;
}ListNode;
typedef ListNode *LinkList;
ListNode *p;
LinkList head;
LinkList GreatListRH(void)
{
DataType ch;
LinkList head;
ListNode *s,*r;
head=(ListNode *)malloc(sizeof(ListNode));
r=head;
printf("输入链表各结点的数据:\n");
while((ch=getchar())!='\n')
{
s=(ListNode *)malloc(sizeof(ListNode));
s-data=ch;
r-next=s;
r=s;
}
r-next=NULL;
return head;
}
ListNode *LocateNode (LinkList head,DataType key)
{
ListNode *p=head-next;
while(pp-data!=key)
p=p-next;
return p;
}
void InsertList(LinkList head,DataType x,int i)
{
ListNode *p=head,*s;
int j;
for (j=0; ji-1; j++) {
p=p-next;
}
if(p==NULL)
{printf("未找到第%d个结点",i-1);exit(0);}
s=(ListNode *)malloc(sizeof(ListNode));
s-data=x,
s-next=p-next;
p-next=s;
}
void DeleteList(LinkList head,int i)
{
ListNode *p=head,*r;
int j;
for (j=0; ji-1; j++) {
p=p-next;
}
if(p==NULL||p-next==NULL)
{printf("未找到第%d个结点",i-1);exit(0);}
r=p-next;
p-next=r-next;
free(r);
}
void main()
{
ListNode *p,*s;
DataType key;
ListNode *q;
int i;
DataType x;
p=GreatListRH();
printf("输入链表各结点的数据:\n");
for(s=p-next;s!=NULL;s=s-next)
printf("%c",s-data);
printf("\n");
printf("输入要查找的数据:");
scanf("%c",key);
q=LocateNode(p,key);
if(q!=NULL)
printf("找到值为%c的结点:\n",key);
else
printf("没有找到值为%c的结点:\n",key);
printf("\n");
printf("输入要插入的数据和位置:");
fflush(stdin);
scanf("%c%d",x,i);
InsertList(p,x,i);
printf("在第%d个位置插入%c后链表各结点的数据:\n",i,x);
for(s=p-next;s!=NULL;s=s-next)
printf("%c",s-data);
printf("\n");//链表的插入
printf("输入要删除结点的位置:");
scanf("%d",i);
DeleteList(p,i);
printf("在第%d个位置删除结点后链表各结点的数据:\n",i);
for(s=p-next;s!=NULL;s=s-next)
printf("%c",s-data);
printf("\n");//链表的删除
}
//---------------------------------------------------------------------------