数据结构之线性表的简单练习
线性表的介绍
线性表特点:
1.存在唯一一个“第一个”、“最后一个”的数据元素
2.除第一个以外,集合中的每个数据元素均只有一个前驱,除最后一个之外,集合中的每个数据元素均只有一个后继。
3.线性表中的元素的个数n(b>=0)定义为线性表的长度。
线性表中顺序表的基本操作
创建
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct LNode *List;
struct LNode
{
int data[MAXSIZE];
int last; //用来指向最后一个元素
};
struct LNode L;
List MakeEmpty() ///初始化 建立空表
{
List PtrL;
PtrL = (List)malloc(sizeof(struct LNode));
//PtrL 代表定义类型的指针
PtrL->last = -1; //因为第一个元素是0,所以空表的最后一个元素就应该为-1
return PtrL;
}
展示
void show(List PtrL)
{
int i=0;
for(i=0;i<PtrL->last;i++)
{
printf("%d\n",PtrL->data[i]);
}
}
插入
void Insert(int x,int i,List PtrL)
{
int j=0;
if(i<1||i>PtrL->last)
{
printf("error\n");
}
for(j=PtrL->last;j>=i-1;j--) //移动腾出空位
//
{
PtrL->data[j+1] = PtrL->data[j];
}
PtrL->data[i-1] = x; //插入新元素
//因为要给 i 处插入 所以应该是 i-1
PtrL->last++; //指向新的最后一个元素位置
}
时间复杂度 O(n)
删除
void del(int i,List PtrL)
{
int j=0;
for(j=i-1;j<PtrL->last;j++)
{
PtrL->data[j]=PtrL->data[j+1];
}
PtrL->last--;
}
时间复杂度 O(n)
完整程序
#include<stdlib.h>
#define MAXSIZE 100
typedef struct LNode *List;
struct LNode
{
int data[MAXSIZE];
int last; //用来指向
};
struct LNode L;
List MakeEmpty() ///初始化 建立空表
{
List PtrL;
PtrL = (List)malloc(sizeof(struct LNode));
//PtrL 代表定义类型的指针
PtrL->last = -1; //因为第一个元素是0,所以空表的最后一个元素就应该为-1
return PtrL;
}
int Find(int x,List PtrL)
{
int i=0;
while(i<PtrL->last&&PtrL->data[i]!=x)
{
i++;
}
if(i>PtrL->last)
{
return -1;
}
else{
return i;
}
}
void Insert(int x,int i,List PtrL)
{
int j=0;
if(i<1||i>PtrL->last)
{
printf("error\n");
}
for(j=PtrL->last;j>=i-1;j--) //移动腾出空位
//
{
PtrL->data[j+1] = PtrL->data[j];
}
PtrL->data[i-1] = x; //插入新元素
//因为要给 i 处插入 所以应该是 i-1
PtrL->last++; //指向新的最后一个元素位置
}
void del(int i,List PtrL)
{
int j=0;
for(j=i-1;j<PtrL->last;j++)
{
PtrL->data[j]=PtrL->data[j+1];
}
PtrL->last--;
}
void show(List PtrL)
{
int i=0;
for(i=0;i<PtrL->last;i++)
{
printf("%d\n",PtrL->data[i]);
}
}
int main()
{
List PtrL;
PtrL = MakeEmpty();
int i;
PtrL->last=5;
for(i = 0;i<5;i++)
{
PtrL->data[i] = i ;
}
show(PtrL);
printf("------删除前\n");
del(5,PtrL);
show(PtrL);
printf("------删除后\n");
Insert(10,2,PtrL);
printf("------插入后\n");
show(PtrL);
}
}
待更新--------
练习1
2.6 已知L是无表头结点的单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。
a.在P结点后插入S结点的语句序列是
b.在P结点前插入S结点的语句序列是
c.在表首插入S结点的语句序列是
d.在表尾插入S结点的语句序列是(1)P->next=S;
(2)P->next=P->next->next;
(3)P->next=S->next;
(4)S->next=P->next;
(5)S->next=L;
(6)S->next=NULL;
(7)Q=P;
(8)while(P->next!=Q)
P=P->next;
(9)while(P->next!=NULL)
P=P->next;
(10)P=Q;
(11)P=L;
(12)L=S;
(13)L=P;
已知L是无表头结点的单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。
a.在P结点后插入S结点的语句序列是
s->next =p->next;
p->next=s;
b.在P结点前插入S结点的语句序列是
Q=p; 保存节点位置
p=L; 链表
while(P->next!=Q)
P=P->next; 遍历到p节点s->next =p->next;
p->next=s; 插入节点
c.在表首插入S结点的语句序列是
(5)S->next=L;
(12)L=S; 记得把新的头赋值给L
d.在表尾插入S结点的语句序列是
(9)while(P->next!=NULL)
P=P->next; 可以直接从p开始遍历(1)P->next=S;
(6)S->next=NULL;
练习2
2.7 已知L是带表头结点的非空单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。
a.删除P结点的直接后继结点的语句序列是
b.删除P结点的直接前驱结点的语句序列是
c.删除P结点的语句序列是
d.删除首元结点的语句序列是
e.删除尾元结点的语句序列是(1)P=P->next;
(2)P->next=P;
(3)P->next=P->next->next;
(4)P=P->next->next;
(5)while(P!=NULL)
P=P->next;
(6)while(Q->next!=NULL)
{
P=Q;
Q=Q->next;
}
(7)while(P->next!=Q)
P=P->next;
(8)while(P->next->next!=Q)
P=P->next;
(9)while(P->next->next!=NULL)
P=P->next;
(10)Q=P;
(11)Q=P->next;
(12)P=L;
(13)L=L->next;
(14)free(Q);
2.7 已知L是带表头结点的非空单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。
a.删除P结点的直接后继结点的语句序列是
(11)Q=P->next;
(3)P->next=P->next->next;
(14)free(Q);
b.删除P结点的直接前驱结点的语句序列是
(10)Q=P;
(12)P=L;
(8)while(P->next->next!=Q)
P=P->next;(3)P->next=P->next->next; 将所要删除的后一个节点的指向 赋值给 要删除节点的前一个节点。
(14)free(Q);
c.删除P结点的语句序列是
(10)Q=P;
(12)P=L;
(7)while(P->next!=Q)
P=P->next;(3)P->next=P->next->next;
(14)free(Q);
d.删除首元结点的语句序列是
(12)P=L;
(11)Q=P->next;
p->next 才是 首节点 而不是P
(3)P->next=P->next->next;
(14)free(Q);
e.删除尾元结点的语句序列是
(9)while(P->next->next!=NULL) 注意此处 是 p-next->next 最后指向了 null 之前的那个节点
P=P->next;(11)Q=P->next;
(3)P->next=P->next->next;
(14)free(Q);