數據結構 之 線性表必須得會的 【基操】

線性表

一、線性表的概念

線性表是數據結構中常用的邏輯結構,它具有是具有相同數據類型的n個數據元素的有限序列,其中n爲表長,當n=0時則表示長度爲0.且除第一個元素外,每個元素都只有唯一 直接前驅,除最後一個元素,每個元素都只有唯一 直接後繼

其中,因爲類型相同,所以每個元素佔有相同的存儲空間。

二、線性表的分類

線性表一般分爲兩種,順序存儲(順序表)和鏈式存儲。

1、順序存儲

利用一組地址連續的存儲單元依次存儲線性表中的元素,表中元素的邏輯順序和物理順序相同。

同時,順序存儲初始化也分爲了靜態分配和動態分配,靜態分配爲一次性分配所有的空間,空間在運行過程中不會改變。動態分配在運行過程中可以隨着數據的增加而動態增加。

2、鏈式存儲

在鏈式存儲中,主要利用了指針的概念。在鏈式存儲中,結點類型爲以下描述:

typedef struct LNode{  //鏈表結構 
	int data;
	struct LNode *next;
}LNode,*LinkList;

鏈式存儲中,線性表的創建主要分爲了頭插法尾插法

三、C++程序

1、程序函數功能

  1. 頭插法創建鏈表
  2. 尾插法創建鏈表
  3. 刪除值爲x的所有值
  4. 鏈表反轉
  5. 鏈表插入
  6. 打印
#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);
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章