C语言线性表操作

一、实验目的

  1. 理解并掌握线性表的逻辑结构和顺序存储、链式存储方式;
  2. 理解顺序表相关基本算法、线性链表相关基本算法;
  3. 编程对相关算法进行验证;
  4. 线性表中的元素要从终端输入,具体的输入和输出格式不限;
  5. 算法要具有较好的健壮性,如:对插入、删除操作中的错误操作要做适当处理。

二、实验任务

  1. 构造一个线性表L,分别用顺序存储方式和带头结点的单链表方式存储该线性表,并将两种方式存储的线性表单独输出、单独求出长度;(下述实验内容2至4也要求在两种存储方式下单独实现,不再重复说明)
  2. 在第1步所构造的线性表L中取序号为i的元素,并用变量e返回;
  3. 在第1步所构造的线性表L中第i个元素之前插入一个元素e并将更新后的线性表L输出;
  4. 在第3步更新后所得到的线性表L中删除第j个元素,用变量e返回该元素,并将更新后的线性表L输出。

三、实验过程与结果

1.顺序存储

#include"stdafx.h"
#include<iostream>
using namespace std;

typedef int Status;
#define OK 1
#define ERROR 0
#define FALSE 0
#define TRUE 1
//#define OVERFLOW -2

template<typename T>
class SqList{
private:
	int length;
	int listSize;
	T *base;
public:
	SqList(int listSize=100){
		this->listSize=listSize;
	}

	void InitSqList(){
		base=new T[listSize];
		length=0;
	//	base=(T *)realloc(this->base,(this->listSize+1)*sizeof(T));
	}

	void DestroyList(){
		length=0;
		delete base;
	}

	void ClearList(){
		length=0;
	}

	bool ListEmpty(){
		return length>=0?false:true;
	}

	int ListLength(){
		return length;
	}

	Status GetElem(int i,T &e){
		if(i>length || i<=0)
			return ERROR;
		e=base[i-1];
		return OK;
	}

	int LocateElem(T e){
		for(int i=0;i<length;i++){
			if(base[i]==e)
				return i+1;
		}

		return 0;
	}

	void ListInsert(int i,T e){
		if(length==listSize)
				base=(T *)realloc(this->base,(this->listSize+1)*sizeof(T));

		if(i>=length)
			base[length]=e;
		else if(i<=0){
			for(int j=length;j>0;j--)
				base[j]=base[j-1];
			base[0]=e;
		}
		else{
			for(int j=length;j>i-1;j--)
				base[j]=base[j-1];
			base[i-1]=e;
		}

		length++;
	}

	void ListInsert(T e){
		if(length==listSize)
				base=(T *)realloc(this->base,(this->listSize+1)*sizeof(T));

		base[length]=e;

		length++;
	}

	Status ListDelete(int i,T &e){
		if(i<1 || i>length)
			return ERROR;
		e=base[i-1];
		for(int j=i-1;j<length-1;j++){
			base[j]=base[j+1];
		}
		length--;
		return OK;
	}

	void ListPrint(){
		if(!ListEmpty()){
			int count=0;
			for(int i=0;i<length;i++){
				cout<<base[i]<<"  ";
				count++;
				if(count%20==0)
					cout<<endl;
			}
			cout<<endl;
		}

		else
			return;
	}
};


int main(){
	SqList<int> s;
	s.InitSqList();

	for(int i=0;i<10;i++){
		s.ListInsert(i+1);
	}
	s.ListPrint();
	cout<<endl;

	int i=3;
	int e;

	if(s.GetElem(i,e)){
		cout<<"第"<<i<<"位的元素为"<<e<<endl;
	}
	else
		cout<<"没有找到第"<<i<<"位的元素!"<<endl;
	cout<<endl;

	i=5;
	s.ListInsert(i,1314);
	cout<<"插入元素后的链表为:"<<endl;
	s.ListPrint();
	cout<<endl;

	int j=3;
	if(s.ListDelete(j,e)){
		cout<<"删除第"<<j<<"位的元素"<<e<<"后的链表为:"<<endl;
		s.ListPrint();
		cout<<endl;
	}
	else{
		cout<<"没有成功删除第"<<j<<"位的元素,当前链表为:"<<endl;
		s.ListPrint();
		cout<<endl;
	}

	return 0;
}

2.带头结点单链表

#include"stdafx.h"
#include<iostream>
using namespace std;

typedef struct LNode{
	int date;
	LNode *next;
}LNode,*LinkList;

void InitList(LinkList &L);
void AddElem(LinkList &L,int e);
void Insert(LinkList &L,int e,int i);
bool GetElem(LinkList &L,int i,int &t);
bool DeleteElem(LinkList &L,int j,int &e);
int ListLength(LinkList &L);
bool IsEmpty(LinkList &L);
void ListPrint(LinkList &L);


int main(){
	LinkList L;
	InitList(L);

	for(int i=0;i<10;i++){
		AddElem(L,i+1);
	}
	ListPrint(L);
	cout<<endl;

	int i=3;
	int e;

	if(GetElem(L,i,e)){
		cout<<"第"<<i<<"位的元素为"<<e<<endl;
	}
	else
		cout<<"没有找到第"<<i<<"位的元素!"<<endl;
	cout<<endl;

	i=5;
	Insert(L,1314,i);
	cout<<"插入元素后的链表为:"<<endl;
	ListPrint(L);
	cout<<endl;

	int j=4;
	if(DeleteElem(L,j,e)){
		cout<<"删除第"<<j<<"位的元素"<<e<<"后的链表为:"<<endl;
		ListPrint(L);
		cout<<endl;
	}
	else{
		cout<<"没有成功删除第"<<j<<"位的元素,当前链表为:"<<endl;
		ListPrint(L);
		cout<<endl;
	}

}



void InitList(LinkList &L){
	L=new LNode();
	L->next=NULL;
}

void AddElem(LinkList &L,int e){
	LNode *p,*t,*Elem;
	Elem=new LNode;
	Elem->next=NULL;
	Elem->date=e;
	if(ListLength(L)==0){
		L->next=Elem;
	}
	else{
		for(p=L->next;p!=NULL;p=p->next)
			t=p;

		t->next=Elem;
	}
}

void Insert(LinkList &L,int e,int i){
	LNode *p,*m,*t;
	m=new LNode;
	m->date=e;
	m->next=NULL;

	if(i<=1){
			m->next=L->next;
			L->next=m;
	}	
	else if(i>1&&i<=ListLength(L)){
		int k=0;
		t=NULL;
		for(p=L->next;p!=NULL;p=p->next){
			k++;
			if(k==i)
				break;
			t=p;
		}

		t->next=m;
		m->next=p;
	}
	else{
		t=NULL;
		for(p=L->next;p!=NULL;p=p->next)
			t=p;

		t->next=m;
	}
}

bool GetElem(LinkList &L,int i,int &t){		//返回线性表中第i位的元素的值
	LNode *p;	
	
	if(i>ListLength(L) && i<1){
		return false;
	}

	int k=0;
	for(p=L->next;p!=NULL;p=p->next){
		k++;
		if(k==i){
			t=p->date;
			return true;
		}
	}
	return false;
}

bool DeleteElem(LinkList &L,int j,int &e){
	if(j>ListLength(L) && j<1){
		return false;
	}
	
	LNode *p,*t;
	int k=0;
	t=L;
	for(p=L->next;p!=NULL;p=p->next){
		k++;
		if(k==j){
			e=p->date;
			t->next=p->next;
			delete p;
			return true;
		}
		t=p;
	}

	return false;
}

int ListLength(LinkList &L){		//返回长度
	LNode *p;
	int s=0;
	for(p=L->next;p!=NULL;p=p->next){
		s++;
	}

	return s;
}

bool IsEmpty(LinkList &L){
	return (ListLength(L)==0)?true:false;
}

void ListPrint(LinkList &L){
	LNode *p;

	cout<<"L";
	if(IsEmpty(L)){
		cout<<"->NULL"<<endl;
		return;
	}
	for(p=L->next;p!=NULL;p=p->next){
		cout<<"->"<<p->date;
	}
	cout<<endl;
}
posted @ 2026-01-06 21:46  东血  阅读(2)  评论(0)    收藏  举报

载入天数...载入时分秒...