线性表与链表
线性表代码
本篇博客为基础内容,都是模板,具体内容具体分析,数据结构的基础知识。(本文为博主回忆数据结构而写,有什么问题,欢迎留言私信)
#include<iostream>//默认采用的是utf-8编码方式。终端输出是gb2312的方式。
#define Ok 1
#define Error 0
#define MaxSize 100
using namespace std;
typedef struct
{
int length;
int *elem;
}sqlist;
int init(sqlist &list){//初始化一个线性表。
list.elem=new int[MaxSize];
if(!list.elem)
exit(OVERFLOW);
list.length=0;
return Ok;
}
int GEtelem(sqlist L,int i,int &e){//顺序表的取值。
if(i<1||i>L.length) return Error;
e=L.elem[i-1];
return Ok;
}
int LocateElem(sqlist L,int e){
for (int i = 0; i <L.length ;i++)
{
if(L.elem[i]==e)return i+1;
/* code */
}
return 0;
}
int insert(sqlist &L,int i,int e){//插入数值。
if(i<1||i>L.length)return Error;
if(L.length==MaxSize)return Error;
for (int j = L.length-1;j>=i;j--)
{
L.elem[j+1]=L.elem[j];
}
L.elem[i-1]=e;
++L.length;
return Ok;
}
int ListDelete(sqlist &list,int i){//顺寻表的删除。
if(i<1||i>=list.length) return Error;
for (int j = i; i < list.length;j++)
{
list.elem[j-1]=list.elem[j];
}
--list.length;
return Ok;
}
int gevan(sqlist &list,int length){
if(length<1||length>MaxSize)return Error;
for(int i=0;i<length;i++){
cin>>list.elem[i];
}
list.length=length;
}
int main(){
sqlist List;
init(List);
int length;
cin>>length;
gevan(List,length);
return Ok;
}
线性表也可以通过对结构体的灵活运用,产生较好的数据结构
如:图书与价格的线性表
struct node
{
string s;
int price;
};
typedef struct List
{
node* data;
int length;
}List;
链表
#include<stdio.h>//队列
#include<iostream>
using namespace std;
#define OK 1
#define error -1
typedef struct Lnode
{
int data;
Lnode * next;
}Lnode,*LinkList;
int init(LinkList &L){
L=new Lnode;
L->next=NULL;
return OK;
}
int getelem(LinkList L,int i,int e)//第i个,存于e;
{
Lnode* p=L->next;
int j=1;
while (p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>1)return error;
e=p->data;
return OK;
}
Lnode* locateelem(LinkList &L,int e){//返回节点
Lnode *p=L->next;
while (p&&p->data!=e)
{
p=p->next;
}
return p;
}
int ListInsert(LinkList &L,int i,int e){//在第i个位置插入数值e
Lnode *p=L;
int j=0;
while (p&&j<i-1)
{
p=p->next;
j++;
}
if(!p&&j>i+1){
return error;
}
Lnode *s=new Lnode;
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
int listdelete(LinkList &L,int i){//单链表的删除。
Lnode *p=L;
int j=0;
while (p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1){
return error;
}
Lnode *q=p->next;
p->next=q->next;
delete q;//释放删除节点的内存。指针会消耗内存。
return OK;
}
void CreateList(LinkList &L,int n){//尾插法
L=new Lnode;
L->next=NULL;
Lnode* r=L;
for (int i = 0; i < n;i++)
{
Lnode *p=new Lnode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
void CreateList2(LinkList &L,int n){//前插法创立链表。
L=new Lnode;
L->next=NULL;
for (int i = 0; i <n ;i++)
{
Lnode*p=new Lnode;
cin>>p->data;
p->next=L->next;
L->next=p;
}
}
void printlist(LinkList L){
Lnode *p=L->next;
while (p)
{
cout<<p->data;
cout<<" ";
p=p->next;
}
cout<<endl;
}
int main(){
int n;
cin>>n;
LinkList L;
// CreateList2(L,n);
CreateList(L,n);
printlist(L);
ListInsert(L,2,8);
printlist(L);
while(1);
}
双向链表
#include<stdio.h>
#include<iostream>
using namespace std;
typedef struct DuLnode{
int data;
DuLnode *front;
DuLnode *next;
}DuLnode,*DuListLink;
void CreatDou(DuListLink &L,int n){//前插法创建双向链表
L=new DuLnode;
L->next=L;
L->front=L;
for (int i = 0; i < n; i++)
{
DuLnode *node=new DuLnode;
cin>>node->data;
node->next=L->next;
node->front=L;
node->next->front=node;
L->next=node;
}
}
void CreateList(DuListLink &L,int n){//双向链表的后插法。
L=new DuLnode;
L->next=L;
L->front=L;
DuLnode*r=L;
for (int i = 0; i < n;i++)
{
DuLnode* p=new DuLnode;
cin>>p->data;
p->next=r->next;
p->front=r;
r->next->front=p;
r->next=p;
r=r->next;
}
}
void deleleLnode(DuListLink &L,int i){
DuLnode *p=L->next;
int j=1;
while (p->next!=L&&j<i)
{
p=p->next;
j++;
}
if(j>i||p->next==L){
return;
}
p->front->next=p->next;
p->next->front=p->front;
delete p;
}
void insert(DuListLink &L,int i,int e){
DuLnode*node=new DuLnode;
node->data=e;
DuLnode *p=L->next;
int j=1;
while (p!=L&&j<i)
{
p=p->next;
j++;
}
if(p==L||j>i)
return;
node->next=p->next;
node->front=p;
p->next->front=node;
p->next=node;
return;
}
void Print(DuListLink L){
DuLnode* p=L->next;
while (p!=L)
{
cout<<p->data;
cout<<" ";
p=p->next;
}
cout<<endl;
}
int main(){
int n;
cin>>n;
DuListLink L;
// CreatDou(L,n);
CreateList(L,n);
Print(L);
deleleLnode(L,1);
Print(L);
insert(L,3,3);
Print(L);
while(1);
}