一维数组表示顺序表 ʕ •ᴥ•ʔ

由于老师课件都是分开写得 有的变量名出现了差错 (课件被我们疯狂吐槽)  然后小编根据昨天晚上室友的讲解 写了这篇比较简洁的代码 希望能够帮到你们~  大家可以看完我写的代码 然后再去看课件 应该就能看懂  所有链表 你只要学会了 插入 删除 其他的都比较简单 希望各位一定要手动去实现 !!! 光理解是不行的 

 

单链表操作 博客:https://blog.csdn.net/henucm/article/details/82709515  课件是上面是 先学一维数组 然后再学单链表

计算时间复杂度和空间复杂度 博客:https://blog.csdn.net/henucm/article/details/82494953

在使用dev c++ 的时候需要注意的事项:

这个地方需要根据你电脑是32位 还是64位 现在一般的电脑都是64位

 机房这台电脑是32位

如果你在运行的时候 弹出如图所示小黑块 说明你上面那个位数选错了。。

如果你的电脑是64位的 就选这个   上午就卡在这里 吐血。。。基础不牢固 哎

在编译的时候 会出现编译失败的情况 这个时候你需要根据报错提示 修改你的代码 

说了这些 让我们回到正题   在学习链表之前你需要了解指针概念 基本的指针表示符号你要知道  &取地址 *指向地址内存的值  

不明白的 手动去实现 ~

下面举个栗子 让我们重视指针 知道它的重要性

#include<iostream>
using namespace std;
void swap(int x,int y)
{
	int temp;
	temp=x;
	x=y;
	y=temp;
} 
int main()
{
	int a=1,b=2;
	cout<<a<<" "<<b<<endl;
	swap(a,b);
	cout<<a<<" "<<b<<endl;
}
/*
output
1 2
1 2 
*/ 

这个你会发现它并没有交换它的值

#include<iostream>
using namespace std;
void swap(int *x,int *y) // int *x=*&a  
{
	
	int temp;
	temp=*x;
	*x=*y;
	*y=temp;
} 
int main()
{
	int a=1,b=2;
	cout<<a<<" "<<b<<endl;
	swap(&a,&b);
	cout<<a<<" "<<b<<endl;
}
/*
output
1 2
2 1 
*/ 

这样就改变了

具体到这个链表代码的话 我们需要注意当我需要改变值的时候需要在前面加&  其他的话可加可不加 所以我们统一加上比较好

下面是较易懂代码(自认为 嘻嘻):

提醒!!交作业的时候不可复制黏贴 会查重 !! 一定要自己亲自动手去敲 这样才是真正的懂

#include <iostream>
#include <cstdlib> 
using namespace std;
# define  LIST_INIT_SIZE  100  // 线性表存储空间的初始分配量
# define   LISTINCREMENT    10  // 线性表存储空间的分配增量
struct Sqlist{
	int *elem;//存储空间基址
	int length;//当前表长(特指元素个数)
	int listsize;  //当前分配的存储容量(以sizeof(ElemType)为单位)
};
// 数组存取得时候是从0位开始存得 
//构造一个空的线性表L。
int initlist(Sqlist &L)
{
	L.elem=new int[LIST_INIT_SIZE];// 空表长度为0
	L.length=0;
	L.listsize=LIST_INIT_SIZE;// 初始存储容量
	return 1;
}
//销毁函数
void destroylist(Sqlist &L)
{
	if(L.elem) delete[] L.elem;//释放存储空间
	L.length=0;
	L.listsize=0;
} 
// 清除链表 
void ClearList(Sqlist &L)
{
	L.length=0;//将线性表的长度置为0
}
//判空 
int IsEmpty(Sqlist &L)
{
	if(!L.length)// L.length == 0
	return 1;
	return 0;
}
// 求链表长度 
int GetLength(Sqlist &L)
{
	return L.length;
 }
//获取线性表位置的元素
void GetElem(Sqlist &L,int i)
{
	if(i<1||i>L.length)//越界 
	{
		cout<<"输入不合法"<<endl;
	}
	else
	cout<<L.elem[i-1]<<endl;
}
//获得前驱
void GetPre(Sqlist &L,int i)
{
	if(i<2||i>L.length+1)
	{
		cout<<"输入不合法"<<endl;
	}
	else
	cout<<L.elem[i-2]<<endl;
}
//获得后继
void GetSuc(Sqlist &L,int i)
{
	if(i<1||i>L.length-1)
	{
		cout<<"输入不合法"<<endl;
	}
	cout<<L.elem[i]<<endl;
} 
int ListInsert_Sq(Sqlist &L, int i, int e)
{
	if(i<0||i>L.listsize)//越界 
	{
		cout<<"输入不合法"<<endl;
		return -1;
	}
	if(L.length==L.listsize)//当前存储空间已满,增加分配
	{
		int *newbase=(int *)realloc(L.elem,(L.listsize+ LISTINCREMENT)*sizeof(int));
		if(!newbase)
		cout<<"存储分配失败"<<endl;
		L.elem=newbase;//新基址
		L.listsize += LISTINCREMENT;//增加存储容量 
	}
	int *q=&(L.elem[i-1]); //q为插入位置
	for(int *p=&L.elem[L.length-1];p>=q;p--)
	{
		*(p+1)=*p;//插入位置之后的元素右移
	}
	*q=e;//插入e
	++L.length;//长度加一 
	return 1; 
}
//线性表的删除实现
int  ListDelete_Sq(Sqlist &L,int i)
{
	if(i<1||i>L.length)
	{
		cout<<"输入不合法"<<endl;
		return -1;
	}
	int *q=&(L.elem[L.length-1]);p为被删除元素的位置 
	for(int *p=&(L.elem[i-1]);p<q;p++)
	{
		*p=*(p+1);	//被删除元素之后的元素左移
	}
	--L.length;	//表长减1
}
//显示线性表
int Show_Sq(Sqlist &L) 
{
	for(int i=0;i<L.length;i++)
	{
		cout<<L.elem[i]<<endl;
	}
	return 1;
}
void show_help()
{
	cout << "1----清空线性表" << endl;
	cout << "2----判断线性表是否为空" << endl;
	cout << "3----求线性表长度" << endl;
	cout << "4----获取线性表指定位置元素" << endl;
	cout << "5----求前驱" << endl;
	cout << "6----求后继" << endl;
	cout << "7----在线性表指定位置插入元素" << endl;
	cout << "8----删除线性表指定位置元素" << endl;
	cout << "9----显示线性表" << endl;
	cout << "     退出,输出一个负数!" << endl;
}

int main()
{
	int operate_code;
	show_help();
	Sqlist L;
	initlist (L);
	int e,i;
	while(1)
	{
		cout << "请输入操作代码:";
		cin >> operate_code;
		if (operate_code == 1)
		{
			//调用操作函数1
			ClearList(L);
			cout << "the list is empty now" << endl;

		}
		else if (operate_code == 2)
		{
			if (IsEmpty(L))
				cout << "The list is empty" << endl;
			else
				cout << "The list is not empty" << endl;
		}
		else if (operate_code == 3)
		{
			cout << "the length of list is:" << GetLength(L) << endl;


		}
		else if (operate_code == 4)
		{
			cout << "请输入线性表元素的位置:" << endl;
			cin >> i;
			GetElem(L,i);
			
		}
		else if (operate_code == 5)
		{
			cout << "请输入元素的位置:" << endl;
			cin >> i;
			GetPre(L, i);
		
		}
		else if (operate_code == 6)
		{
			cout << "请输入元素的位置:" << endl;
			cin >> i;
			GetSuc(L, i);
			
		}
		else if (operate_code == 7)
		{

			cout << "请输入插入元素及其位置:" << endl;
			cin >> e >> i;
			ListInsert_Sq(L, i, e);
			cout << "e=" << e << " " << "i=" << i << endl;
		}
		
		else if (operate_code == 8)
		{
			cout << "请输入删除元素位置:" << endl;
			cin >> i;
			ListDelete_Sq(L, i);
			cout << "已删除" << endl;

		}
		else if (operate_code == 9)
		{
			Show_Sq(L);
		}
		else if (operate_code<0)
		{
			break;
		}
		else
		{
			cout << "\n操作码错误!!!" << endl;
			show_help();
		}
		
	} 
	//调用销毁线性表函数
	destroylist(L); 
	return 0;
}

课件版:

你看完发现并没有那么复杂只不过把有的名字取的比较复杂 然后就看起来比较复杂啦 

再次提醒!!交作业的时候不可复制黏贴 会查重 !! 一定要自己亲自动手去敲 这样才是真正的懂

#include <iostream>
#include <cstdlib>
using namespace std;
//1.定义存储表示  ppt 22页
typedef int ElemType;               //定义ElemType类型为int
# define  LIST_INIT_SIZE  100  // 线性表存储空间的初始分配量
# define   LISTINCREMENT    10  // 线性表存储空间的分配增量

// !这种结构体的也可以  不过我更喜欢自己那种 

typedef struct {              //若后面不再用,可省略结构名
	ElemType *elem;         //存储空间基址
	int    length;      //当前表长(特指元素个数)
	int   listsize;     //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;

typedef int Status;// !定义ElemType类型为int 
//初始化
//大家在看老师的代码的时候把  ElemType和 Status都看成int 
Status   InitList_Sq(SqList &L)
{ //构造一个空的线性表L。
	L.elem = new ElemType[LIST_INIT_SIZE];
	L.length = 0;                    // 空表长度为0
	L.listsize = LIST_INIT_SIZE;  // 初始存储容量
	return   1;
}

//销毁函数
void DestroyList(SqList &L)
{
	if (L.elem) delete[] L.elem;    //释放存储空间
	L.length = 0;
	L.listsize = 0;
}

//2.定义操作函数1
void ClearList(SqList &L)
{
	L.length = 0;                //将线性表的长度置为0
}

//3.定义操作函数2
bool IsEmpty(SqList L)
{
	if (L.length == 0)
		return true;
	else
		return false;
}

//4.定义操作函数3
int GetLength(SqList L)
{
	return L.length;
}
//5.获取线性表位置的元素
Status GetElem(SqList &L,int i) {
	if (i<1 || i>L.length )
	{
		cout<<"输入不合法"<<endl;
		return 0; 
	}
	cout << L.elem[i - 1] << endl;
	return 1;
}

//获得前驱
Status GetPre(SqList &L, int i) {
	if (i<2 || i>L.length+1){
		cout<<"输入不合法"<<endl;
		return 0; 
	}
	cout<< L.elem[i - 2]<<endl;

	return 1;
}

//获得后继
Status GetSuc(SqList &L, int i) {
	if (i<1 || i>L.length - 1)
	{
		cout<<"输入不合法"<<endl;
		return 0; 
	}
	cout<<L.elem[i]<<endl;
	return 1;
}

//线性表的插入实现
Status ListInsert_Sq(SqList &L, int i, ElemType e) {
	if (i<0 || i>L.listsize)         //i值不合法
	{
		cout<<"输入不合法"<<endl;
		return 0; 
	}
	if (L.length == L.listsize)//当前存储空间已满,增加分配
	{
		ElemType* newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
		if (!newbase)  
		cout<<"存储分配失败"<<endl;//存储分配失败
		L.elem = newbase;  //新基址
		L.listsize += LISTINCREMENT; //增加存储容量
	}
	ElemType* q = &(L.elem[i - 1]); //q为插入位置
	
	for (ElemType* p = &L.elem[L.length - 1]; p >= q; --p) {
		*(p + 1) = *p; 	//插入位置之后的元素右移
	}
	*q = e; 		//插入e
	
	++L.length;
	
	return 1;
} //ListInsert_Sq

//线性表的删除实现
Status ListDelete_Sq(SqList &L, int i) {
	if (i<1 || i>L.length)
	{
		cout<<"输入不合法"<<endl;
		return 0; 
	}
	ElemType* p=&(L.elem[i-1]); 	//p为被删除元素的位置 
	ElemType* q = L.elem + L.length - 1;	//表尾元素的位置   
	for (++p; p<=q;++p) {
		*(p - 1) = *p;		//被删除元素之后的元素左移
	}
	--L.length;		//表长减1
	return 1;
}//ListDelete_Sq

//显示线性表
Status Show_Sq(SqList &L) {
	int res;
	for (int j = 0; j < L.length; j++) {
		res = L.elem[j];
		cout << res << endl;
	}
	return 1;
}
void show_help()
{
	cout << "1----清空线性表" << endl;
	cout << "2----判断线性表是否为空" << endl;
	cout << "3----求线性表长度" << endl;
	cout << "4----获取线性表指定位置元素" << endl;
	cout << "5----求前驱" << endl;
	cout << "6----求后继" << endl;
	cout << "7----在线性表指定位置插入元素" << endl;
	cout << "8----删除线性表指定位置元素" << endl;
	cout << "9----显示线性表" << endl;
	cout << "     退出,输出一个负数!" << endl;
}

int main()
{
	int operate_code;
	show_help();
	//定义线性表变量,如SqList L;
	//调用初始化线性表函数,如  Init_List(L);
	SqList L;
	InitList_Sq(L);
	ElemType e;
	int i;
	while (1)
	{
		cout << "请输入操作代码:";
		cin >> operate_code;
		if (operate_code == 1)
		{

			ClearList(L);
			cout << "the list is empty now" << endl;

		}
		else if (operate_code == 2)
		{
			if (IsEmpty(L))
				cout << "The list is empty" << endl;
			else
				cout << "The list is not empty" << endl;
		}
		else if (operate_code == 3)
		{
			cout << "the length of list is:" << GetLength(L) << endl;
		}
		else if (operate_code == 4)
		{
			cout << "请输入线性表元素的位置:" << endl;
			cin >> i;
			GetElem(L,i);
			
		}
		else if (operate_code == 5)
		{
			cout << "请输入元素的位置:" << endl;
			cin >> i;
			GetPre(L, i);
		
		}
		else if (operate_code == 6)
		{
			cout << "请输入元素的位置:" << endl;
			cin >> i;
			GetSuc(L, i);
			
		}
		else if (operate_code == 7)
		{

			cout << "请输入插入位置及其元素:" << endl;
			cin >> i >> e;
			ListInsert_Sq(L, i, e);
		}
		
		else if (operate_code == 8)
		{
			cout << "请输入删除元素位置:" << endl;
			cin  >> i;
			ListDelete_Sq(L, i);
			cout << "已删除" << endl;


		}
		else if (operate_code == 9)
		{
			Show_Sq(L);
		}
		else if (operate_code<0)
		{
			break;
		}
		else
		{
			cout << "\n操作码错误!!!" << endl;
			show_help();
		}


	}
	//调用销毁线性表函数,如  Destroy_List(L);
	DestroyList(L);
	return 0;
}

 

好的,我可以回答这个问题。单向链是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。以下是一个简单的单向链的实现: ``` #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } Node; typedef struct LinkedList { Node* head; int size; } LinkedList; LinkedList* createLinkedList() { LinkedList* list = (LinkedList*)malloc(sizeof(LinkedList)); list->head = NULL; list->size = ; return list; } void addNode(LinkedList* list, int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; if (list->head == NULL) { list->head = newNode; } else { Node* current = list->head; while (current->next != NULL) { current = current->next; } current->next = newNode; } list->size++; } void removeNode(LinkedList* list, int data) { if (list->head == NULL) { return; } if (list->head->data == data) { Node* temp = list->head; list->head = list->head->next; free(temp); list->size--; return; } Node* current = list->head; while (current->next != NULL) { if (current->next->data == data) { Node* temp = current->next; current->next = current->next->next; free(temp); list->size--; return; } current = current->next; } } void printList(LinkedList* list) { Node* current = list->head; while (current != NULL) { printf("%d ", current->data); current = current->next; } printf("\n"); } int main() { LinkedList* list = createLinkedList(); addNode(list, 1); addNode(list, 2); addNode(list, 3); printList(list); removeNode(list, 2); printList(list); return ; } ``` 这个程序实现了一个简单的单向链,包括创建链、添加节点、删除节点和打印链等功能。当然,这只是一个基础的实现,你可以根据自己的需求进行扩展和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值