数据结构-链表-c/cpp

main.cpp

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

int main()
{
    Linklist La,Lb,Lc;
	int n1,n2;
	La=(Linklist)malloc(sizeof(Lnode));
	La->next=NULL;
	printf("******两个单链表的合并操作******\n");
	printf("\n请输入要建立的链表La的长度:");
	scanf("%d",&n1);
	creatlist_L(La,n1);
	printf("\n******输出链表La中元素******\n");
	traverlist_L(La);
		Lb=(Linklist)malloc(sizeof(Lnode));
	Lb->next=NULL;
	printf("******两个单链表的合并操作******\n");
	printf("\n请输入要建立的链表Lb的长度:");
	scanf("%d",&n2);
	creatlist_L(Lb,n2);
	printf("\n******输出链表Lb中元素******\n");
	traverlist_L(Lb);
	printf("\n******下面执行合并操作******\n");
	if(La->data>Lb->data){
        Lc=Lb;
	}else
        Lc=La;
	mergelist_L(La,Lb,Lc,n2);
	printf("\n******输出由链表La和Lb归并所得新的链表Lc中的元素******\n");
	traverlist_L(Lc);

    return 0;
}

linklist.h

#include <stdio.h>
#include<malloc.h>
#define NULL 0

using namespace std;
typedef  int  Elemtype;
typedef struct Lnode{
Elemtype data;
struct Lnode *next;
}Lnode,*Linklist;

//使用尾插法创建单链表
void creatlist_L(Linklist L,int n)
{
 int i;
Linklist p,q;
q=L;
for(i=1;i<=n;i++)
{
 p=(Linklist)malloc(sizeof(Lnode));
printf("输入线性表的第%d个元素:",i);
scanf("%d",&p->data);
p->next=q->next;
q->next=p;
q=q->next;

}
}
//使用头插法创建单链表
//void creatlist_L0(Linklist L,int n)
//{
//    int i;
//    Linklist p,q;
//    q=L;
//    for(i=1;i<=n;i++){
//        p=new Lnode;
//        if(!p) exit(-2);
//        cout<<"enter element"<<endl;
//        cin>>p->data;
//        p->next=q->next;
//        q->next=p;
//
//    }
//
//
//}

void traverlist_L(Linklist head)
{
    Linklist p;
    printf("以head 为头指针的单链表中的元素为:");
    p=head->next;
    while(p!=NULL){
        printf("%5d  ",p->data);
        p=p->next;
    }
    printf("\n");

    if(head->next==NULL){
        cout<<"empty"<<endl;
    }
}


//查找第i个位置的元素,找到后赋值给e
void Getelem(Linklist L,int i,Elemtype &e,int n)
{
    int j;
    Linklist p;
    p=L;
    if(i>n){
        cout<<"位置越界"<<endl;
        exit(0);
    }
    //未越界
    for(j=1;j<=i;j++){
        p=p->next;
    }
    e=p->data;
}

void Listdelete(Linklist &L,int i)
{
    int j;
    Linklist p,q;
    p=q=L;
    for(int j=1;j<i;j++){
        p=p->next;
        q=p->next;
    }
    q=q->next;
    p->next=q->next;
    free(q);

}

void mergelist_L(Linklist La,Linklist Lb,Linklist Lc,int lb)
{
    int i;
    Linklist pb,q,pc;
    pb=Lb->next;
    pc=Lc->next;


    for(i=0;i<lb;i++){
        q=new Lnode;
        if(!q) exit(-2);
        q->data=pb->data;
        if(pc->data<pb->data){
            q->next=pc->next;
            pc->next=q;
        }

        pb=pb->next;
        pc=pc->next;
    }
    cout<<"mergelist"<<endl;
}
【问题描述】 请设计一个链表类,实现链表的初始化、插入、删除和打印操作。 节点的定义如下: typedef int elementType; typedef struct node { elementType data; node* next; } LList, *PList; 链表类的定义及要求如下: class linkedList { public: linkedList();//构造函数 virtual ~linkedList();//析构函数,注意要链表中所有节点的资源 void insert( int value );//警告:必须初始化才能使用! bool initiate();//初始化单链表,使用new操作创建头结点。如果创建失败,则返回false,否则返回true bool isEmpty();//判断单链表是否为空 //删除单链表中第pos个元素结点,并将删除的节点的值存在value中。 //注意:如果链表为空、删除位置大于链表长度、以及删除位置为0的情况,需要终止删除并输出相应信息 bool remove( int pos, int& value ); void print();//顺序打印单链表,如果是单链表为空,则输出 Empty int Length();//返回单链表长度。如果是单链表为空,则返回-1 private: LList *head; int len; }; main函数: int main(int argc, char* argv[]) { linkedList L1; int n; int val; //初始化链表 if(!L1.initiate()) return 0; cin>>n;//输入链表中数据个数 for(int i=0; i<n; i++) //输入n个数,并插入链表 { cin>>val; L1.insert(val); } cout << "Origin Length:" << L1.Length() << endl;//输出链表长度 cout << "data:" ; L1.print();//打印链表 cin>>n;//输入需要删除的数据的位置 if (L1.remove(n,val)) { //删除位置n的数据,并将删除的数据值放在val中 cout<<"Delete the data at position("<<n<<"):"<<val<<endl; cout<< "New Length:" << L1.Length()<< endl;//输出链表长度 cout<< "data:" ; L1.print();//打印链表 } return 0; } 【输入形式】 输入包括3行。 第一行是链表元素个数n。第二行为n个元素的值。第三行为拟删除的数据位置。 【输出形式】 输出格式不固定。具体参见样例。 【样例输入1】 4 1 2 3 4 2 【样例输出1】 Origin Length:4 data:1 2 3 4 Delete the data at position(2):2 New Length:3 data:1 3 4 【样例输入2】 2 100 -1 3 【样例输出2】 Origin Length:2 data:100 -1 pos > len, failed 【样例输入3】 8 8 7 6 5 4 3 2 1 0 【样例输出3】 Origin Length:8 data:8 7 6 5 4 3 2 1 pos <= 0, failed
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值