| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 532 人关注过本帖
标题:情帮忙解释一个问题
只看楼主 加入收藏
冥卫
Rank: 8Rank: 8
来 自:深山老林
等 级:蝙蝠侠
帖 子:280
专家分:772
注 册:2010-4-20
结帖率:88.89%
收藏
已结贴  问题点数:20 回复次数:6 
情帮忙解释一个问题
我总是对链表这方面不怎么理解,希望大侠帮我解释一下关于这方面的知识,谢谢
搜索更多相关主题的帖子: 解释 
2010-05-17 20:57
NoSoul
Rank: 9Rank: 9Rank: 9
来 自:沈阳化工大学
等 级:蜘蛛侠
帖 子:283
专家分:1010
注 册:2009-6-6
收藏
得分:10 
就是一个链子,通过指针指向下一个节点,但由于有指针,于是两个节点就能连起来了,于是N个节点就能连起来了,于是就形成链表了

我想伸手拉近點,竟觸不到那邊,就欠一點點,但這一點點...卻好遠
2010-05-17 21:01
冥卫
Rank: 8Rank: 8
来 自:深山老林
等 级:蝙蝠侠
帖 子:280
专家分:772
注 册:2010-4-20
收藏
得分:0 
回复 2楼 NoSoul
概念我倒是知道,主要是它的基本操作不怎么理解?谢谢你
2010-05-17 21:27
chichu
Rank: 2
来 自:安徽阜阳
等 级:论坛游民
帖 子:71
专家分:89
注 册:2010-4-14
收藏
得分:5 
程序代码:
#include<iostream.h>
#include<string.h>
#include<stdlib.h>
#define NULL 0                                 //宏定义NULL为0
#define SIZ sizeof(struct stu)                 //宏定义 SIZ为sizeof(struct stu)
struct stu                                      //结构体
{
    int num;
    stu *next;
};                                                    
       
void main()
{
    stu *H=NULL;      //定义头指针
    stu *r,*s,*p,*q;                                          
    int x,y;
    cin>>x;
    r=NULL;                //建立单链表A
    while(x!=NULL)                              
    {                      
        s=(stu*) malloc(SIZ);
        s->num=x;
        if(H==NULL)
            H=s;
        else
            r->next=s;
        r=s;
        cin>>x;                 
    }                          
    if(r!=NULL)
        r->next=NULL;
    r=H;
    while(r!=NULL)           //输出单链表A
    {
        cout<<r->num<<" ";
        r=r->next;
    }
    cout<<endl;
    cin>>y;                 //输入要插入的数据
    r=H;
    p=H;                        //指向头结点
    s=(stu*) malloc(SIZ);       //申请空间
    s->num=y;
    if(H==NULL)                  //头结点为空,使头结点指向S
        H=s;
    else                      //头结点不为空,插入S
        while(p->num<s->num)  
        {
            if(p->next->num>s->num)
            {
                q=p->next;
                s->next=q;
                p->next=s;
            }
            p=p->next;
        }
    r=H;
    while(r!=NULL)
    {
        cout<<r->num<<" ";
        r=r->next;
    }
    cout<<endl;
}



               
            

           
    


插入
程序代码:
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#define NULL 0                                 //宏定义NULL为0
#define SIZ sizeof(struct stu)                 //宏定义 SIZ为sizeof(struct stu)
struct stu                                      //结构体
{
    int num;
    stu *next;
};                                                    
void main()
{
    stu *Ha=NULL; stu *Hb=NULL; stu *Hc=NULL; //定义头指针
    stu *r,*s;
    struct stu *p,*q;                                  //定义指针p,q
    int x;
    cout<<"in put A:"<<endl;                      //建立单链表A
    cin>>x;
    r=Ha;
    for(;x;cin>>x)                              
    {                      
        s=(stu*) malloc(SIZ);
        s->num=x;
        if(Ha==NULL)
            Ha=s;
        else
            r->next=s;
        r=s;
    }                          
    if(r!=NULL)
        r->next=NULL;
    r=Ha;                                     //输出单链表A
    while(r!=NULL)
    {
        cout<<r->num<<" ";
        r=r->next;
    }
     cout<<endl;
    cout<<"in put B:"<<endl;                      //建立单链表B
    cin>>x;
    r=Hb;
    for(;x;cin>>x)
    {
        s=(stu*)malloc(SIZ);
        s->num=x;
        if(Hb==NULL)                     
            Hb=s;
        else
            r->next=s;
        r=s;
    }
    if(r!=NULL)
        r->next=NULL;
    r=Hb;
    while(r!=NULL)                            //输出单项链表B
    {
        cout<<r->num<<" ";
        r=r->next;
    }
     cout<<endl;
     p=Ha;q=Hb;
     r=Hc;                                       //建立单链表C
    while(p&&q)                                 //p不为空,且q不为空
    {
        if(p->num<q->num)                      
        {
            s=p;
            p=p->next;
        }
        else
        {
            s=q;
            q=q->next;
        }

        if(Hc==NULL)
        {
            Hc=s;
            r=Hc;   
        }
        else
        {
            r->next=s;
            r=s;
        }
    }
    if(p!=NULL)
        r->next=p;
    else
        if(q!=NULL)
            r->next=q;
        else
            r=r->next;
    r=Hc;                      //输出单链表C
    while(r!=NULL)
    {
        cout<<r->num<<" ";
        r=r->next;
    }
    cout<<endl;
}
合并
程序代码:
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#define NULL 0                               
#define SIZ sizeof(struct stu)                
struct stu                                   
{
    int num;
    stu *next;
};
stu *r,*s;                                                    
void main()
{
    stu * same(stu *ha,stu *hb);
    stu *Ha = NULL; stu *Hb = NULL; stu *Hc = NULL; //定义头指针
    int x;
    cout << "in put A:" << endl;                      //建立单链表A
    cin >> x;
    r = Ha;
    for(; x ;cin >> x)                              
    {                      
        s = (stu*) malloc(SIZ);
        s->num = x;
        if(Ha == NULL)
            Ha = s;
        else
            r->next = s;
        r = s;
    }                          
    if(r != NULL)
        r->next = NULL;
    r = Ha;                                  
    while(r != NULL)
    {
        cout << r->num <<" ";
        r = r->next;
    }
     cout << endl;
    cout << "in put B:" << endl;                      //建立单链表B
    cin >> x;
    r = Hb;
    for(; x ; cin>>x)
    {
        s = (stu*)malloc(SIZ);
        s->num = x;
        if(Hb == NULL)                     
            Hb = s;
        else
            r->next = s;
        r = s;
    }
    if(r != NULL)
        r->next = NULL;
    r = Hb;
    while(r != NULL)                          
    {
        cout << r->num <<" ";
        r = r->next;
    }
     cout << endl;
     Hc = same( Ha, Hb);
     r = Hc;
     while(r != NULL)
     {
         cout << r->num <<" ";
         r = r->next ;
     }
     cout << endl;
     free(s);
}
stu *same(stu *ha,stu *hb)
{
    stu *hc = NULL;
    r = hc;
    stu *q = ha;
    stu *p = hb;
    s = (stu*)malloc(SIZ);
    while(p != NULL && q != NULL)           
    {
        if(p->num == q->num)
        {
            s->num = p->num ;
            if(hc == NULL)
            {
                hc = s;
            }
            else
            {
                r->next = s;
            }
            r = s;
            s = (stu*)malloc(SIZ);
            p = p->next ;
            q = q->next ;
        }
        else
        {
            if(p->num < q->num )
            {
                p = p->next ;
            }
            else
            {
                q = q->next ;
            }
        }
               
    }
    if(r != NULL)
        r->next = NULL;
    return hc;
}
求交集
之前学链表的时候做的,希望对你有帮助


有了目标才有动力!!!
2010-05-17 21:31
冥卫
Rank: 8Rank: 8
来 自:深山老林
等 级:蝙蝠侠
帖 子:280
专家分:772
注 册:2010-4-20
收藏
得分:0 
楼上你在玩什么额
2010-05-17 21:35
NoSoul
Rank: 9Rank: 9Rank: 9
来 自:沈阳化工大学
等 级:蜘蛛侠
帖 子:283
专家分:1010
注 册:2009-6-6
收藏
得分:5 
单链表:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>

#define OK           1
#define ERROR        0
#define OVERFLOW    -2
typedef int Status;

typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,*LinkList;
LinkList L;
void menu();
int n;

Status Insert(LinkList &L,int place,int value)
{
     LinkList p;
      p=L;
    int j=0;
    while(p&&j<place-1){
        p=p->next;
        ++j;
    }
    if(!p||j>place-1)return ERROR;
    LinkList s;
    s=(LinkList)malloc(sizeof(LNode));
    s->data=value;
    s->next=p->next;
    p->next=s;
    menu();
    return OK;
}
Status Delete(LinkList L,int place)
{
    LinkList p;
      p=L;
    int j=0;
    while(p->next&&j<place-1){
        p=p->next;
        ++j;
    }
    if(!(p->next)||j>place-1)return ERROR;
    LinkList s;
    s=p->next;
    p->next=s->next;
    free(s);
    menu();
    return OK;
}
Status Show(LinkList L)
{
    LinkList p;
    p=L;
    if(p==NULL){
        printf("链表为空!\n");
    }
    else if(p->next==NULL)
        printf("%d\n",p->data);
    else{
        p=p->next;
        while(p->next!=NULL){
            printf("%d---",p->data);
            p=p->next;
        }
        printf("%d\n",p->data);
    }
    getch();
    menu();
    return OK;
}
void menu()
{
    system("cls ");
    printf("请选择:\n");
    printf("\t1.单链表的插入\n");
    printf("\t2.单链表的删除\n");
    printf("\t3.显示当前链表\n");
    printf("\t0.退出\n");
    int choice;
    scanf("%d",&choice);
    switch(choice){
    case 1:{
        system("cls");
        int place,value;
            printf("请输入要插入的位置和插入值:");
                scanf("%d%d",&place,&value);
        Insert(L,place,value);
    }
    case 2:{
        system("cls");
        int place;
        printf("请输入需要删除的位置:");
        scanf("%d",&place);
        Delete(L,place);
    }
    case 3:system("cls");Show(L);
    case 0:system("cls");printf("谢谢使用!\n");exit(0);
    }
}

int main()
{
    int i,n,num;
    printf("请输入该单链表的元素的个数:");
    scanf("%d",&n);
    printf("请输入元素(请逆序输入):");
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    for(i=1;i<=n;i++){
        LinkList p;
        p=(LinkList)malloc(sizeof(LNode));
        scanf("%d",&num);
        p->data=num;
        p->next=L->next;
        L->next=p;
    }
    menu();
    return 0;
}
双链表:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//**********链表结构*********//

typedef struct test
{
    int NO;
    int num;
    struct test *fwd;
    struct test *bwd;
}Node;
Node *rootpp=NULL;

//**********程序菜单*********//
void menu()
{
    printf("\t ╭────────────────────────────╮\n");
    printf("\t ∣            数据结构练习题                              ∣\n");
    printf("\t |————————————————————————————|\n");
    printf("\t | \t    insert:插入数字                 |\n");
    printf("\t |                            |\n");
    printf("\t | \t    delete:删除数字                 |\n");
    printf("\t |                            |\n");
    printf("\t | \t    getelem:获取数字               |\n");
    printf("\t |                            |\n");
    printf("\t | \t    clear:清除线性表               |\n");
    printf("\t |                            |\n");
    printf("\t | \t    exit:退出程序                 |\n");  
    printf("\t  ╰────────────────────────────╯\n");
    printf("\t   请您正确选择:");
}

//**********双链表插入程序*********//

Node *dll_insert(register Node *rootp,int NO,int value)  
{
    register Node *now;
    register Node *next;
    register Node *newnode;
    next=rootp;
    now=NULL;
    while(next!=NULL&&next->NO <= NO)
    {
        if(next->NO==NO)
        {
            next->num=value;
            return rootp;
        }
        now=next;
        next=next->fwd;
    }
    newnode=(Node *)malloc(sizeof(Node));
    if(newnode==NULL)
    {
        printf("error!\n");
        exit(1);
    }
    newnode->num=value;
    newnode->NO=NO;
    newnode->fwd=next;
    newnode->bwd=NULL;
    if(rootp==NULL)
    {
        return newnode;
    }
    if(now==NULL)
    {
        newnode->fwd=rootp;
        rootp->bwd=newnode;
        rootp=newnode;
        return rootp;
    }
    if (next!=NULL)
    {
     next->bwd=newnode;
     newnode->fwd=now->fwd;
   
    }
    newnode->bwd=now;
    now->fwd=newnode;
    return rootp;
}

//**********删除相应链表节点*********//

Node *del(Node *rootp,Node *delnum)
{
    if(delnum->bwd==NULL)
    {
        rootp=rootp->fwd;
        rootp->bwd=NULL;
    }
    else
    {
        if(delnum->fwd==NULL)
        {
            delnum->bwd->fwd=NULL;
        }
        else
        {
            delnum->bwd->fwd=delnum->fwd;
            delnum->fwd->bwd=delnum->bwd;
        }
    }
    free(delnum);
    return rootp;
}

//**********获取数字函数*********//

void get()
{
    int n;
    Node *reg=rootpp;
    printf("\n\n\t\t输入要获取数字的位置:");
    scanf("%d",&n);
    while(reg!=NULL && reg->NO!=n)
    {
        reg=reg->fwd;
    }
    printf("\n\n\t\t第%d个位置的数字是:%d\n",n,reg->num);
}

//**********输出链表函数*********//

void show()
{
    Node *rege=rootpp;
    while(rege!=NULL)
    {
        printf("%d->",rege->num);
        rege=rege->fwd;
    }
    printf("\n");
}

//**********输入插入数据函数*********//
//****一次测试调用两次cin_insert函数可能会出错****//
void cin_insert()
{
        int n,x[1001],y[1001],j,k;
        printf("\n\n\t\t输入数据组数\n");
        scanf("%d",&n);
        printf("\t\t输入%d组测试数据 位置 数据 (空缺的位置将用0填充)\n",n);
        for(j=0;j<n;j++)
        {
            scanf("%d%d",&x[j],&y[j]);
            if(x[0]>1 && j==0)                        
            {
                for(k=1;k<x[0];k++)
                {
                    rootpp=dll_insert(rootpp,k,0);
                }
            }
            if(j!=0 && x[j-1]+1 < x[j])    // 如果插入的位置不衔接 就在中间的位置插入0;
            {
                for(k=x[j-1]+1;k<x[j];k++)
                rootpp=dll_insert(rootpp,k,0);
            }
            rootpp=dll_insert(rootpp,x[j],y[j]);
            if(j<n-1)
            {
                show();
                printf("\t\t输入下一组数据\n");
            }
        }
        show();
}

//**********输入删除数据函数*********//

void cin_del()
{
    int n;
    Node *reg=rootpp;
    printf("\n\n\t\t输入要删除数字的位置:");
    scanf("%d",&n);
    while(reg!=NULL&&reg->NO!=n)
    {
        reg=reg->fwd;
    }
    rootpp=del(rootpp,reg);
    show();
    printf("\t\t请注意第%d个位置已经删除\n",n);
}

//**********释放链表内存函数*********//

void free()
{
    Node *reg;
    while(rootpp!=NULL)
    {
         reg=rootpp;
         rootpp=rootpp->fwd;
         free(reg);
    }
    printf("\n\n\t\t链表删除成功!\n");
}

//**********主程序*********//

void main()
{
    int j;
    char m[10];
        char const *mn[12]={"insert","delete","getelem","clear","exit"};
    while(1)
    {
        menu();
        scanf("%s",&m);
        system("cls");
        for(j=0;j<5;j++)
        {
            if(strcmp(m,mn[j])==0)
            {break;}
        }
        switch(j)
        {
            case 0:cin_insert();break;
            case 1:cin_del();break;
            case 2:get();break;
            case 3:free();break;
            case 4:exit(1);
            default :printf("\n\n\t\t输入有误!\n");
        }
    }
}

我想伸手拉近點,竟觸不到那邊,就欠一點點,但這一點點...卻好遠
2010-05-18 17:01
冥卫
Rank: 8Rank: 8
来 自:深山老林
等 级:蝙蝠侠
帖 子:280
专家分:772
注 册:2010-4-20
收藏
得分:0 
我大概懂了,谢谢
2010-05-18 17:20
快速回复:情帮忙解释一个问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016515 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved