回 帖 发 新 帖 刷新版面

主题:能不能给我一个完整的线性表程序看看

我学了两个多月数据结构,最最简单的线性表怎么初始化我都不懂,上课老师老是讲什么算法,似乎看懂,可到自己上机时,往往无从下手……
请给我一个完整的程序(能够运行),简单一点,让我看看,那些功能具体是怎么实现的。

回复列表 (共11个回复)

沙发

找本基础的书看看吧,从最简单的学期,先学理论~

#include <stdio.h>
#define N 6

int main(void)
{
    int a[N];
    int i;
    
    for(i = 0; i < N; i++)
    {
        scanf("%d", &a[i]);
    }
    
    for(i = 0; i < N; i++)
    {
        printf(" %d", a[i]);
    }
    
    getch();
}

板凳

噢!补充一点,我想要个有关线性表操作的程序,比如那些基本的初始化,插入,删除,置换元素等等功能。
这些算法我看了,似乎懂了,但是写成程序去实现时却一头雾水。麻烦写个程序我看看。不胜感激!!

3 楼


#include <stdio.h>
#include <stdlib.h>

#define ElemType int

typedef struct lnode{
    ElemType  date;
    struct lnode *next;
}lnode,*linklist;


linklist initlist(void){                  //链式表的初始化函数

    linklist head;
    linklist p,q;
    ElemType flag;

    p=(linklist)malloc(sizeof(struct lnode));
    head=q=p;

    if(!p){
        printf("ERROR!\n");
        exit(0);
    }

    scanf("%d",&p->date);
    flag=p->date;
    p->next=NULL;
    
    if(flag==0){exit(0);}

    while(flag!=0){
        p=(linklist)malloc(sizeof(struct lnode));

        if(!p){
            printf("ERROR!\n");
            exit(0);
        }

        scanf("%d",&p->date);
        flag=p->date;
        if(flag==0){break;}    
        else{
            q->next=p;
            q=p;
            p->next=NULL;
        }

    }

    return(head);
}



linklist insert(linklist head,int i,ElemType e){        //插入元素函数
    linklist p1,p2,q;
    p1=head;

    if(1==i){
        q=(linklist)malloc(sizeof(struct lnode));
        q->date=e;
        q->next=p1;
        head=q;
    }

    else{
        while(i!=1&&p1!=NULL){
            p2=p1;
            p1=p2->next;
            i--;
        }

        if(p1==NULL&&i!=1){
            printf("ERROR!");
        }

        if(i==1){
            q=(linklist)malloc(sizeof(struct lnode));
            q->date=e;
           
            p2->next=q;
            q->next=p1;
        }
    }

    return(head);
}



4 楼


void print(linklist head){                   //输出函数
    linklist p;
    for(p=head;p!=NULL;p=p->next){
        printf("%d  ",p->date);
    }
}


void lisedel(linklist head){
    linklist p1,p2;
    int i;
    scanf("%d",&i);          //输入要删除的元素的位置

    p1=head;

    if(1==i){
        head=p1->next;
        //free(p1);
    }

    else{
        while(i!=1&&p1!=NULL){
            p2=p1;
            p1=p2->next;
            i--;
        }

        if(p1==NULL&&i!=1){
            printf("ERROR!");
        }

        if(i==1){
            p2->next=p1->next;
            free(p1);

        }
    }

}


linklist nizhi(linklist head){      //逆置线型表
    linklist p1,p2,p3,tail;

    tail=head;
    p1=head;
    p2=p1->next;
    p3=p2->next;

    tail->next=NULL;

    while(1){
        p2->next=p1;
        p1=p2;
        p2=p3;
        p3=p3->next;
        if(p3==NULL){
            head=p2;
            p2->next=p1;
            break;
        }
    }

    return head;

}






int main(){
    printf("                    单链顺序表\n");
    linklist head;
    int i=1,flag=0;
    ElemType e;



        while(i!=0){
        printf("\n请选择所要进行的操作:\n");
        printf("         0.初始化链式线型表(以输入0结束)\n");
        printf("         1.插入新的元素\n");
        printf("         2.删除所选的元素\n");
        printf("             3.逆置链式线型表\n");
        printf("         4.输出表中的现有元素\n");

        printf("请选择:");
        scanf("%d",&i);

        switch(i){
        case 0: printf("请输入初始化的元素:\n");
                head=initlist();
                i=1;flag=1;break;
        case 1:    if(flag==1){
                    printf("输入要插入的位置和值:\n");
                    scanf("%d%d",&i,&e);              //输入要插入的位置和值
                    head=insert(head,i,e);            //插入新的元素
                }
                else {
                    printf("             ERROR,请先选择0初始化链表!");
                }

                i=1;break;
        case 2:    if(flag==1){
                    printf("输入要删除的元素的位置:\n");
                    lisedel(head);
                }
                else {
                    printf("             ERROR,请先选择0初始化链表!");
                }
                i=1;break;
        case 3: if(flag==1){
                    head=nizhi(head);
                    printf("逆置成功!");
                }
                else {
                    printf("             ERROR,请先选择0初始化链表!");
                }
                i=1;break;
        case 4:    if(flag==1){
                    print(head);
                }
                else {
                    printf("             ERROR,请先选择0初始化链表!");
                }
                i=1;break;
        }
    }

    return 0;
}

5 楼

听老师讲个屁!数据结构的课我都很少去上.
上课会使迟钝,知道吗?特别是编程这种事,不要听别人是怎么,不要看别人是怎么编,自己想,想怎么编就怎么编,想怎么想就怎么想,当实在想不出来,或想看看自己想得好还是别人想的好的时候再去看别人的程序.......自己不肯动脑袋想,只看别人的程序,只会越看越无聊,越学越不爽.

6 楼

噢!!或者上面的朋友说得对!!谢谢指教!

7 楼

请问上面的程序分别用inklist 和lnode 定义的变量有什么不同?

8 楼

初学者 还是多看看书,多模仿着写程序,在写的过程中,会慢慢的提高的。

9 楼

真理啊 以后多多实践喽

10 楼

看程序不一定没有用,多看看他人程序,学习他人的思想有助于自身的提高!!!
当然自己动手也要勤,不要怕不会,多尝试!!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册