1. 什么是线性表?线性表就是结点的有限序列。//什么是结点,我觉得应该就是数据。
2.前驱与后继:通俗的说,一个结点的前面一个结点为前驱,一个结点的后面一个结点为后继。
3.线性表的分类:根据存储结构,线性表分为两种,顺序线性表(主要表现形式为数组or结构体数组)与链式线性表。
4. 线性表的常用操作有,插入,删除,查找,检查线性表是否为空,计算线性表的长度。
5. 顺序表又可分为静态数组和动态数组。顺序表特点:可以快速找到要查找的数据以及存储,缺点:插入与删除复杂,需要将插入/删除的部位后面的数据后移/前移,非常浪费时间。
6. 链式表:单链表由数据与指针组成,即data与next。优点:插入与删除简单,只需改变指针指向即可。缺点:存储数据困难,需要从头开始查找。
7.链式表分为,单链表,循环链表(tail->next=head),双向链表(重点插入与删除)。
8. 单链表通常具有哨兵结点来使得实际头节点的插入与删除变得简单。哨兵结点不被看作实际结点。
9.课外知识:何为尾递归?
答:首先我们需要了解何为尾调用,假设有f(int)与g(int)两个函数,return g(n)为尾调用,return f(n-1)为尾递归,而 return f(n-1)+1则不是尾递归,尾递归都可化成循环表示,而非尾递归的递归则不行。如斐波那契数列就不是尾递归。
附:顺序表的插入与删除,单链表的插入与删除。
#include <stdio.h>
#define MAXSIZE 10
void Insert(int* a,int k,int data);
void Delete(int* a,int k);
void Serach();
int main(){
int data[MAXSIZE]={0};
for(int i=0;i<10;i++){
data[i]=i;
}
Insert(data,3,66);
//Delete(data,2);
for(int i=0;i<MAXSIZE;i++){
printf("%d ",data[i]);
}
}
void Insert(int* a,int k,int data){//往第k个结点后面插入data
if(k<0||k>MAXSIZE-1)
{
printf("Error!!!");
return ;
}
for(int i=MAXSIZE-2;i>=k;i--){//从后往前覆盖
a[i+1]=a[i];
}
a[k]=data;
}
void Delete(int* a,int k){//删除第k个结点
if(k<0||k>MAXSIZE-1)
{
printf("Error!!!");
return ;
}
for(int i=k-1;i<MAXSIZE;i++){
a[i]=a[i+1];
}
}
#include <stdio.h>
#include <malloc.h>
struct Cell{
int data;
Cell* next;
};
struct Cell* Create();
void Insert(Cell* cell,int k,int data);//在第k个结点后面插入data
void Delete(Cell* cell,int k);//删除第k个结点
int Length(Cell* cell);//长度
void Release(Cell* cell);
void print(Cell*);
int main(){
Cell* head=Create();
Insert(head,3,666);
Delete(head,1);
int a;
a=Length(head);
printf("%d ",a);
print(head);
}
Cell* Create(){
Cell *head,*p,*tail;
head=NULL;//初始化
p=NULL;
tail=NULL;
p=(struct Cell*)malloc(sizeof(struct Cell));
p->data=-1;
p->next=head;
head=p;//创建哨兵结点,即第0个结点
tail=p;
int n;
scanf("%d",&n);
while(n!=-1){
p=(struct Cell*)malloc(sizeof(struct Cell));
p->data=n;
p->next=NULL;
if(tail==NULL){
head=p;
}
else{
tail->next=p;
}
tail=p;
scanf("%d",&n);
}
return head;
}
void Insert(Cell* head,int k,int data){//在第k个结点后面插入data
Cell* tmp,*p;
tmp=head;
for(int i=0;i<k;i++){
tmp=tmp->next;//找到第k个结点
}
p=(Cell*)malloc(sizeof(struct Cell));
p->data=data;
p->next=tmp->next;
tmp->next=p;
}
void Delete(Cell* head,int k){//删除第k个结点
Cell *tmp, *tmq;
tmp=head;
for(int i=0;i<k;i++){
tmq=tmp;
tmp=tmp->next;
}
Cell* p;
p=tmp;
tmq->next=tmp->next;//删除
delete p;//释放冗余空间
}
int Length(Cell* head){
Cell* p;
p=head;
int n=0;
p=p->next;
while(1){
p=p->next;
n++;
if(p==NULL)
break;
}
return n;
}
void print(Cell* head){
Cell* p;
p=head;
p=p->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
}