数据结构之线性表

本文介绍了线性表的基本概念,包括结点、前驱与后继,并详细阐述了顺序线性表和链式线性表的分类与特点。通过示例代码展示了顺序表的插入与删除操作,以及链式表(单链表、循环链表、双向链表)的插入、删除和长度计算。同时,讨论了尾递归的概念。
摘要由CSDN通过智能技术生成

      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;
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值