单链表

原创 2018年04月17日 18:30:00

顺序表:

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define N 1000
#define initSize 30
using namespace std;
typedef int DataType;
typedef struct {
    DataType *data;
    DataType n;//当前元素个数 
    DataType maxsize;//表的最大长度
}SeqList;
 
void initList(SeqList &L) {
    L.data = (DataType*) malloc (initSize*sizeof (DataType));
    if( !L.data) {
        printf("存储分配错误!\n");
        exit(1);
    }
    L.n = 0;
    L.maxsize = initSize;
}
 
void clearList(SeqList &L) {
    L.n=0;//表的当前元素个数为零,但是并未撤销掉表
}
 
int Length(SeqList &L) {
    return L.n;//计算顺序表的长度
}
int Locate( SeqList &L, DataType i) {
    if(i>=1 && i<=L.n)
        return i-1;//定位函数,函数返回第i 个元素的位置,如果函数返回-1则定位失败
    else
        return -1;
}
 
int Search(SeqList &L, DataType x) {
    for(int i=0;i<L.n;i++)
        if(L.data[i] == x) return i;//顺序查找
    return -1;//查找失败
}
 
bool Insert(SeqList& L, int i, DataType &x) {//将新元素X 插入到表中第i 个位置,插入成功则函数返回true ,否则返回false;
    if(L.n==L.maxsize) return false;
    if(i<1||i>L.n+1) return false;
    for(int j=L.n;j>=i;j--) 
        L.data[j]=L.data[j-1];
    L.data[i-1]=x;
    L.n++;
    return true;
}

bool Insert2(SeqList &L, DataType &x) {//直接插入在表尾
    if(L.n==L.maxsize) return false;
    L.data[L.n]=x;
    L.n++;
    return true;
}
 
bool Delete (SeqList& L, int i, DataType& x) {
    if(!L.n) return false;
    if(i<1 ||i>L.n) return false;
    x=L.data[i-1];
    for(int j=i;j<L.n;j++)
        L.data[j-1] = L.data[j];
    L.n--;
    return true;
}
 
void Merge(SeqList& LA, SeqList& LB) {
    DataType x;
    int n=Length(LA), m=Length(LB), i, k;
    for(i=0;i<m;i++) {
        x=LB.data[i];
        k=Search(LA, x);
        if(k==-1) {
            Insert(LA, LA.n, x);
            LA.n++;
        }
    }
}
 
void Intersection(SeqList& LA, SeqList& LB) {
    DataType x;
    int n=Length(LA), m=Length(LB), i, k;
    for(i=0;i<n;i++) {
        x=LA.data[i];
        k=Search(LB, x);
        if(k==-1) {
            Delete(LA, i, x);
            n--;
        }
        else i++;
    }
}
 
int main() {
    SeqList L1, L2;
    initList(L1), initList(L2);
    cout<<"对于L1,你想插入几个元素?请输入"<<endl;
    int k, a, b, m;
    cin>>k;
    for(int i=0;i<k;i++) {
        cin>>a;
        Insert(L1, i+1, a);
    }
    cout<<"输出L1的当前所有元素"<<endl;
    for(int i=0;i<Length(L1);i++)
        cout<<L1.data[i]<<' ';
    cout<<endl;
    cout<<"对于L2,你想插入几个元素?请输入"<<endl;
    cin>>m;
    for(int i=0;i<m;i++) {
        cin>>b;
        Insert(L1, i+1, b);
    }
    cout<<"输出L2的当前所有元素"<<endl;
    for(int i=0;i<Length(L2);i++)
        cout<<L2.data[i]<<' ';
    cout<<endl;
    cout<<"合并L1和L2的结果为:"<<endl;
    Merge(L1, L2);
    for(int i=0;i<Length(L1);i++)
        cout<<L1.data[i]<<' ';
    return 0; 
}

2

3.有头结点的单链表

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<stdlib.h>
using namespace std;

typedef int DataType;
typedef struct node{
    DataType data; 
    struct node *link;
}*LinkList,LinkNode;

void initList(LinkList &first) { 
//之所以这里是二级指针, 是因为first本身就是个指针,之所以说first是指针,是因为first是struct node类型的,自带 *link
//因为函数传递总是单项的,所以这里必须要用 &first, 才能对main中的表进行操作,而first本身就是指针,所以要用二级指针 *LinkList
//这里的 *LinkList 相当于 结构体中的 node*
    first = (LinkNode*) malloc (sizeof(LinkNode));
    if(!first) {
        printf("存储分配错误!\n");
        exit(1);
    }
    first ->link =NULL;//创建只有头结点的空表
}

void clearList( LinkList& first) {
    LinkNode *q;
    while(first->link != NULL) {
        q=first->link;
        first->link = q->link;
        free(q);
    }
}

int Length(LinkList &first) {
    LinkNode *q=first->link;
    int count = 0;
    while( q!= NULL) {
        q = q->link;
        count++;
    }
    return count;
}

LinkNode *Search(LinkList &first, DataType x) {
    LinkNode *q = first->link;
    while(q != NULL && q->data != x) {
        q = q->link;
    }
    return q;
}

LinkNode *Locate(LinkList &first, DataType i) {
    if(i<0)
        return NULL;
    LinkNode *q=first;
    int k=0;
    while(q->link != NULL && k<i) {
        q=q->link;
        k++;
    }
    return q;
}

bool Insert (LinkList &first, DataType i, DataType x) {
    LinkNode *p=Locate(first, i-1);//查找到前一个元素 
    if(p==NULL)
        return false;
    LinkNode *s= (LinkNode*) malloc (sizeof(LinkNode));
    if(s==NULL) {
        printf("存储分配错误!\n");
        exit(1);
    }
    s->data=x;
    s->link=p->link;
    p->link=s;
    return true;
}

int Delete(LinkList &first, DataType i, DataType &x) {
    LinkNode *p = Locate(first, i-1);
    if(p==NULL && p->link==NULL)
        return 0;
    LinkNode *q = p->link;
    p->link = q->link;
    x = q->data;
    free(q);
    return 1;
}
int main() {
    LinkList L, q;
    initList(L);
    cout<<"你想插入几个元素?"<<endl;
    int k, a;
    cin>>k;
    for(int i=0;i<k;i++) {
        cin>>a;
        Insert(L, i+1, a);
    }
    cout<<"现在表为:"<<endl;
    for(q = L->link;q!=NULL;q=q->link)
        cout<<q->data<<' ';
    cout<<endl;
    cout<<"删除的位置为:"<<endl;
    int b, x;
    cin>>b;
    Delete(L, b, x);
    cout<<"删除后的表为:"<<endl;
    for(q=L->link;q!=NULL;q=q->link)
        cout<<q->data<<' ';
    cout<<endl;
    return 0;
}

收藏助手
不良信息举报
您举报文章:单链表
举报原因:
原因补充:

(最多只允许输入30个字)