线性表,链表,循环链表的结构体表示以及基本操作。

线性表与链表

线性表代码

本篇博客为基础内容,都是模板,具体内容具体分析,数据结构的基础知识。(本文为博主回忆数据结构而写,有什么问题,欢迎留言私信)

#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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值