数据结构实验代码记录

实验1

1顺序表的操作

① 随机产生一组2位整数,建立线性表的顺序存储结构,要求表中元素互不相同。

② 实现该线性表的遍历。

③ 在该顺序表中查找某一元素,查找成功显示查找元素,否则显示查找失败。

④ 在该顺序表中删除或插入指定元素。

⑤ 建立两个按值递增有序的顺序表,将他们合并成一个按值递减有序的顺序表。

2单链表的操作

① 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。

② 实现该线性表的遍历。

③ 实现单链表的就地逆置。

④ 建立两个按值递增有序的单链表,将他们合并成一个按值递增有序的单链表。要求利用原来的存储空间,并且新表中没有相同的元素。

代码

1,少部分用了c++引用

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
struct List{
    int *list;
    int size;
    int len;
};
void swap(int &a,int &b)
{
    int t = a;
    a = b,b = t;
}
void init(List &list,int size,int len)
{
    list.list = (int*)malloc(sizeof(int)*size);///申请空间
    list.size = size;
    list.len = len;
    int vis[101] = {0};///标记数组
    for(int i=0;i<len;i++)
    {
        int x = rand()%90+10;
        if(vis[x])
        {
            i--;
            continue;
        }
        list.list[i] = x;
        vis[x] = 1;
    }
}
int insert(List &list,int val,int pos)
{
    if(pos<0||pos>=list.len)
        return -1;
    if(list.len == list.size)///原空间不足,申请二倍
        list.list = (int*) realloc(list.list,sizeof(list)*2*list.size),list.size*=2;
    for(int i=list.len-1;i>=pos;i--)
        list.list[i+1] = list.list[i];
    list.list[pos] = val;
    list.len++;
    return 1;
}
int search(List list,int x)
{
   for(int i=0;i<list.len;i++)
        if(list.list[i] == x)
            return i;
   return -1;
}
int Delete(List &list,int pos)
{
    if(pos<0||pos>=list.len)
        return -1;
    for(int i=pos;i<list.len;i++)
        list.list[i] = list.list[i+1];
    list.len--;
    return 1;
}
void Merge(List list1,List list2,List &list3)
{
    list3.len = list1.len+list2.len;
    int i,j,k;
    i = 0,j = 0,k = list1.len+list2.len-1;
    for(int l = 0,r = 0;l<list1.len&&r<list2.len;)///去重
    {
        if(list1.list[l]==list2.list[r])
            k--,l++,r++,list3.len--;
        else if(list1.list[l]>list2.list[r])
            r++;
        else
            l++;
    }

    while(i<list1.len && j<list2.len && k+1)///倒着扫一遍
    {
        if(list1.list[i]==list2.list[j])
        {
            list3.list[k--] = list1.list[i];
            i++,j++;
        }
        else if(list1.list[i]>list2.list[j])
            list3.list[k--] = list2.list[j++];
        else
            list3.list[k--] = list1.list[i++];
    }
    while(i<list1.len)
        list3.list[k--] = list1.list[i++];
    while(j<list2.len)
        list3.list[k--] = list2.list[j++];
}
void Sort(List &list)///冒泡排序
{
    for(int i=0;i<list.len;i++)
        for(int j=i+1;j<list.len;j++)
            if(list.list[i]>list.list[j])
                swap(list.list[i],list.list[j]);
}
void Bianli(List list)
{
    for(int i=0;i<list.len;i++)
        printf("%d ",list.list[i]);
    printf("\n");
}
int main()
{
    srand(time(0));
    List lis1,lis2,lis3;
    init(lis1,100,3),init(lis2,100,3);
    init(lis3,100,0);
    Sort(lis1),Sort(lis2);
    for(int i=0;i<lis1.len;i++)
        printf("list1:%d\tlist2:%d\n",lis1.list[i],lis2.list[i]);
    printf("----------------------------\n");
    Merge(lis1,lis2,lis3);
    for(int i=0;i<lis3.len;i++)
        printf("list3:%d---%d\n",i,lis3.list[i]);
    insert(lis3,1111,2);
    printf("----------------------------\n");
    for(int i=0;i<lis3.len;i++)
        printf("list3:%d---%d\n",i,lis3.list[i]);
    printf("----------------------------\n");
    Delete(lis3,2);
    for(int i=0;i<lis3.len;i++)
        printf("list3:%d---%d\n",i,lis3.list[i]);
    printf("%d\n",search(lis3,lis1.list[1]));
    Bianli(lis1);
    return 0;
}

2,c++类实现

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
class List{
    private:
        struct Lst{
            int data;
            Lst *next;
        }head,*tail;
        int len;
    public:
        List(){
            head.next = NULL;
            tail = &head;
            len = 0;
        }
        bool Listempty(){
            return !head.next;
        }
        int GetList(int x){
            if(x<0||x>len){
                printf("error\n");
                return -1;
            }
            int cnt = 0;
            Lst Find = head;
            while(cnt<x && Find.next){
                cnt++;
                Find = *Find.next;
            }
            return Find.data;
        }
        int GetListlen(){
            return len;
        }
        void Listinsert(int val,int pos){
            int cnt = 0;
            Lst *Find = &head;
            while(cnt<pos-1 && Find->next)
            {
                cnt++;
                Find = Find->next;
            }
            Lst *p = new Lst;
            p->data = val;
            p->next = Find->next;
            Find->next = p;
            len++;
        }
        void ListInsert(int val){
            Lst *p = new Lst;
            p->data = val;
            p->next =  NULL;
            tail->next = p;
            tail = p;
            len++;
        }
        void ListDelete(int x){
            int cnt = 0;
            Lst *Find = &head;
            while(cnt<x-1 && Find->next){
                cnt++;
                Find = Find->next;
            }
            Lst *p = Find->next;
            Find->next = p->next;
            delete p;
            len--;
        }
        void Ergodic(){
            Lst *p = head.next;
            while(p){
                printf("%d ",p->data);
                p = p->next;
            }
            printf("\n");
        }
        void reverse(){///头插法恰好是反序的,所以拆掉当前链表的同时头插法建立一个新的即可
            Lst *p = head.next;
            Lst *fp = new Lst;
            Lst *ep;
            fp->next = NULL;
            while(p){
                ep = p->next;
                p->next = fp->next;
                fp->next = p;
                p = ep;
            }
            head.next = fp->next;
            delete fp;
        }
        friend void Merge(List &a,List &b);
};
void Merge(List &a,List &b){
    List::Lst *pa = a.head.next,*pb = b.head.next,*head,*tail,*del;
    b.len = 0;
    b.head.next = NULL;
    int len = 0;
    if(pa->data < pb->data)
        head = pa,pa = pa->next;
    else
        head = pb,pb = pb->next;
    tail = head;

    while(pa&&pb){
        if(pa->data==pb->data){
            if(pa->data!=tail->data)
                tail->next = pa,tail = pa,pa = pa->next,len++;
            else
                pa = pa->next,pb = pb->next;
        }
        else if(pa->data < pb->data){
            tail->next = pa,tail = pa,pa = pa->next,len++;
        }
        else
            tail->next = pb,tail = pb,pb = pb->next,len++;
    }
    while(pa)
        tail->next = pa,tail = pa,pa = pa->next,len++;
    while(pb)
        tail->next = pb,tail = pb,pb = pb->next,len++;
    tail->next = NULL;
    a.head.next = head;
    a.len = len;
}
int main()
{
    List a,b,c;
    c.ListInsert(5);
    c.ListInsert(4);
    c.ListInsert(3);
    a.ListInsert(1);
    a.ListInsert(7);
    a.ListInsert(9);

    int len = c.GetListlen();
    c.Ergodic();
    c.reverse();
    c.Ergodic();
    a.Ergodic();
    Merge(c,a);
    a.Ergodic();
    c.Ergodic();
    return 0;
}

实验2

1输入一个十进制数,利用栈操作,将该数转换成n进制数。

2输入一个表达式,表达式中包括三种括号“()”、“[]”和“{}”,判断该表达式的括号是否匹配。

 

二合一,纯c语言

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 //Compiler version gcc 6.3.0
typedef union base{
	int _int;
	char _char;
	long l_int;
	long long ll_int;
}base;
typedef struct Stack{
	base *p;
	int *state;
	int size,len;
}Stack;
void init(Stack *x){
	(*x).p = (base*)malloc(sizeof(base)*30);
	(*x).state = (int*)malloc(sizeof(int)*30);
	(*x).size = 30,(*x).len = 0;
}
void top(base *e,int *s,Stack x){
	if(x.len)
		*e = x.p[x.len-1],*s = x.state[x.len-1];
}
void pop(Stack *x){
	if((*x).len)
		(*x).len--;
}
void push(base val,int s,Stack *x){
	if((*x).len==(*x).size){
		(*x).p = (base*)realloc((*x).p,(*x).size*sizeof(base)*2);
		(*x).state = (int*)realloc((*x).state,(*x).size*sizeof(int)*2);
		(*x).size *= 2;
	}
	(*x).p[(*x).len] = val;
	(*x).state[(*x).len] = s;
	(*x).len++;
}
int empty(Stack x){
	return !x.len;
}
void clear(Stack *x){
    (*x).len = 0;
}
void cout(base x,int s){
	switch (s){
		case 0:printf("%d",x._int);break;
		case 1:printf("%c",x._char);break;
		case 2:printf("%ld",x.l_int);break;
		case 3:printf("%lld",x.ll_int);
	}
}
void Changebase(){
	Stack A;
	init(&A);
	int n,R;
	while(~scanf("%d%d",&n,&R)){
		int tn = n;
		while(n){
			int y = n%R,s;
			base x;
			if(y<10)s = 0,x._int = y;
			else s = 1,x._char = y-10+'A';
			push(x,s,&A);
			n/=R;
		}
		printf("%d change to %d base is ",tn,R);
		while(!empty(A)){
			int s;
			base e;
			top(&e,&s,A);pop(&A);
			cout(e,s);
		}
		printf("\n");
	}
}
void check(){
	Stack A;
	init(&A);
	char a[1000];
	while(~scanf("%s",a)){
		int flag = 0;
		for(int i = 0; a[i] ; i++){
			if(a[i]=='('||a[i]=='['||a[i]=='{'){
				base x;
				x._char = a[i];
				push(x,1,&A);
			}
			else if(a[i]==')'||a[i]==']'||a[i]=='}'){
				base c;
				int s;
				if(empty(A))
                    {flag = 1;break;}
				top(&c,&s,A);
				if(c._char=='{'&&a[i]=='}')
					pop(&A);
				else if(c._char=='('&&a[i]==')')
					pop(&A);
				else if(c._char=='['&&a[i]==']')
					pop(&A);
				else
                    break;
			}
		}
		printf("%s\n",(empty(A)&&!flag)?"Yes,match success!":"No,can't match!");
		clear(&A);
	}
}
int main()
{
	///Changebase();
	check();
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值