数据结构(一)线性表

数据结构(一)线性表

  • 一、线性表定义
  • 二、顺序表
    • 定义
    • 动态数组
  • 三、单链表
    • 定义
    • 不带头结点
    • 带头结点
    • 头结点与不带头结点的区别
    • 头插法与尾插法
  • 双链表
  • 循环链表
    • 循环单链表
    • 循环双链表
  • 静态链表

一、线性表定义

线性表是具有相同数据类型的n个数据元素的有限序列

特点:

  • 表中的元数的个数有限
  • 表中具有逻辑上的顺序性,表中元素有其先后次序
  • 表中元素都是数据元素,每个元素都是单个元素
  • 表中元素的数据类型都相同,这意味着每个元素占有相同大小的存储空间

二、顺序表

定义

线性表的顺序存储称为顺序表。逻辑上相邻的元素物理空间上也相邻
特点:

  • 随机访问(存取方式)
  • 存储密度高
  • 扩展容量不方便
  • 插入,删除操作不方便(需要大量元素的前移和后移操作)

动态数组

 // linear_list_dynast.cpp : This file contains the 'main' function. Program execution begins and ends there.
//#include <iostream>
using namespace std;
#define InitSize 10
typedef int ElemType;      //数据元素的类型,假设是int型的
typedef struct
{ElemType* data; //用动态数组的方式实现顺序表int MaxSize; //最大长度int length; //顺序表的长度
}SqList;
/*
函数作用:初始化线性表
函数名:void InitList(SqList& L)
参数:SqList& L
返回值:无
*/
void InitList(SqList& L)
{//malloc分配空间L.data = (ElemType*)malloc(sizeof(ElemType) * InitSize);//初始化L.length = 0;L.MaxSize = InitSize;
}	/*
函数作用:增加动态表的长度
函数名:void IncreaseSize(SqList& L,int len)
参数:SqList& L,int len
返回值:无
*/
void IncreaseSize(SqList& L,int len)
{ElemType* p = L.data;L.data=(ElemType*)malloc(sizeof(ElemType) * (L.MaxSize+len));for (int i = 0; i < L.length; i++){L.data[i] = p[i];//复制数据}L.MaxSize = L.MaxSize + len;  //顺序表最大长度添加lenfree(p);					//释放原来的内存空间}
/*
函数作用:线性表的长度
函数名:int Length(SqList L)
参数:SqList L
返回值:线性表的长度
*/
int Length(SqList L)
{return L.length;}
/*
函数作用:按值查找
函数名:void LocateElem(SqList L, ElemType e)
参数:SqList L, ElemType e
返回值:返回位序
*/
int LocateElem(SqList L, ElemType e)
{for (int i = 0; i < L.length; i++){if (L.data[i] == e){return i + 1;}}return false;
}
/*
函数作用:获取第i个元素
函数名:ElemType GetElem(SqList L, int i)
参数:SqList L, int i
返回值:获取的值
*/
ElemType GetElem(SqList L, int i)
{return L.data[i - 1];
}
/*
函数作用:在第i个元素插入指定的元素
函数名:ElemType GetElem(SqList L, int i)
参数:SqList L, int i
返回值:获取的值
*/
bool ListInsert(SqList& L, int i, ElemType e)
{if (i > L.length + 1 || i < 1)//判断i的范围是否有效{return false;}if (L.length >= L.MaxSize)  //当前存储空间大于最大空间{return false;}for (int j = L.length; j > i; j--)  //将第i个元素级之后的元素后移{L.data[j] = L.data[j - 1];}L.data[i - 1] = e;L.length++;return true;}
/*
函数作用:删除第i个元素的值,e返回
函数名:ElemType GetElem(SqList L, int i)
参数:SqList L, int i
返回值:获取的值
*/bool ListDelete(SqList& L, int i, ElemType& e)
{if (i > L.length || i < 1)//判断i的范围是否有效{return false;}e = L.data[i - 1];for (int j = i; j <= L.length; j++){if (j == L.length){L.data[j - 1] = 0;L.length--;return true;}L.data[j - 1] = L.data[j];}L.length--;return true;}/*
函数作用:打印所有元素值
函数名:void PrintList(SqList& L)
参数:SqList& L
返回值:获取所有元素值
*/
void PrintList(SqList& L)
{for (int i = 0; i < L.length; i++){//ListInsert(L, i + 1, i + 3);cout << L.data[i] << endl;}
}
/*
函数作用:顺序表是否为空
函数名:bool Empty(SqList& L)
参数:SqList& L
返回值:空为true , 非空为false
*/
bool Empty(SqList& L)
{if (L.data == NULL){return true;}else{return false;}
}void DestroyList(SqList& L)
{free(L.data);
}int main()
{SqList L; //声明一个线性表InitList(L); //初始化一个线性表int e;for (int i = 0; i < L.MaxSize; i++){ListInsert(L, i + 1, i + 3);cout << L.data[i] << endl;}ListDelete(L, 5, e);DestroyList(L);for (int i = 0; i < L.MaxSize; i++){//ListInsert(L, i + 1, i + 3);cout << L.data[i] << endl;}
}
void IncreaseSize(SqList& L,int len)
{ElemType* p = L.data;L.data=(ElemType*)malloc(sizeof(ElemType) * (L.MaxSize+len));for (int i = 0; i < L.length; i++){L.data[i] = p[i];//复制数据}L.MaxSize = L.MaxSize + len;  //顺序表最大长度添加lenfree(p);					//释放原来的内存空间}

动态数增加空间需要重新申请堆空间,并不是在原来的空间上操作的,对比链表来说,扩展不是很方便

三、单链表

定义

线性表的链式存储为单链表

不带头结点

// linear_singlelist.cpp : This file contains the 'main' function. Program execution begins and ends there.
//#include <iostream>
#include<stdlib.h>
using namespace std;
typedef int ElemType;      //数据元素的类型,假设是int型的typedef struct LNode
{ElemType data; //数据域struct LNode* next; //指针域指向下一个指针}LNode,*LinkList;/*
函数作用:初始化空的单链表
函数名:bool InitList(LinkList & L)
参数:LinkList & L
返回值:无
*///不带头节点
bool InitList(LinkList & L)
{//初始化一个空表L = NULL;return true;
}/*
函数作用:顺序表是否为空
函数名:bool Empty(SqList& L)
参数:SqList& L
返回值:空为true , 非空为false
*/
bool Empty(LinkList L)
{if (L == NULL){return true;}else{return true;}
}/*
函数作用:插入到第i个节点
函数名:bool ListInsert(LinkList& L,int i,ElemType e)
参数:LinkList& L,int i,ElemType e
返回值:获取的值
*/bool ListInsert(LinkList& L, int i, ElemType e)
{if (i < 1){return false;}//带有头节点的插入LNode* p = L;int j = 1;if (i == 1){LNode* s = (LNode*)malloc(sizeof(LNode));s->data = e;s->next = L;L = s;return true;}while (p != NULL && j < i - 1){p = p->next;j++;}if (p == NULL)  //i值不合法{return false;}LNode* s = (LNode*)malloc(sizeof(LNode));s->next = p->next;s->data = e;p->next = s;return true;}
/*
函数作用:前插
函数名:bool InsertPriorNode(LNode * p , ElemType e)
参数:LNode * p , ElemType e
返回值:插入成功 true ;插入失败 false;
*/
bool InsertPriorNode(LNode * p , ElemType e)
{if (p == NULL){return false;}LNode* s = (LNode*)malloc(sizeof(LNode)); //创建新节点if (s == NULL)  //分配失败{return false;}//插入    s->next = p->next;p->next = s;s->data = p->data;p->data = e;}//删除指定节点p
bool DeleteNode(LNode* p)
{//有bugif (p == NULL){return false;}LNode* q = p->next;if (q == NULL){}//O(1)时间复杂度p->data = p->next->data;p->next = q->next;free(q);return true;}/*
函数作用:求链表长度
函数名:int Length(LinkList L)
参数:LinkList L
返回值:链表长度
*/
int Length(LinkList L)
{int len = 0;LNode* p = L;while (p!= NULL){len++;p = p->next;}return len;}/*
函数作用:删除指定的节点
函数名:bool ListDelete(LinkList& L, int i, ElemType& e)
参数:LinkList& L, int i, ElemType& e
返回值:插入成功 true ;插入失败 false;
*/bool ListDelete(LinkList& L, int i, ElemType& e)
{int j = 1;LNode* p = L;if (i < 0){return false;}if (i == 1){LNode* q = L; //删除的节点L = L->next;free(q);return true;}while (p != NULL && j < i){p = p->next;j++;}if (p == NULL)  //i值不合法{return false;}if (p->next == NULL){return false;}LNode* q = p->next; //删除的节点e = q->data;p->next = q->next;free(q);return true;}/*
函数作用:插入到指定节点之后
函数名:bool InsertNextNode(LNode* p,ElemType e)
参数:LNode* p,ElemType e
返回值:插入成功 true ;插入失败 false;
*/
bool InsertNextNode(LNode* p,ElemType e)
{if (p == NULL){return false;}LNode* s = (LNode*)malloc(sizeof(LNode)); //创建新节点if (s == NULL)  //分配失败{return false;}//插入    s->data = e;s->next = p->next;p->next = s;return true;}/*
函数作用:打印所有元素值
函数名:void PrintList(SqList& L)
参数:SqList& L
返回值:获取所有元素值
*/
void PrintList(LinkList  L)
{LNode* p = L;while (p != NULL){cout << p->data << endl;p = p->next;}}/*
函数作用:获取第i个元素
函数名:ElemType GetElem(LinkList L, int i)
参数:LinkList L , int     (LinkList强调单链表) (LNode* 强调节点)  
返回值:获取的值
*/
LNode* GetElem(LinkList L, int i)
{int j = 1;LNode* p = L;//对i的范围进行判断if (i == 0){return  p;}if (i < 0){return NULL;}while (p->next != NULL && j<=i){p = p->next;j++;}return p;}/*
函数作用:尾插法
函数名:LinkList list_TailInsert(LinkList& L)
参数:LinkList& L
返回值:链表
*/
LinkList list_TailInsert(LinkList& L) //正向建立单链表
{int x;L = NULL;LNode* s = NULL, * r = L;scanf_s("%d", &x, sizeof(int));while (x != 9999){if (L == NULL){s = (LNode*)malloc(sizeof(LNode));s->data = x;s->next = NULL;L = s;r = s;scanf_s("%d", &x, sizeof(int));continue;}s = (LNode*)malloc(sizeof(LNode));s->data = x;s->next = NULL;r->next = s;r = s;scanf_s("%d", &x, sizeof(int));}return L;}LinkList List_HeadInsert(LinkList& L) //逆向建立单链表
{LNode* s;int x;L = NULL;scanf_s("%d", &x, sizeof(int));while (x != 9999){if (L == NULL){s = (LNode*)malloc(sizeof(LNode));s->data = x;s->next = NULL;L = s;scanf_s("%d", &x, sizeof(int));continue;}s = (LNode*)malloc(sizeof(LNode)); //创建新节点s->data = x;s->next = L;L = s;scanf_s("%d", &x, sizeof(int));}return L;
}int main()
{LinkList L;初始化头节点//bool ret = InitList(L);//if (ret)//{//    printf("分配成功\n");//}//else//{//}//int e;//插入节点//ListInsert(L, 1, 3);//ListInsert(L, 1, 2);//InsertNextNode(L, 5);//ListDelete(L,1,e);List_HeadInsert(L);PrintList(L);printf("表长=%d",Length(L));
}// Run program: Ctrl + F5 or Debug > Start Without Debugging menu
// Debug program: F5 or Debug > Start Debugging menu// Tips for Getting Started: 
//   1. Use the Solution Explorer window to add/manage files
//   2. Use the Team Explorer window to connect to source control
//   3. Use the Output window to see build output and other messages
//   4. Use the Error List window to view errors
//   5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
//   6. In the future, to open this project again, go to File > Open > Project and select the .sln file

带头结点

#include <iostream>
#include <stdio.h>using namespace std;
typedef int ElemType;      //数据元素的类型,假设是int型的typedef struct LNode
{ElemType data; //数据域struct LNode* next; //指针域指向下一个指针}LNode, * LinkList;/*
函数作用:初始化空的单链表
函数名:bool InitList(LinkList & L)
参数:LinkList & L
返回值:无
*///不带头节点
bool InitList(LinkList& L)
{//初始化头节点L = (LNode*)malloc(sizeof(LNode)); //分配头节点//初始化节点L->data = 0;L->next = NULL;if (L == NULL)   //分配不足,分配失败{return false;}else{return true;}}/*
函数作用:顺序表是否为空
函数名:bool Empty(SqList& L)
参数:SqList& L
返回值:空为true , 非空为false
*/
bool Empty(LinkList L)
{if (L->next == NULL){return true;}else{return true;}
}/*
函数作用:获取第i个元素
函数名:ElemType GetElem(LinkList L, int i)
参数:LinkList L , int     (LinkList强调单链表) (LNode* 强调节点)
返回值:获取的值
*/
LNode* GetElem(LinkList L, int i)
{int j = 0;LNode* p = L;//对i的范围进行判断if (i < 0){return NULL;}while (p != NULL && j < i){p = p->next;j++;}return p;}/*
函数作用:插入到第i个节点
函数名:bool ListInsert(LinkList& L,int i,ElemType e)
参数:LinkList& L,int i,ElemType e
返回值:获取的值
*/bool ListInsert(LinkList& L,int i,ElemType e)
{if (i < 1){return false;}//带有头节点的插入LNode* p = L;GetElem(L, i - 1);if (p == NULL)  //i值不合法{return false;}LNode *s= (LNode*)malloc(sizeof(LNode));s->next = p->next;s->data = e;p->next = s;return true;}bool ListDelete(LinkList& L, int i, ElemType& e)
{if (i < 0){return false;}int j = 0;LNode* p = L;while (p !=NULL && j<i-1){p = p->next;j++;}if (p == NULL)  //i值不合法{return false;}if (p->next == NULL){return false;}LNode* q = p->next; //删除的节点e = q->data;p->next = q->next;free(q);return true;}
/*
函数作用:插入到指定节点之后
函数名:bool InsertNextNode(LNode* p,ElemType e)
参数:LNode* p,ElemType e
返回值:插入成功 true ;插入失败 false;
*/
bool InsertNextNode(LNode* p, ElemType e)
{if (p == NULL){return false;}LNode* s = (LNode*)malloc(sizeof(LNode)); //创建新节点if (s == NULL)  //分配失败{return false;}//插入    s->data = e;s->next = p->next;p->next = s;return true;}/*
函数作用:打印所有元素值
函数名:void PrintList(SqList& L)
参数:SqList& L
返回值:获取所有元素值
*/
void PrintList(LinkList  L)
{LNode* p = L->next;while (p != NULL){cout << p->data << endl;p = p->next;}}  
LNode* LocateElem(LinkList &L,ElemType e)
{LNode* p = L->next;while (p != NULL && p->data != e){p = p->next;}return p;
}
/*
函数作用:求链表长度
函数名:int Length(LinkList L)
参数:LinkList L
返回值:链表长度
*/
int Length(LinkList L)
{int len = 0;LNode* p = L;while (p->next != NULL){len++;p = p->next;}return len;}
/*
函数作用:尾插法
函数名:LinkList list_TailInsert(LinkList& L)
参数:LinkList& L
返回值:链表
*/
LinkList list_TailInsert(LinkList& L) //正向建立单链表
{int x;L= (LNode*)malloc(sizeof(LNode));//创建头节点L->data = 0;L->next = NULL;LNode* s, * r = L;scanf_s("%d",&x,sizeof(int));while (x != 9999){s=(LNode*)malloc(sizeof(LNode));s->data = x;s->next = NULL;r->next = s;r = s;scanf_s("%d", &x, sizeof(int));}return L;}LinkList List_HeadInsert(LinkList & L) //逆向建立单链表
{LNode* s;int x;L = (LNode*)malloc(sizeof(LNode));//创建头节点L->next = NULL;scanf_s("%d", &x, sizeof(int));while (x != 9999){s= (LNode*)malloc(sizeof(LNode)); //创建新节点s->data = x;s->next = L->next;L->next = s;scanf_s("%d", &x, sizeof(int));}return L;}int main()
{LinkList L;//初始化头节点//bool ret=InitList(L);//if (ret)//{//    printf("分配成功\n");//}//else//{//}//int e;//插入节点//ListInsert(L, 1, 3); //ListInsert(L, 1, 4);//ListInsert(L, 1, 5);//ListDelete(L, 1, e);List_HeadInsert(L);PrintList(L);}// Run program: Ctrl + F5 or Debug > Start Without Debugging menu
// Debug program: F5 or Debug > Start Debugging menu// Tips for Getting Started: 
//   1. Use the Solution Explorer window to add/manage files
//   2. Use the Team Explorer window to connect to source control
//   3. Use the Output window to see build output and other messages
//   4. Use the Error List window to view errors
//   5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
//   6. In the future, to open this project again, go to File > Open > Project and select the .sln file

头结点与不带头结点的区别

/*
函数作用:插入到第i个节点
函数名:bool ListInsert(LinkList& L,int i,ElemType e)
参数:LinkList& L,int i,ElemType e
返回值:获取的值
*/bool ListInsert(LinkList& L,int i,ElemType e)
{if (i < 1){return false;}//带有头节点的插入LNode* p = L;GetElem(L, i - 1);if (p == NULL)  //i值不合法{return false;}LNode *s= (LNode*)malloc(sizeof(LNode));s->next = p->next;s->data = e;p->next = s;return true;}
/*
函数作用:插入到第i个节点
函数名:bool ListInsert(LinkList& L,int i,ElemType e)
参数:LinkList& L,int i,ElemType e
返回值:获取的值
*/bool ListInsert(LinkList& L, int i, ElemType e)
{if (i < 1){return false;}//不带有头节点的插入LNode* p = L;int j = 1;if (i == 1){LNode* s = (LNode*)malloc(sizeof(LNode));s->data = e;s->next = L;L = s;return true;}while (p != NULL && j < i - 1){p = p->next;j++;}if (p == NULL)  //i值不合法{return false;}LNode* s = (LNode*)malloc(sizeof(LNode));s->next = p->next;s->data = e;p->next = s;return true;}

不带头结点插入操作比带头结点的插入操作多了i==1时的判断,不带头结点因为初始化时指向的是NULL,所有最开始时插入要先创建头结点,之后的插入就跟带头结点的操作一样。所以不带头结点的更麻烦,一般情况下都是以带头结点编程的。

头插法与尾插法

在这里插入图片描述
在这里插入图片描述

头插法建立单链表的算法如下: /逆向建 立单链表
LinkList List HeadInsert(LinkList&L) {LNode *s; int x;L= (LinkList)malloc(sizeof (LNode));//初始为空链表L->next=NULL;//输入结点的值scanf ("号d", &x) ;//输入999表示结束while(x!=9999) {s=(LNode* )malloc(sizeof(LNode));//创建新结点s->data=x;s->next=L->next;L->next=s;      //将新结点插入表中,L为头指针scanf ("%d",&X) ;}
return L;}
//采用头插法建立单链表时,读入数据的顺序与生成的链表中的元素的顺序是相反的。
LinkList List_ TailInsert(LinkList &L)
{ 	//正向建立单链表int x;//设元素类型为整型L= (LinkList)malloc (sizeof (LNode)) ;LNode *s, *r=L;//r为表尾指针scanf ("&d", &X) ;//输入结点的值while(x!=9999) {     //输入9999表示结束s= (LNode★ )malloc (sizeof (LNode) ) ;s->data=x;r->next=s ;r=s;//r指向新的表尾结点scanf ("号d", &X) ;}r->next=NULL;/ /尾结点指针置空return L;
}

双链表

// linear_doublelist.cpp : This file contains the 'main' function. Program execution begins and ends there.
//#include <iostream>
using namespace std;
typedef int ElemType;      //数据元素的类型,假设是int型的
typedef struct DNode
{ ElemType data; //数据域struct DNode* prior, * next;  //前驱和后继指针}DNode,*DLinklist;//初始化双链表
bool InitDLinkList(DLinklist& L)
{L= (DNode*)malloc(sizeof(DNode));L->prior = NULL;L->next = NULL;return true;}/*
函数作用:顺序表是否为空
函数名:bool Empty(SqList& L)
参数:SqList& L
返回值:空为true , 非空为false
*/
bool Empty(DLinklist L)
{if (L->next == NULL){return true;}else{return true;}
}//p节点之后插入s节点
bool InsertNextDNode(DNode * p,DNode *s)
{if (p == NULL || s == NULL){return false;}s->next = p->next;if (p->next != NULL){p->next->prior = s;}s->prior = p;p->next = s;}//删除p节点的后继节点
bool DeleteNextDNode(DNode* p)
{if (p == NULL){return false;}DNode* q = p->next;if (q == NULL) //没有后继{return false;}p->next = q->next;if (q->next != NULL){q->next->prior = p;}free(q);return true;
}
//销毁链表
void DestoryList(DLinklist& L)
{while (L->next != NULL){DeleteNextDNode(L);}free(L);  //释放头节点L = NULL; //指向空
}int main()
{std::cout << "Hello World!\n";
}// Run program: Ctrl + F5 or Debug > Start Without Debugging menu
// Debug program: F5 or Debug > Start Debugging menu// Tips for Getting Started: 
//   1. Use the Solution Explorer window to add/manage files
//   2. Use the Team Explorer window to connect to source control
//   3. Use the Output window to see build output and other messages
//   4. Use the Error List window to view errors
//   5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
//   6. In the future, to open this project again, go to File > Open > Project and select the .sln file

循环链表

循环单链表

// linear_cyclelist.cpp : This file contains the 'main' function. Program execution begins and ends there.
//#include <iostream>
using namespace std;
typedef int ElemType;      //数据元素的类型,假设是int型的
typedef struct LNode
{ElemType data;struct LNode* next;
}LNode, * Linklist;//初始化双链表
bool InitDLinkList(Linklist& L)
{L = (LNode*)malloc(sizeof(LNode));if (L == NULL)   //内存分配不足{return false;}L->data = 0;L->next = L;return true;}//判断节点是否位循环单链表的表尾节点
bool isTail(Linklist L,LNode *p)
{if (p->next == L){return true;}else{return false;}
}//判断循环双链表是否是空的
bool Empty(Linklist L)
{if (L->next == NULL){return true;}else{return false;}}
int main()
{std::cout << "你好!\n";
}// Run program: Ctrl + F5 or Debug > Start Without Debugging menu
// Debug program: F5 or Debug > Start Debugging menu// Tips for Getting Started: 
//   1. Use the Solution Explorer window to add/manage files
//   2. Use the Team Explorer window to connect to source control
//   3. Use the Output window to see build output and other messages
//   4. Use the Error List window to view errors
//   5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
//   6. In the future, to open this project again, go to File > Open > Project and select the .sln file

循环双链表

// linear_doublecyclelist.cpp : This file contains the 'main' function. Program execution begins and ends there.
//#include <iostream>
using namespace std;
typedef int ElemType;      //数据元素的类型,假设是int型的
typedef struct LNode
{ElemType data;struct LNode* next,* prior;
}LNode, * Linklist;
//初始化双链表
bool InitDLinkList(Linklist& L)
{L = (LNode*)malloc(sizeof(LNode));if (L == NULL)   //内存分配不足{return false;}L->data = 0;L->next = L;L->prior = L;return true;}
//判断节点是否位循环单链表的表尾节点
bool isTail(Linklist L, LNode* p)
{if (p->next == L){return true;}else{return false;}
}//判断循环双链表是否是空的
bool Empty(Linklist L)
{if (L->next == NULL){return true;}else{return false;}}
//p节点之后插入s节点
bool InsertNextDNode(LNode* p, LNode* s)
{if (p == NULL || s == NULL){return false;}s->next = p->next;p->next->prior = s;s->prior = p;p->next = s;}
//删除p节点的后继节点
bool DeleteNextDNode(LNode* p)
{if (p == NULL){return false;}LNode* q = p->next;p->next = q->next;q->next->prior = p;free(q);return true;
}
int main()
{std::cout << "Hello World!\n";
}// Run program: Ctrl + F5 or Debug > Start Without Debugging menu
// Debug program: F5 or Debug > Start Debugging menu// Tips for Getting Started: 
//   1. Use the Solution Explorer window to add/manage files
//   2. Use the Team Explorer window to connect to source control
//   3. Use the Output window to see build output and other messages
//   4. Use the Error List window to view errors
//   5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
//   6. In the future, to open this project again, go to File > Open > Project and select the .sln file

静态链表

定义:分配一整个连续的空间,各个结点集中安置

// linear_staticlist.cpp : This file contains the 'main' function. Program execution begins and ends there.
//#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef int ElemType;      //数据元素的类型,假设是int型的
#define MaxSize 10  //静态链表的最大长度
typedef struct
{ElemType data;     //数据域int cur;    //下一个元素的数组下标}Component,SLinkList[MaxSize];//初始化双链表
bool InitSLinkList(SLinkList& L)
{for (int i = 1; i < MaxSize-1; i++){L[i].cur = i + 1;}L[MaxSize - 1].cur = 0;return true;}void CreateList(SLinkList& L)
{int n, i;printf("请输入链表的长度:");scanf_s("%d", &n);for (i=1;i<=n;i++){printf("请输入数据:");scanf_s("%d", &L[i].data);L[0].cur = L[i].cur;}L[i - 1].cur = 0;L[MaxSize - 1].cur = 1;//记录链表第一个元素的下标}int Malloc_List(SLinkList space)//模拟创建节点,返回的是节点的下标
{int i;i = space[0].cur;//空的空间,相当于创建心的节点space[0].cur = space[i].cur;//去下一个空的空间return i;
}void ListInsert(SLinkList& L)
{int k, n, i, j;printf("请输入插入的位置:");scanf_s("%d", &n);if (n<1 || n>L[0].cur){printf("插入位置异常,插入失败!\n");return;}k = MaxSize - 1;j = Malloc_List(L);  //创建节点for (i = 1; i < n; i++){k = L[k].cur;}L[j].cur = L[k].cur;L[k].cur = j;printf("请输入插入的数据:");scanf_s("%d", &L[j].data);}void DeleteList(SLinkList& L)//删除节点
{int n, i, k, j;printf("请输入删除的位置:");scanf_s("%d", &n);k = MaxSize - 1;for (i = 1; i < n; i++){k = L[k].cur;}j = L[k].cur;L[k].cur = L[j].cur;}int main()
{SLinkList a;InitSLinkList(a);}// Run program: Ctrl + F5 or Debug > Start Without Debugging menu
// Debug program: F5 or Debug > Start Debugging menu// Tips for Getting Started: 
//   1. Use the Solution Explorer window to add/manage files
//   2. Use the Team Explorer window to connect to source control
//   3. Use the Output window to see build output and other messages
//   4. Use the Error List window to view errors
//   5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
//   6. In the future, to open this project again, go to File > Open > Project and select the .sln file

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux网络编程(二)TCP通讯状态

linux网络编程&#xff08;二&#xff09;TCP通讯状态TCP状态转换为什么需要等待2MSL&#xff1f;端口复用TCP状态转换 tcp协议连接开始会经过三次握手&#xff0c;客户端和服务器开始都会处于CLOSED状态 第一次握手&#xff1a;客户端会先发送SYN请求给服务器&#xff0c;客户…

gethostbyname() 函数说明

转载&#xff1a;http://www.cnblogs.com/cxz2009/archive/2010/11/19/1881611.html gethostbyname()函数说明——用域名或主机名获取IP地址 包含头文件 #include <netdb.h> #include <sys/socket.h> 函数原型 struct hostent *gethostbyna…

Linux socket编程(一) 对套接字操作的封装

转载:http://www.cnblogs.com/-Lei/archive/2012/09/04/2670942.html 以前写的&#xff0c;现在回顾一下&#xff1a; 下面是对socket操作的封装&#xff0c;因为在Linux下写中文到了windows里面会乱码&#xff0c;所以注释用英文来写&#xff0c;有空再查下解决方法吧 socket.…

如何在linux上安装sqlite数据库

如何在linux上安装sqlite数据库一、下载二、解压三、配置&#xff08;configure&#xff09;四、编译和安装五、执行sqlite3程序六、测试代码一、下载 首先要先下载sqlite3源码包 链接&#xff1a;https://pan.baidu.com/s/1_70342ZLlPjLlqGzpy5IHw 提取码&#xff1a;84ne …

Linux fcntl函数详解

转载&#xff1a;http://www.cnblogs.com/xuyh/p/3273082.html 功能描述&#xff1a;根据文件描述词来操作文件的特性。 文件控制函数 fcntl -- file control 头文件&#xff1a; #include <unistd.h> #include <fcntl.h> 函数原型&#xff1a; …

vs2019使用sqlite数据库远程连接linux

vs2019使用sqlite数据库远程连接linux一、sqlite3添加到目录二、添加依赖库三、测试一、sqlite3添加到目录 将两个sqlite3头文件放入目录中 二、添加依赖库 打开项目属性 添加完成 三、测试 #include <stdio.h> #include <sqlite3.h>int main(int argc, cha…

AIGC:大语言模型LLM的幻觉问题

引言 在使用ChatGPT或者其他大模型时&#xff0c;我们经常会遇到模型答非所问、知识错误、甚至自相矛盾的问题。 虽然大语言模型&#xff08;LLMs&#xff09;在各种下游任务中展示出了卓越的能力&#xff0c;在多个领域有广泛应用&#xff0c;但存在着幻觉的问题&#xff1a…

关于C++子类父类成员函数的覆盖和隐藏

转载&#xff1a;http://blog.csdn.net/worldmakewayfordream/article/details/46827161 函数的覆盖 覆盖发生的条件&#xff1a; &#xff08;1&#xff09; 基类必须是虚函数&#xff08;使用virtual 关键字来进行声明&#xff09; &#xff08;2&#xff09;发生覆盖的两个函…

数据结构(五)层次遍历

数据结构&#xff08;五&#xff09;层次遍历// linear_listqueue.cpp : This file contains the main function. Program execution begins and ends there. //#include <iostream> #include <stdlib.h> #include <stdio.h> #define ElemType BiTree using …

cv2.VideoCapture()无法打开视频解决方法

cv2.VideoCapture无法打开视频解决方法问题解决方法问题 cv2.VideoCapture打开mp4文件&#xff0c;直接报错 解决方法 我们打开D:\opencv_3.4.2_Qt\opencv_3.4.2_Qt\x86\bin\&#xff08;opencv的dll动态库中找到&#xff09; 找到opencv_ffmpeg342.dll文件&#xff0c;放入…

函数指针指向类的静态成员函数

转载&#xff1a;http://www.cnblogs.com/dongyanxia1000/p/4906592.html 1. 代码 1 #include<iostream>2 #include<stdio.h>3 using namespace std;4 class Point5 {6 public:7 Point(int x0,int y0):x(x),y(y)8 { 9 count; 10 } 11 P…

OpenCV Mat的数据类型

OpenCV Mat的数据类型Mattype类型内存拷贝简单实现Mat Mat类(Matrix的缩写)是OpenCV用于处理图像而引入的-一个封装类。他是一个自动内存管理工具。 Mat:本质上是由两个数据部分组成的类:(包含信息有矩阵的大小&#xff0c;用于存储的方法&#xff0c;矩阵存储的地址等)矩阵头…

OpenCV基础知识 图像

OpenCV基础知识 图像位图模式灰度模式RGB模式位图模式 位图模式是是1位深度的图像&#xff0c;只有黑和白两种颜色。它可以由扫描或置入黑色的矢量线条图像生成&#xff0c;也能由灰度模式转换而成。其他图像模式不能直接转换为位图模式。 灰度模式 灰度模式是8位的图像&…

数组名和取数组名的区别

先来个简单的小案例 #include <stdio.h> #include <iostream>using namespace std;int main() {int a[10] { 0 };printf("%d\n", a);printf("%d\n", &a);printf("%d\n", a1);printf("%d\n", &a1);printf("…

C++继承详解三 ----菱形继承、虚继承

转载&#xff1a;http://blog.csdn.net/pg_dog/article/details/70175488 今天呢&#xff0c;我们来讲讲菱形继承与虚继承。这两者的讲解是分不开的&#xff0c;要想深入了解菱形继承&#xff0c;你是绕不开虚继承这一点的。它俩有着什么关系呢&#xff1f;值得我们来剖析。 菱…

leetcode(一)刷题两数之和

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 示例 1&#xff1a; 输入&#xff1a;nums [2,7,11,15], target 9 输出&#xff1a;[0,1] 解释&#xff1a;因为 nums[…

Linux并发服务器编程之多线程并发服务器

转载&#xff1a;http://blog.csdn.net/qq_29227939/article/details/53782198 上一篇文章使用fork函数实现了多进程并发服务器&#xff0c;但是也提到了一些问题&#xff1a; fork是昂贵的。fork时需要复制父进程的所有资源&#xff0c;包括内存映象、描述字等&#xff1b;目…

leetcode(977)有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;平方后&#xff0c;数组变为 […

IO多路复用之select全面总结(必看篇)

转载&#xff1a;http://www.jb51.net/article/101057.htm 1、基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取&#xff0c;它就通知该进程。IO多路复用适用如下场合&#xff1a; &#xff08;1&#xff09;当客户处理多个描述字时&#xff08;一般…

leetcode(283)移动零

283. 移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作&#xff0c;不能拷贝额外的数组。 尽量减少操作次数。 方法一&#xff1…