考研數據結構---線性表

                                    線性表

學習
不想學習
還是學習吧!!!
早起很痛苦!!!
學習不能使人快樂!!!

線性表內容還是算少的!!兩天整理完了!!!
在這裏插入圖片描述


一.線性表


1.線性表的順序存儲


typedef struct{
	ElemType data[MaxSize];//順序表的元素
	int length;//順序表的當前長度 
}SqList;//順序表的類型定義

#define InitSize 100  //表長度的初始定義
typedef struct{
	ElemType *data;//指示動態分配數組的指針
	int MaxSize,length;//數組的最大容量和當前個數 
}SeqList;//動態分配數組順序表的類型定義

2.插入操作(在第i(1<=i<=L.length+1)個位置插入新元素e

bool ListInsert(SqList &L,int i,ElemType e) 
{
	//將元素e插入到順序表L中第i個位置
	if(i<1 || i>L.length+1)  //判斷i的範圍是否有效
	   return false;
	if(L.length>=MaxSize)  //當前存儲空間已滿,不能插入
	   return false;
	for(int j=L.length;j>=i;j--) //將第i個元素及以後的元素後移
	    L.data[j]=L.data[j-1];
	L.data[i-1]=e;//在位置i處放入e
	L.length++; 
	return true;
}

3.刪除操作(刪除順序表中第i(1<=i<=L.length+1)個位置的元素

bool ListDelete(SqList &L,int i,Elemtype &e)
{
   //實現刪除順序表L中第i個位置的元素
   if(i<1 || i>L.length) //判斷i的範圍是否有效
      return false;
    e=L.data[i-1];//被刪除的元素複製給e
	for(int j=0;j<L.length;j++) //將第i個位置後的元素前移
	   L.data[j-1]=L.data[j];
	  L.length--;//線性表長度減1
	  return true; 
 } 

4.按值查找

int LocateElem(SqList L,ElemType e)
{
	//查找順序表中值爲e的元素,查找成功,返回位序
	int i;
	for(i=0;i<L.length;i++)
	  if(L.data[i]==e)
	    return i-1;//下標爲i的元素值等於e,返回其位序i+1
		return 0; 
 } 

二.單鏈表


1.單鏈表中結點類型

typedef struct LNode{  //定義單鏈表結點類型
   ElemType data;//數據域
   struct LNode *next;//指針域 	
}LNode,*LinkList; 

2.建立單鏈表

//頭插法建立單鏈表(讀入的數據的順序與生成的鏈表中的元素的順序是相反的) 
//每個結點插入的時間爲O(1),設單鏈表長爲n,則總時間複雜度爲O(n) 
LinkList List_HeadInsert(LinkList &L)
{
	LNode *s;int x;//創建頭結點
	L=(LinkList)malloc(sizeof(LNode));//創建頭結點
	L->next=NULL;//初始爲空鏈表
	scanf("%d",&x);//輸入結點的值
	while(x!=9999)
	{
		s=(LNode*)malloc(sizeof(LNode));//創建新結點
		s->data=x;
		s->next=L->next;
		L->next=s;
		scanf("%d",&x);//將新結點插入表中,L爲頭指針 
	 } 
	 return L;
 } 
//尾插法,將新結點插入到當前鏈表的表尾,增加一個尾指針,使其始終指向當前鏈表的尾結點
LinkList List_TailInsert(LinkList &L)
{
	//從表頭到表尾正向建立單鏈表L,每次均在表尾插入元素
	int x;
	L=(LinkList)malloc(sizeof(LNode));
	LNode *s,*r=L;//r爲表尾指針
	scanf("%d",&x);//輸入結點的值
	while(x!=9999){
		s=(LNode *)malloc(sizeof(LNode));
		s->data=x;
		r->next=s;
		r=s;//r指向新的表尾結點 
		scanf("%d",&x);
	} 
	r->next=NULL;//尾結點指針置空
	return L; 
 } 

3.按序號查找結點值

LNode *GetElem(LinkList L,int i){
	//取出單鏈表L(帶頭結點)中第i個位置的結點指針
	int j=1;//計數,初始爲1
	LNode *p=L->next;//頭結點指針賦給p
	if(i==0)
	    return L;//若i等於0,則返回頭結點
	if(i<1)
	    return NULL;//若i無效,則返回NULL
	while(p&&j<i)
	{
		//從第1個結點開始找,查找第i個結點
		p=p->next;
		j++; 
	 } 
	 return p;//返回第i個結點的指針,如果i大於表長,p=NULL,直接返回p即可 
} 

4.按值查找表結點

LNode *LocateElem(LinkList L,ElemType e)
{
	//查找單鏈表L(帶頭結點)中數據域值等於e的結點指針,否則返回NULL
	LNode *p=L->next;
	while(p!=NULL&&p->data!=e) //從第一個結點開始查找data域爲e的結點
	  p=p->next;
	 return p; 
 } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章