链表的相关操作-数据结构与算法(北航991数据结构)

数据结构与算法 PTA 8-1【顺序表的实现】(C语言) 【代码】数据结构与算法入门 8-1【顺序表的实现】 取顺序表的长度作为返回值 /根据pos位置获取线性表的数据元素/获取数据元素在顺序表中的位置 /在顺序表中修改一个数据元素 /在顺序表中删除重复的数据元素 阅读详情

数据结构与算法(北航991数据结构)

下面的这一段代码是针对于这30道题而写的关于单向链表,双向链表以及循环链表等链表的创建及遍历,做辅助使用。
所有题目均是自己理解敲的,并执行成功的。可能会存在一起问题,或者有更优化的代码。欢迎留言讨论。谢谢

void INSERTLINK1(LinkList *list,ElemType item){ // 在链表首位插入新元素
    LinkList p  ;
    p = (LinkList) malloc(sizeof (LNode));
    p->data=item;
    p->link=*list;
    *list=p; // 是将list地址中的内容重新赋值为p的地址
}

//数组的遍历
void ARRAYPRINT(ElemType arr[],int n){
    printf("--------------------------------------\n");
    for (int i = 0; i < n; ++i) {
        printf("data:%d\n",arr[i]);
    }
    printf("--------------------------------------\n");
}

int LENGTH(LinkList list){
    LinkList p = list;
    int n = 0 ;
    while (p!=NULL){
        n++;
        p=p->link;
    }
    return n;
}
//遍历
void LINKPRINT(LinkList list){
    printf("================================\n");
    LinkList p = list;
    while (p != NULL){
        printf("data: %d\n",p->data);
        p=p->link;
    }
    printf("================================\n");
}

//建立一个线性链表
LinkList CREAT(int n){
    LinkList p , r , list=NULL;
    ElemType a;
    for (int i = 0; i < n ; ++i) {
        p=(LinkList) malloc(sizeof(LNode));
        a=i*30;
        p->data=a;
        p->link=NULL;
        if(list==NULL)
            list=p;
        else
            r->link=p;
        r=p;
    }
    return list;
}

//创建一个不带头结点的循环链表
LinkList CREAT2(int n){
    LinkList p , r , list =NULL;
    ElemType a;
    for (int i = 0; i < n ; ++i) {
        p=(LinkList) malloc(sizeof(LNode));
        a=i*30+15;
        p->data=a;
        p->link=NULL;
        if(list == NULL)
            list=p;
        else
            r->link=p;
        r=p;
    }
    r->link=list;
    return list;
}

LinkList CREAT3(int n){ //创建一个带头结点的循环链表
    LinkList p , r , list;
    list=(LinkList) malloc(sizeof (LNode));
    r = list;
    for (int i = 0; i < n ; ++i) {
        p = (LinkList) malloc(sizeof (LNode));
        p->data=(i+1)*15;
        r->link=p;
        r=p;
    }
    // 循环结束,r执行链表最后一个结点,再将r指向头结点
    r->link=list;
    return list;
}

DLinkList CREAT4(int n ){//创建不带头结点的双向循环链表
    DLinkList p , r , list = NULL;
    int a ;
    for (int i = 1; i <=n; ++i) {
        p=(DLinkList) malloc(sizeof (DNode));
        scanf("%d",&a);
        p->data=a;
        if(list == NULL)
            list=p;
        else{
            r->rlink=p;
            p->llink=r;
        }
        r=p;
    }
    r->rlink=list;
    list->llink=r;
    return list;
}


//创建带头结点的双向循环链表
DLinkList CREAT5(int n ){
    DLinkList p , r , list;
    list=(DLinkList) malloc(sizeof (DNode));
    list->rlink=NULL;
    list->llink=NULL;
    r=list;
    for (int i = 1; i <=n; ++i) {
        p=(DLinkList) malloc(sizeof (DNode));
        p->data=i*15-90;
        p->rlink = NULL;
        p->llink=NULL;

        r->rlink=p;
        p->llink = r;
        r=p;
    }
    p->rlink=list;
    list->llink=p;
    return list;
}

//创建带头结点的双向循环链表 .自己输入数
DLinkList CREAT6(int n ){//创建带头结点的双向循环链表 .自己输入data
    DLinkList p , r , list;
    list=(DLinkList) malloc(sizeof (DNode));
    list->rlink=NULL;
    list->llink=NULL;
    r=list;
    int a ;
    for (int i = 1; i <=n; ++i) {
        p=(DLinkList) malloc(sizeof (DNode));
        scanf("%d",&a);
        p->data=a;
        p->rlink = NULL;
        p->llink=NULL;

        r->rlink=p;
        p->llink = r;
        r=p;
    }
    p->rlink=list;
    list->llink=p;
    return list;
}

DLinkList2 CREAT7(int n ){//创建不带头结点的双向循环链表,针对第26题
    DLinkList2 p , r , list = NULL;
    int a ;
    for (int i = 1; i <=n; ++i) {
        p=(DLinkList2) malloc(sizeof (DNode2));
        scanf("%d",&a);
        p->data=a;
        p->freq=0;
        if(list == NULL)
            list=p;
        else{
            r->rlink=p;
            p->llink=r;
        }
        r=p;
    }
    r->rlink=list;
    list->llink=r;
    return list;
}



void LINKPRINT2(LinkList list){  // 遍历不带头结点的循环链表
    printf("==============不带头结点的循环链表==================\n");
    LinkList p = list;
    printf("data: %d\n",p->data);
    p=p->link;
    while (p != list){
        printf("data: %d\n",p->data);
        p=p->link;
    }
    printf("==============不带头结点的循环链表==================\n");
}

void LINKPRINT3(LinkList list){  // 遍历带头结点的循环链表
    printf("==============带头结点的循环链表==================\n");
    printf("头结点的data数据为:%d\n",list->data);
    LinkList p = list->link;
    while (p != list){
        printf("data: %d\n",p->data);
        p=p->link;
    }
    printf("==============带头结点的循环链表==================\n");
}

void DLINKPRINT4(DLinkList dlist){  //遍历不带头结点的双向循环链表
    printf("===============不带头结点的双向循环链表=================\n");
    printf("data: %d\n",dlist->data);
    DLinkList p = dlist->rlink;
    while (p != dlist){
        printf("data: %d\n",p->data);
        p=p->rlink;
    }
    printf("===============不带头结点的双向循环链表=================\n");
}

void DLINKPRINT5(DLinkList dlist){  //遍历带头结点的双向循环链表
    printf("===============双向循环链表=================\n");
    DLinkList p = dlist->rlink;
    while (p != dlist){
        printf("data: %d\n",p->data);
        p=p->rlink;
    }
    printf("===============双向循环链表=================\n");
}

void DLINKPRINT6(DLinkList2 dlist){  //链表双向循环链表 针对26题
    printf("===============双向循环链表=================\n");
    printf("data: %d,freq:%d\n",dlist->data,dlist->freq);
    DLinkList2 p = dlist->rlink;
    while (p != dlist){
        printf("data: %d,freq:%d\n",p->data,p->freq);
        p=p->rlink;
    }
    printf("===============双向循环链表=================\n");
}


int INSERTLINK5(LinkList list,int i , ElemType item){
    LinkList p , q ;
    int n = 1 ;
    q=list;
    while ( q != NULL && n <i){
        q=q->link;
        n++;
    }
    if( n != i || q==NULL){
        printf("链表不存在第i个链结点!");
        return -1;
    }
    p=(LinkList) malloc(sizeof (LNode));
    p->data=item;
    p->link=q->link;
    q->link=p;
    return 1;
}

1.已知长度为n的线性表A采用顺序存储结构。请写一算法,找出该线性表中值最小的数据元素,给出该元素在表中的位置。

//1.已知长度为n的线性表A采用顺序存储结构。请写一算法,找出该线性表中值最小的数据元素,给出该元素在表中的位置。
int LOCAL(ElemType arr[],int n){
    ElemType a;
    a=arr[0];
    int l = 0;
    for (int i = 1; i < n; ++i) {
        if(arr[i]<a) {
            a=arr[i];
            l=i;
        }
    }
    return l+1;
}

2.设计一个算法,用不多于3n/2的平均比较次数,在顺序表A[1…n]中分别找出最大值元素和最小值元素。

//2.设计一个算法,用不多于3n/2的平均比较次数,在顺序表A[1..n]中分别找出最大值元素和最小值元素。
int LOCALMAXANDMIN(ElemType arr[] , int n ){
    ElemType max,min;
    max=arr[0],min=arr[0];
    int count=0;
    for (int i = 1; i < n; ++i) {
        if(arr[i] > max) {
            max = arr[i];
            count++;
        }else if( arr[i] < min){
            min=arr[i];
            count +=2;
        } else count +=2;
    }
    return count;
}

3.已知长度为n的线性表A采用顺序存储结构,并假设表中每一个数据元素均为整型数据,请写出在该顺序表中查找值为item的数据元素的递归算法。

//3.已知长度为n的线性表A采用顺序存储结构,并假设表中每一个数据元素均为整型数据,请写出在该顺序表中查找值为item的数据元素的递归算法。
// 若查找成功,算法返回item在表中的位置,否则,算法返回信息-1。
int LOCAL3(int arr[] , int item, int l, int n ){
    if(l>=n) return -1;
    if(arr[l]==item) return l+1;
    LOCAL3(arr,item,l+1,n);
}

4.已知长度为n的线性表A采用顺序存储结构。请写出逆转该线性表的算法,

//4.已知长度为n的线性表A采用顺序存储结构。请写出逆转该线性表的算法,
// 即由A=(a,a2 ,…,an-1,a)产生A'=(an,an-1,…,a2,a1),要求在逆转过程中用最少的附加空间(用尽可能少的辅助变量)。
void INVERT4(ElemType arr[],int n){
    ElemType a;
    for (int i = 0; i <n/2; ++i) {
        a=arr[i];
        arr[i]=arr[n-i-1];
        arr[n-i-1]=a;
    }
}

5.已知长度为n的线性表A采用顺序存储结构,并且每个数据元素均为一个无符号整数,请写一算法,删除线性表中的所有奇数。

//5.已知长度为n的线性表A采用顺序存储结构,并且每个数据元素均为一个无符号整数,请写一算法,删除线性表中的所有奇数。
void DELETE5(unsigned int arr[],int *n){
    int d = -1;
    for (int i = 0; i < *n; ++i) {
        if(arr[i]%2 !=0)
            d++;
        else arr[i-d-1]=arr[i];
    }
    *n=*n-d-1;
}

6.已知长度为n的线性表A采用顺序存储结构。请写一时间复杂度为O(n)的算法,该算法删除线性表中原来序号为奇数的那些数据元素。

//6.已知长度为n的线性表A采用顺序存储结构。请写一时间复杂度为O(n)的算法,该算法删除线性表中原来序号为奇数的那些数据元素。
// ?这道题难道和上面那道题不一样吗?
void DELETE6(int arr[],int *n){
    int d = -1;
    for (int i = 0; i < *n; ++i) {
        if(arr[i]%2 !=0)
            d++;
        else arr[i-d-1]=arr[i];
    }
    *n=*n-d-1;
}

7.已知长度为n且按值有序排列的线性表A采用顺序存储结构。请写一算法,删除所有值大于x且小于y的数据元素。

//7.已知长度为n且按值有序排列的线性表A采用顺序存储结构。请写一算法,删除所有值大于x且小于y的数据元素。
void DELETE7(int arr[],int *n , int x ,int y){
    int d = -1;
    for (int i = 0; i < *n; ++i) {
        if(arr[i]>x && arr[i]<y)
            d++;
        else
            arr[i-d-1]=arr[i];
    }
    *n=*n-d-1;
}

8.请写一算法,通过键盘输人一系列数据元素,建立一个长度为n且不包含重复元素的线性表A。这里,设线性表A采用的存储结构为顺序存储结构,并且假设空间足够。

//8.请写一算法,通过键盘输人一系列数据元素,建立一个长度为n且不包含重复元素的线性表A。这里,设线性表A采用的存储结构为顺序存储结构,并且假设空间足够。
void CREATE8( int A[],int n ){
    int i = 0;
    int a ;
    while (i<n){
        scanf("%d",&a);
        int j ;
        for (j = 0; j < i ; ++j) {
            if(A[j]==a)
                break;
        }
        if(i==0 || (j==i && A[j] != a)){
            A[i++]=a;
        }
    }
}

9.已知线性表A与线性表B的长度分别为n与m,并且都采用顺序存储结构。请写一算法,在线性表A的第i个位置插入线性表B。约定:不考虑存储空间溢出问题。

//9.已知线性表A与线性表B的长度分别为n与m,并且都采用顺序存储结构。请写一算法,在线性表A的第i个位置插入线性表B。约定:不考虑存储空间溢出问题。
void INSERT9(ElemType arr1[],int *n, int i ,int m ,ElemType arr2[]){ // 这里暂时考虑 i 小于等于n
    int j;
    for (j= i; j < *n+1 ; ++j) {
        arr1[j+m-1]=arr1[j-1];
    }
    for (j=i;j<m+i;j++){
        arr1[j-1]=arr2[j-i];
    }
    *n=*n+m;
}

10.已知线性链表第1个结点的存储地址为list。请写一算法,把该链表中数据域值为d的所有结点的数据域值修改为item。

//10.已知线性链表第1个结点的存储地址为list。请写一算法,把该链表中数据域值为d的所有结点的数据域值修改为item。
void ALTER10(LinkList list, ElemType d ,ElemType item){
    LinkList p = list;
    while ( p != NULL){
        if( p->data == d )
            p->data=item;
        p=p->link;
    }
}

11.已知非空线性链表的第1个结点的指针为list,请写出删除该链表第i个结点的算法。

//11.已知非空线性链表的第1个结点的指针为list,请写出删除该链表第i个结点的算法。
void DELETE11(LinkList *list,int i){
    if(i==1){
        *list=(*list)->link;
    } else{
        LinkList r = *list;
        LinkList p = r->link;
        int count = 2;
        while ( p != NULL && count != i){
            r=p;
            p=p->link;
            count++;
        }
        if( p!=NULL && count == i){
            r->link=p->link;
            free(p);
        }
    }
}

12.已知非空线性链表第1个结点的存储地址为list,请写出删除链表中从第i个结点开始的(包括第i个结点本身)连续k个结点的算法。

//12.已知非空线性链表第1个结点的存储地址为list,请写出删除链表中从第i个结点开始的(包括第i个结点本身)连续k个结点的算法。
void DELETE12(LinkList *list,int i , int k ){ // *list 的原因是方式i是从第一个节点开始删除
    int count = 1;
    LinkList r , p= *list ;
    while ( p != NULL && count != i+k-1){ // 外层循环控制p到达要删的最后一个节点,即第i+k-1个节点
        while (count < i){   //内循环使p到达要删除的第一个节点,r是p的前驱节点
            r=p;
            p=p->link;
            count++;
        }
        p=p->link;
        count++;
    }
    if(p==NULL){
        printf("已超链表长度");
    } else if(i==1)
        *list = p->link;
    else
        r->link= p->link;
}

13.已知线性链表第1个结点指针为list。请写一算法﹐删除链表中数据域值最大的结点。

//13.已知线性链表第1个结点指针为list。请写一算法﹐删除链表中数据域值最大的结点。
void DELETE13(LinkList *list) {  // *list 防止第一个位置是最大的节点 , 此算法如果最大值多个,也只能删掉一个
    LinkList p = *list , q = *list, r ,s  ; // q用来保存数值域最大的那个结点,初始值为第一个节点,r为q的前驱节点,s为p的前驱节点
    while ( p != NULL){
        if( p->data > q->data) // 如果当前节点比最大结点大,则将当前节点赋给最大节点。
        {
            r = s; //设置s的目的是为了,在保存最大值节点的同时,能保存最大值的前驱节点,设置r的目的是为了便于单链表删除q最大值节点
            q = p;
        }
        s = p ;
        p = p->link;
    }
    if( q == *list ) // 如果最大节点是第一个节点
        *list=(*list)->link;
    else{
        r->link=q->link;
    }
}

14.已知线性链表第1个结点指针为list。请写一算法,判断该链表是否是有序链表(结点是否按照数据域值的大小链接),若是,算法返回1,否则,算法返回0。

//14.已知线性链表第1个结点指针为list。请写一算法,判断该链表是否是有序链表(结点是否按照数据域值的大小链接),若是,算法返回1,否则,算法返回0。
int ISORDER14(LinkList list){ // 此算法中设置两个int变量,来辅助判断是否有序
    int a =1 , b =1;
    LinkList p=list , q=list->link ; //p为q的前驱结点
    while (q != NULL) {
        a = b ; // a保存的是前两个数的差
        // b保存的是当前两个数的差,如果前后两个数一样,差为0,则b的值赋1,防止下面0乘任何数都是0
        b = (q->data - p->data) ?  (q->data - p->data): 1 ;
        if(a*b < 0 ) return 0; // 如果异号,则不是有序链表
        p = q ;
        q=p->link;
    }
    return 1;
}

15.已知线性链表第1个链结点指针为list。请写一算法,交换p所指结点与其下一个结点的位置(假设p指向的不是链表中最后那个结点)。

void SWAP15(LinkList *list , LinkList p){ //*list 防止p是第一个结点
    LinkList l , r=*list , q=(*list)->link ; // r是为了找到p结点的前驱节点 ,q遍历
    if(p == *list){
        r->link=q->link;
        q->link=r;
        *list=q;
    } else {
        while (q != NULL && q != p) {
            r = q;
            q = q->link;
        }
        if( q != NULL){   // 假设此时的顺序是 r-q-f-g
            r->link=q->link;  // 将r指向q的下一个节点 r-f-g , q-f-g
            q->link=q->link->link; // q指向q的节点的下一个节点 r-f-g,q-g
            r->link->link=q; // 将r的下一个节点指向q   r-f-q-g 完成互换
        }
    }
}

16.已知非空线性链表第1个结点由 list 指出。请写一算法,将链表中数据域值最小的链结点移到链表最前面。

//16.已知非空线性链表第1个结点由 list 指出。请写一算法,将链表中数据域值最小的链结点移到链表最前面。
void SWAPMIN16(LinkList *list){ //先找到最小的节点
    LinkList q , r , p , l ; // q 保存最小的节点,r保存q的前驱节点,p遍历节点,l保存的是p的前驱节点
    p=*list,q = *list; // q的初始节点是第一个节点
    while ( p != NULL){ //查找最小的节点
        if(p->data < q->data){
            r=l;
            q=p;
        }
        l=p;
        p=p->link;
    }
    if( q != *list ){
        r->link=q->link;
        q->link=(*list);
        *list=q;
    }
}

17.(2009年硕士研究生入学考试计算机专业基础综合全国联考试题)
请写一算法,该算法用尽可能高的时间效率找到由list所指的线性链表的倒数第k个结点。 若找到这样的结点,算法给出该结点的地址;否则,算法给出信息NULL。
限制:算法中不得求出链表的长度,也不允许使用除指针变量和控制变量以外的其他辅助空间。

/*
17.(2009年硕士研究生入学考试计算机专业基础综合全国联考试题)
请写一算法,该算法用尽可能高的时间效率找到由list所指的线性链表的倒数第k个结点。 若找到这样的结点,算法给出该结点的地址;否则,算法给出信息NULL。
限制:算法中不得求出链表的长度,也不允许使用除指针变量和控制变量以外的其他辅助空间。
*/
//初步想法是递归,递归是其他的辅助空间吗?其次是设置一个count计数;
LinkList RECIPROCAL17(LinkList list , int k){
    LinkList p , r ;
    int count = 0 ; //count 代表r和p相差的结点数
    p=list,r=list;
    while (p != NULL){
        if(count >= k )  //设置count计数的目的是让r和p始终悬殊k个节点,当p等于NULL时,r就是倒数第k个节点
            r=r->link;
        count++;
        p=p->link;
    }
    if(count >= k)
        return r;
    else
        return NULL;
}

18.设线性表X=(x1,x2,x3,…,xn)与Y=(y1,y2,y3,…,ym)都采用链式存储结构(链表第1个结点的指针不妨分别用X和Y表示)。试写一个算法合并这两个线性链表为一个线性链表,使得 X 和 Y 每个元素交叉排列

//18.设线性表X=(x1,x2,x3,…,xn)与Y=(y1,y2,y3,…,ym)都采用链式存储结构(链表第1个结点的指针不妨分别用X和Y表示)。
// 试写一个算法合并这两个线性链表为一个线性链表,使得 X 和 Y 每个元素交叉排列
LinkList MERGE18(LinkList list1,LinkList list2){
    LinkList p=list1 , q=list1->link ,r=list2 ; // 初始p指向list1的第一个节点
    int count = 0 ;
    while (q != NULL && r != NULL){  // 两个链表都没有遍历完
        if(count %2 ==0){  // count的计数器是为了两个链表轮流差入
            p->link=r;
            p=r;
            r=r->link;
        } else{
            p->link=q;
            p=q;
            q=q->link;
        }
        count++;
    }
     p->link = q ? q : r; //最后把非空剩余的链表插入
    return list1;
}

19.已知线性链表第1个结点的指针为 list。请写一算法,删除数据域值相同的多余结点,即若链表中有多个结点具有相同的数据域值,只保留其中一个结点,其余结点均从链表的最后删去﹐使得到的链表中所有结点的数据域值都不相同。

/*
 * 19.已知线性链表第1个结点的指针为 list。请写一算法,删除数据域值相同的多余结点,即若链表中有多个结点具有相同的数据域值,
只保留其中一个结点,其余结点均从链表的最后删去﹐使得到的链表中所有结点的数据域值都不相同。
 */
void DISTINCT19(LinkList list){
    LinkList p=list->link , q=list, r=list  ;
    int flag = 1 ;
    while ( p!=NULL ){  // 外层的循环是控制每个节点都和   此节点之前的数据进行比较(即内层循环的那些节点)
        while (q != p){ // 内存的循环是依次遍历首结点到p结点之间有无相等数据
            if( p->data == q->data){
                r->link=p->link;
                flag = 0 ; // 设置flag的目的是判断下次循环p是从哪个节点开始
                free(p); //释放
                break; // 重复元素都已经删除了,就没必要再往下循环了,跳出内循环
            }
            q=q->link;
        }
        q=list;  //重置内层的q的节点为起始结点
        if(!flag){ //如果删除元素了,则r的节点不变,p的节点是r的下一个节点
            p=r->link;
        } else{ //如果没删元素,则r后移,p后移,r是p的前驱节点
            r=p;
            p=p->link;
        }
        flag=1; // 重置flag ,开始下一次循环
    }
}

20.请写一算法,依次输出通过键盘输人的一组整型数据中的最后k个元素。约定;以Ctrl+z作为键盘输入的结束, 并假设k≤输入的数据元素的个数。 限制;算法中不允许使用数组,也不允许有计算输入数据个数的过程。

21.已知一个不带头结点也无头指针变量,并且长度大于1的循环链表。请写一算法﹐删除p所指链结点的直接前驱结点。

//21.已知一个不带头结点也无头指针变量,并且长度大于1的循环链表。请写一算法﹐删除p所指链结点的直接前驱结点。
void DELETE21(LinkList p){
    LinkList  q , r ;
    q = p ;
    while ( q->link != p){ // 遍历循环链表,找到p结点的直接前驱节点,魂环结束后q节点就是p的直接前驱节点。
        r=q;  // 要删除p的前驱节点,除了找到p节点的直接前驱节点外,还要知道p节点的直接前驱节点的前驱节点r
        q=q->link;
    }
    r->link=p;
}

22.请写出将一个线性链表(第1个结点的存储地址为list)分解为两个循环链表,并将两个循环链表的长度存放在各自的头结点的数据域中的算法。
分解规则:若线性链表中某一链结点属于第1个循环链表,则下一个链结点就属于第2个循环链表;反之,若线性链表中某一个链结点属于第⒉个循环链表,则下一个链结点就属于第1个循环链表。

/*22.请写出将一个线性链表(第1个结点的存储地址为list)分解为两个循环链表,并将两个循环链表的长度存放在各自的头结点的数据域中的算法。
分解规则:若线性链表中某一链结点属于第1个循环链表,则下一个链结点就属于第2个循环链表;
反之,若线性链表中某一个链结点属于第⒉个循环链表,则下一个链结点就属于第1个循环链表。*/
void SPLIT22(LinkList list , LinkList list1 ,LinkList list2){  // 这里,先考虑把分成的两个魂环链表当做参数传入的方式
    LinkList p = list , q = list1 , r = list2;
    int count1 = 0 ,count2=0; //count1表示list的链表总数,和count2分别表示第二个链表的个数,count1辅助判断结点该插往哪个链表中
    while (p!=NULL){
        if(count1 % 2 == 0){
            q->link=p;
            q=p;
        } else{
            r->link=p;
            r=p;
            count2++;
        }
        count1++;
        p=p->link;
    }
    //最后分别将两个循环链表的最后一个节点指向头结点,并将链表长度写入头结点的data中;
    q->link=list1;
    r->link=list2;
    list1->data=(count1-count2);
    list2->data=count2;
}

23.已知带头结点的循环链表的头结点指针为list,请编写一个逆转链表链接方向的算法。

//23.已知带头结点的循环链表的头结点指针为list,请编写一个逆转链表链接方向的算法。
void INVERT23(LinkList list){ // 逆转循环链表的思路与逆转单向链表的思路一样
    LinkList p , r , q = list;  // q初始值为list,这样就保证了最后一个节点指向头结点,
    p=list->link;
    while (p != list){
        r=p;
        p=p->link;
        r->link=q;
        q=r;
    }
    // 循环结束后不包括头结点的链表逆转结束。再将逆转后的链表q链表到链表上
    list->link=q;
}

24.已知非空线性表(a1,a2,…,an-1,an)采用仅设置了末尾结点指针的单向循环链表作为存储结构(设末尾结点指针为rear), 请写一算法,将线性表改造为(a1,a2,…,an-1,an,an-1,…,a2,a1)。 要求:改造后的线性表依然采用仅设置末尾结点指针的单向循环链表存储,并且算法中只能出现一个循环。

/*
 * 24.已知非空线性表(a1,a2,…,an-1,an)采用仅设置了末尾结点指针的单向循环链表作为存储结构(设末尾结点指针为rear),
 * 请写一算法,将线性表改造为(a1,a2,…,an-1,an,an-1,…,a2,a1)。
 * 要求:改造后的线性表依然采用仅设置末尾结点指针的单向循环链表存储,并且算法中只能出现一个循环。
 * */
//单向循环链表的尾节点和头结点貌似没什么区别,因为是单向循环
// 因为是单向链表,所以等于将链表进行扩充,这种解题思路可以理解成新增一个链表,使其是原始链表的逆转链表,最后两个链表再连接到一起就可以了
void ALTER24(LinkList rear){
    LinkList p ,  q ,r,list=NULL ; //list是一个新的链表
    p=rear->link;
    while (p->link!= rear ){ //循环遍历的同时将当前节点加在list节点的首端,当p是最后一个节点时,退出循环
        q=(LinkList) malloc(sizeof (LNode));
        q->data = p->data;
        if(list == NULL)
            list=q;
        else
            q->link=r;
        r=q;
        p=p->link;
    }
    p->link=r; //此时p是最后一个节点,r是list节点的头结点,将两个链表相连
    list->link=rear; //list节点指向原本节点的尾节点,两个节点连成一个新的单向循环链表
}

26.已知不带头结点的双向链表第1个结点的指针为list,链结点中除了数据域和分别指向该结点直接前驱结点和直接后继结点的指针域外, 还设置了记录该结点被访问的次数的频度域freq(初始值为0)。请设计一个算法LOCATE(list,x), 该算法的功能是每当在此链表上进行一次LOCATE(list,x)操作,数据信息为x的结点的freq域的值增1,* 并且保持链表中链结点按freq域值递减链接,以使得频繁被访问的链结点靠近链表的前端。

//这道理的解题思路是每访问一次数据域为x的结点后,将freq加1,并将这个结点重新排序
//本题没有说明,这个结点数据域全不相等,因此下面的解题是按照数据域有可能有多个一样并且初始的排列顺序比较散
void LOCATE26(DLinkList2 *list , ElemType item){ //*list的原因是有可能头结点被替换
    DLinkList2 p = *list , q , r = *list,w ;
    if(p->data == item) //如果是访问的数据域和头结点一样,则头结点的freq加1
        (p->freq)++;
    p=p->rlink; // 指向下一个节点,遍历整个链表,看是否还有数据域为item的节点
    while ( p != r) {  //r始终是头结点位置,即使头结点被刷新,当p再次指向头结点时,循环遍历结束
        q = p->llink;  
        w = p->rlink;
        if (p->data == item) { //把链表中所有data值为item的都刷新freq
            (p->freq)++;
            if (p->freq > q->freq) {  // p的freq值刷新后如果大于前面节点,就进入下面的代码,否则不进入后移p遍历下一个结点
                q->rlink = p->rlink; //p的freq的值大于前面的节点,则将p从当前连接中删除,即p的上一个结点和下一个结点相连
                p->rlink->llink = q; // 删除p的原因是,此时这个位置已经不适合p待了,得搬家
                while (p->freq > q->freq && q != r) { //这个循环的目的是使p找到合适的插入位置
                    q = q->llink; // q不断的前移,直到移动到p的freq不再大于q的freq,或者是移动到头结点
                }
                //上面循环结束之后,需要先判断p的结点的freq是否大于头结点的freq,如果大于就说明上面的while循环是q到达头结点而退出的
                if (p->freq > r->freq) {  //将p插入到头结点前
                        r->llink->rlink = p; 
                        p->llink = r->llink;
                        r->llink = p;
                        p->rlink = r;
                        r = p;
                        *list = r;  //此时头结点已经不是之前的头结点了,需要更换头结点的地址
                } else { //进入这个条件说明上面while循环结束的循环是p的freq不再大于q的freq,即p待插入的地址是q的后面
                    q->rlink->llink = p;
                    p->rlink = q->rlink;
                    q->rlink = p;
                    p->llink = q;
                }
            }
        }
        p=w; //w的作用是每次执行过后,p节点都能重新的指向原本链表的下一个节点。所以设置w至关重要
    }
}

27.已知带有头结点的双向循环链表中头结点的指针为list,请写出删除并释放数据域内容为x的所有结点的算法。

/*
 * 27.已知带有头结点的双向循环链表中头结点的指针为list,请写出删除并释放数据域内容为x的所有结点的算法。
 */
void DELETE27(DLinkList list,ElemType x){
    DLinkList p = list->rlink,r;
    while (p != list){
        r=p;// r的作用是当删除数据域为x的节点并释放后,p能再次的指向删除节点的下一个节点
        if(p->data == x){
            p->llink->rlink=p->rlink;
            p->rlink->llink=p->llink;
            free(p);
        }
        p=r->rlink;
    }
}

28.已知不带头结点的双向循环链表第1个结点指针为list,请写一算法﹐判断该链表是否为对称链表, 即前后对应结点的数据信息相同。对称返回1,否则返回0。

/*
 * 28.已知不带头结点的双向循环链表第1个结点指针为list,请写一算法﹐判断该链表是否为对称链表,
 * 即前后对应结点的数据信息相同。对称返回1,否则返回0。
 * */
int symmetry28(DLinkList list){
    DLinkList p=list,q=list->llink;  // p从右边遍历,q从左边遍历
    while (p!=q && p->rlink != q){ // 当链表为奇时,p和q会在同一个节点相遇,即p==q时退出循环,当链表为偶相遇时,p的下一个右节点等于q或者q的下一个左节点等于左。
        if(p->data != q->data ) return 0; //如果碰到 p != q的返回0;
        p=p->rlink;
        q=q->llink;
    }
    return 1; //顺利执行完,则表示都相等,返回1
}

29.请写一算法,该算法的功能是先通过键盘输入n个整型数据,建立一个带有头结点的双向循环链表,然后按照与输入相反的次序依次输出这n个整型数据。

/*29.请写一算法,该算法的功能是先通过键盘输入n个整型数据,建立一个带有头结点的双向循环链表,
 * 然后按照与输入相反的次序依次输出这n个整型数据。
 * */

void SCANFPRINTF29(int n){// 这道题简单,先从头结点的右节点,以此建立链表,再从头结点的左侧开始以此遍历左节点
    DLinkList dlist, p ,q ;
    dlist=(DLinkList) malloc(sizeof (DNode));
    p=dlist;
    int a ;
    for (int i = 0; i < n; ++i) {
        q=(DLinkList) malloc(sizeof (DNode));
        scanf("%d",&a);
        q->data=a;
        p->rlink=q;
        q->llink=p;
        p=p->rlink;
    }
    p->rlink=dlist;
    dlist->llink=p;

    printf("相反的次序输出\n");
    int i = 0 ;
    while (p != dlist){
        printf("data%d:%d\n",++i,p->data);
        p=p->llink;
    }
}

30.已知带头结点的双向循环链表头结点指针为list,除头结点外的每个链结点数据域值为一个整数。请写一算法,将链表中所有数据域值大于0的结点放在所有数据域值小于0的结点之前。 若链表中除头结点外没有其他结点,算法返回0,否则,算法返回1。

int   ALTER30(DLinkList Dlist){
    DLinkList r = Dlist, q=Dlist,l ,  p = Dlist->rlink; //
    if(p == Dlist) return 0;  // 若链表中除头结点外没有其他结点,算法返回0
    while ( p != Dlist){ //循环遍历这个链表的每个结点进行比较
        if(p->data > 0){  // 如果当前节点大于0就放在头结点后面
            r->rlink=p;
            p->llink=r;
            p=p->rlink; // p节点后移,使遍历全部结点
            r=r->rlink; // r后移,便于下一个大于0的节点插在后面
        } else {  //如果当前结点不大于0就放在头结点前面(所谓头结点前面,就是这个循环链表相对于头结点的末尾结点)
            q->llink=p; 
            l = p;  // l的作用是保存p的结点,因为下一步p的节点将后移
            p=p->rlink; //这一步必须放在下一步前面,否则原来p节点的下一节点将被覆盖,使其遍历的下一节点不是原本链表的下一节点
            l->rlink=q; //l的左右就是当p节点后移之后,将当前节点连接到左端
            q=l; //q=l,使q一直保持头结点的最前面待插入的结点
        }
    }
    r->rlink=q; //最后将相对于头结点左侧的结点和右侧的结点相连使其再次成为完整的循环链表
    q->llink=r;
    return 1;
}

顺序表的基本操作 一、实验目的: 1、复习C语言程序设计中的知识。 2、掌握线性表的顺序存储结构的表示和实现方法。 3、掌握顺序表基本操作的算法实现。 二、实验内容: 1.建立顺序表。 2.在顺序表上实现插入、删除和查找等操作。 三、实验要求: 1、编写实现顺序表的基本算法(初始化、查找、插入、删除等)的函数,并在此基础上设计一个主程序完成如下功能: ⑴初始化一个顺序表L,数据元素类型可任选; ⑵建立顺序表L,要求数据元素至少10个; ⑶输出顺序表L的长度; ⑷按位置查找:输出顺序表L的第i个 阅读详情

相关推荐

2019上海科技大学991数据结构与算法

文章目录 1.在循环链表中,某些链接域可能为空( )

帅气廖鹏飞 6647

《简明数据结构》链表专题编程测验题7——克隆单链表

试题描述 从键盘顺序输入不少于3个整数,存储在单链表中。然后将该单链表进行克隆,把克隆产生的新链表链接到原来的单链表后面。要求打印出复制之前的单链表和复制之后的单链表。 样例输入 1 2 3 4 5 6样例输出 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6语言 C思路分析 1. 利用尾插法建立一个带头结点的单链表,套用尾插法建立带头结点的单链表模板; LinkList CreateFromTail1() /*将新增的字符追加到链表的末尾*/ { LinkList L;

Raider1的博客 418

STM32与FreeRTOS:基于TIM6的高精度系统时间获取实践

本文详细介绍了在STM32与FreeRTOS环境下,基于TIM6定时器实现高精度系统时间获取的实践方法。通过复用FreeRTOS的TIM6硬件资源,开发者可以高效获取毫秒级和微秒级系统时间,同时解决时间溢出和中断处理等关键问题。文章还提供了CubeMX配置技巧、代码实现及性能优化建议,适用于嵌入式系统开发中的精确时间管理需求。

weixin_29169505的博客 357

c语言数据结构线性链表的结点移动

请写一算法,将该链表中数据域值最大的那个点移到链表的最后面。(假设链表中数据域值最大的链结点惟一)(注意:要求先写出算法的解题思路,然后再写出算法)输入为一个整数序列,整数之间以空格隔开,序列以回车结尾,输入-1结束(假设链表中吴数据-1)。输出为移动后的整数序列,整数之间以空格隔开,序列以回车结尾。已知非空线性链表第1个链结点指针为list,链结点构造为。

m0_74297053的博客 913

【WILEY】从Revision到Online:一次投稿的完整状态演进与关键节点实战解析

本文详细解析了从Revision到Online发表的完整投稿流程,包括修改稿准备、回复信撰写、状态跟踪等关键节点。特别针对Wiley期刊,提供了实用的操作技巧和常见问题解决方案,帮助作者高效完成论文修改与发表。

weixin_29219189的博客 361

Snort源代码编译 _ 采坑之旅(for Windows VS2015)

    系统环境:Windows7 sp1 x64     编译环境:VS2015 SP1     Snort版本:2.9.12     daq版本:2.0.6     Snort官网:https://www.snort.org/downloads#snort-downloads 背景     最近需要实现一个类似网络防火墙的产品,主要参考Snort源码,先花了点时间简单读了下网上比较流行的《...

magictong的专栏 8888

北航991——顺序表和链表

北航991专业课数据结构与算法分析的顺序表和链表相关知识点。

m0_56709616的博客 365

PCRNet: Point Cloud Registration Network using PointNet Encoding

PCRNet算是在ModelNet40这种object-centric数据集上用deep-learning做配准最好入手的一篇文章了,整体架构涉及简洁明了,一句话描述就是简单粗暴,话不多说,直接上网络架构图: Work Flow: 首先对输入source (N×3N \times 3N×3)与template (M×3M \times 3M×3)进行PointNet操作,即MLP + max-pooling后,分别得到描述各自点云的维度为1024的global feature vector:Φ(PS).

dloading7的博客 1646

北航991——栈和队列相关知识点

根据北航991专业课的考纲,总结了栈和队列的常考角度

m0_56709616的博客 1433

盘点军工行业软件研发的那些常用GJB标准

GJB5000、2786、438、141、102、8114等...

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 9436

[Python图像识别] 五十二.水书图像识别 (2)基于机器学习的濒危水书古文字识别研究

上一篇文章详细讲解如何利用数据增强方法实现图像数据集的扩充,并以濒危水书作为案例讲解。这篇文章将详细讲解基于机器学习的水书图像识别方法,以图像像素统计为特征开展图像分类讲解,这是最基础的方法,也为后续深度学习图像分类描述提供支撑。基础性文章,希望对您有所帮助!让我们开始吧,且看且珍惜。

杨秀璋的专栏 989

数据结构之树与二叉树

北航软件工程专业考研991数据结构总结: 五、树与二叉树 1.树与二叉树的基本概念,基本特征、名词术语; 2.完全二叉树与满二叉树的基本概念,二叉树的基本性质及其应用; 3.二叉树的顺序存储结构与二叉链表存储结的基本原理; 4.二叉树的前序遍历、中序遍历、后序遍历和按层次遍历,重点是二叉树在以二叉链表作为存储结构基础上各种遍历算法(包括非递归算法)的设计与应用; 5.二叉排序树的基本概念、建立(...

my博客 869

【微服务】Java 对接飞书多维表格使用详解

Java 对接飞书多维表格使用详解

congge_study的博客 1万+

考研初试总结

考研风雨路 我是一名山东的考生,来自山东理工大学。今年报考的院校是北京航空航天大学21系软件学院,报考专业:(085212)软件工程(专硕)。 刚考完初试一周,心里开始忐忑不安,前几天我鼓起了勇气,估个下分,总体感觉发挥的很一般,看最后成绩吧。下面我按照专业课,数学,英语,政治的顺序来说一下我的答题情况。 专业课:个人感觉今年(2017)专业课难度适中吧。考场上拆开专业课试题信封大体浏览了下

flyljg的专栏 779

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

单链表基本操作(C语言)

目录 一、链表的介绍 二、单链表的实现 1、定义单链表 2、接口函数 1)打印函数 2)创建结点 3)尾插 4) 头插 5) 尾删 6)头删 7) 查找 8) 修改 9) 指定位置前插入 10)删除指定位置节点 11)指定位置后插入节点 12) 删除指定位置后的节点 首先我们回顾一下线性表的两种存储方式--顺序存储和链式存储 在中已经讲解过了顺序存储的方式,对于顺序表的优缺点总结来说就是,查找方便,增删复杂。 而链表...

weixin_65132948的博客 7888

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

实验A—1 顺序表基本操作

内容: 建立n个元素的顺序表,实现相关的操作:输出,插入,删除,查找等功能。 操作: 本题意在熟悉顺序表的基本操作,故不进行额外功能拓展,仅实现列出功能。 以下为实现代码:

ifstream的博客 756

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

02_线性表-2

数据结构

qq_35231482的博客 924

记数据结构第三次书面作业的一些算法题

线性表练习 文章目录线性表练习2-112-212-252-28 2-11 试编写一个函数,以不多于3n/2的平均比较次数,在一个有n个整数的顺序表A中找出具有最大值和最小值的整数。 这个题我第一眼看到,感觉是快排,但是仔细想了一下,发现暴力就可以过,如下: void maxmin(int *a,int n) { int maxn=a[1]; int minn=a[1]; f...

soul_mingling的博客 705

【数据结构】 单链表的简单理解和基本操作

前言:本章主要内容是数据结构中的单链表。 文章目录1.为什么需要链表?1.1顺序表的缺陷1.2链表逻辑结构如下:1.3物理结构如下:1.4顺序表和单链表物理结构的对比:2.单链表的代码实现2.1 定义单链表思考下为何使用typedef?2.2 单链表的空间开辟2.3 单链表的尾插实现思路:错误程序:上述尾插代码有错误,思考下哪里出现bug?修改后程序2.4单链表的头插2.5单链表的数据打印2.6 单链表的尾删2.7 单链表的头删2.8 单链表的长度查找2.9 单链表的判空操作2.10 单链表的值查找操作

林慢慢的博客 3642

通过键盘输入建立单链表

建表:通过键盘输入链表中的数据,不同数据以空格为间隔,遇到回车则停止输入。操作:输入指定数值,在单链表中删除与指定值相等的结点,并输出最终链表。

qq_45716514的博客 978

数据结构入门题目

初步入门数据结构

一只菜鸟 832

设计一个算法:用不多于3n/2的平均比较次数,在数组A[1,...,n]中找出最大值和最小值的元素

如果在查找出最大值和最小值的元素时各遍历一遍所有元素,至少需要比较2n次,所以用一遍遍历找出最大值和最小值的元素。 void maxmin(int A[],int n) { int i; int max,min; max=A[1]; min=A[1]; for(i=2;i&lt;=n;i++) { if(A[i]&gt;max) ...

F_aF_a的博客 5137

数据结构:设计一个算法:用不多于3n/2的平均比较次数,在一个有n个整数的顺序表中找出最大值和最小值的元素

题目: 设计一个算法:用不多于3n/2的平均比较次数,在一个有n个整数的顺序表中找出最大值和最小值的元素 出错原因: 当初,想的是分别设一个max=min=data[0],然后求最大值最小值的时候,分别遍历顺序表,但是这样的比较次数为2n,因此排除了,然后想用If与else if,直接将max和min与data[j]比较,然后当时觉得,这平均次数也是2n,其实并不是,因为是if和else if 两个分支只能执行一个,不可以同时执行的。 正确思路: 用If和else if ,将max和min 分别和data[

Warddamn的博客 3413

已知长度为n的线性表A采用顺序存储结构,请写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法可删除线性表中所有值为item的数据元素。

#include <iostream> using namespace std; //顺序表的存储结构 #define MAXSIZE 100 //顺序表可能达到的最大长度 typedef int ElemType; //自定义数据元素类型 typedef struct { ElemType *elem; //存储空间的基地址 int length;...

abtgu的博客 1万+

【吉大刘大有数据结构绿皮书】已知长度为n的线性表A采用顺序存储结构,写一算法,删除该线性表中所有值为item的数据元素。

已知长度为n的线性表A采用顺序存储结构,写一算法,删除该线性表中所有值为item的数据元素。

随手写写 6149
上一篇: 关于递归回溯算法的案例(8皇后问题案例)
dbbigdata
博客等级 码龄7年 8粉丝 5原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值