線性表
一、線性表的概念
線性表是數據結構中常用的邏輯結構,它具有是具有相同數據類型的n個數據元素的有限序列,其中n爲表長,當n=0時則表示長度爲0.且除第一個元素外,每個元素都只有唯一 直接前驅,除最後一個元素,每個元素都只有唯一 直接後繼
其中,因爲類型相同,所以每個元素佔有相同的存儲空間。
二、線性表的分類
線性表一般分爲兩種,順序存儲(順序表)和鏈式存儲。
1、順序存儲
利用一組地址連續的存儲單元依次存儲線性表中的元素,表中元素的邏輯順序和物理順序相同。
同時,順序存儲初始化也分爲了靜態分配和動態分配,靜態分配爲一次性分配所有的空間,空間在運行過程中不會改變。動態分配在運行過程中可以隨着數據的增加而動態增加。
2、鏈式存儲
在鏈式存儲中,主要利用了指針的概念。在鏈式存儲中,結點類型爲以下描述:
typedef struct LNode{ //鏈表結構
int data;
struct LNode *next;
}LNode,*LinkList;
鏈式存儲中,線性表的創建主要分爲了頭插法和尾插法。
三、C++程序
1、程序函數功能
- 頭插法創建鏈表
- 尾插法創建鏈表
- 刪除值爲x的所有值
- 鏈表反轉
- 鏈表插入
- 打印
#include<iostream>
#include<cstdio>
using namespace std;
typedef struct LNode{ //鏈表結構
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList List_HeadInsert(LinkList &L){ //頭插法插入鏈表
LNode *s;
int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
cin>>x;
while(x!=9999){
s = (LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
cin>>x;
}
return L;
}
LinkList List_TailInsert(LinkList &L){ //尾插法
int x;
L = (LinkList)malloc(sizeof(LNode)); //在令*r=L之前,需要給L分配存儲空間
LNode *s,*r=L;
cin>>x;
while(x!=9999){
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
cin>>x;
}
r->next = NULL;
return L;
}
LinkList Del_X(LinkList &L,int x){ //刪除鏈表中值爲X的所有結點
LNode *s=L->next,*pre=L,*d;
while(s){
if(s->data==x){
pre->next = s->next;
}
else{
pre = s;
}
s = s->next;
}
return L;
}
LinkList List_Reverse(LinkList &L){ //將鏈表反轉,即利用頭插法插入
LNode *s=L->next,*behind;
L->next=NULL;
while(s!=NULL){
behind = s->next;
s->next = L->next;
L->next = s;
s = behind;
}
return L;
}
LinkList List_Insert(LinkList &L,int pos,int val){ //鏈接插入,給出位置(從0開始)和值
LNode *s=L->next,*p;
int i=0;
while(s!=NULL){
if(i==pos){
p = (LNode*)malloc(sizeof(LNode));
p->data = val;
p->next = s->next;
s->next = p;
break;
}
s = s->next;
i++;
}
return L;
}
void List_Print(LinkList &L){ //打印鏈表
LNode *s=L->next;
while(s){
cout<<s->data<<endl;
s = s->next;
}
}
int main()
{
LinkList L;
L=List_TailInsert(L);
List_Print(L);
L = List_Reverse(L);
cout<<endl;
List_Print(L);
List_Insert(L,3,10);
cout<<endl;
List_Print(L);
}