链表上的基本操作实现

作者在 2011-06-15 13:21:12 发布以下内容
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct node{
    int data;
    struct node *next;
    }link,*linkptr;
void creatlink(linkptr &la,int n)
{
    linkptr q1,q2;
    int i;
    for(i=0;i<n;i++)
    {
        q1=(linkptr)malloc(sizeof(link));
        if(!q1)printf("error");
        scanf("%d",&q1->data);
        if(i==0)
        {
            //q1->next=NULL;
            la=q2=q1;
        }
        else
        {
            q2->next=q1;
            q2=q1;
        }

        if(i==n-1)
        q2->next=NULL;
    }


}
void insert(linkptr &la,int x,int i)
{
    linkptr q1,q2,p;
    int k=1;
    q1=q2=la;
    p=(linkptr)malloc(sizeof(link));
    p->data=x;
    if(i==1)
    {
        p->next=la;
        la=p;
    }
    else
    {
           while(k<i-1)
            {
                q2=q1->next;
                q1=q2;
                k++;
            }//找到要插入的上一个节点q1、q2指向它
            q2=q1->next;
            q1->next=p;
            p->next=q2;
            //printf("\n");
    }
}
void delink(linkptr &la,int j)
{
    linkptr q1,q2;
    int k=1;
    q1=q2=la;
    if(j==1)
    {
        la=q1->next;
        free(q1);
        //q1=q2=la;
    }
    else
    {
           while(k<j-1)
            {
                q2=q1->next;
                q1=q2;
                k++;
            }//找到要删除的上一个节点

            q2=q1->next->next;
            free(q1->next);
            q1->next=q2;
            //q1=q2=la;
            
//printf("\n");
    }
}
void exchange(linkptr &la,int n)
{
    linkptr q1,q2,p,q;
    p=q=(linkptr)malloc(sizeof(link));
    p->next=la;
    int k=1;
    while(k<n)
    {
        q1=q2=la;
        q2=q1->next;
        while(q2->next!=NULL)
        {
        q1=q2;
        q2=q1->next;
        }//让q2指向最后一个,q1址前一个;
        q1->next=NULL;//
        q2->next=la;
        p->next=q2;//
        p=q2;
        k++;
    }//进行n-1次,
    
//实现调换
    la=q->next;
}
void view(linkptr p)
{
    linkptr q1,q2;
    q1=q2=p;
    q2=q1->next;
    while(q2!=NULL)//让q1来遍历链表
    {
        printf("%d ",q1->data);
        q1=q2;
        q2=q1->next;//移动指针
    }
    printf("%d ",q1->data);
    printf("\n");
}
void uninlink(linkptr &la,linkptr lb)
{
    linkptr p,m,n;
    //q1=la;p1=lb;q2=q1->next;p2=p1->next;
    m=n=p=(linkptr)malloc(sizeof(link));
    m->next=NULL;
    while(la!=NULL&&lb!=NULL)//
    {

            if(la->data<lb->data)
            {
                m->next=la;
                n=m->next;
                m=n;
                la=la->next;
            }
            else
            {
                m->next=lb;
                n=m->next;
                m=n;
                lb=lb->next;
            }
    }


  if (la==NULL)
    {
       m->next=lb;
    }
  else
       m->next=la;
    la=p->next;
}
void serch(linkptr la,int y,int n)
{
    linkptr q1,q2;
    int k=1;
    int shu=0;
    q1=q2=la;
    q2=q1->next;
    while(k<n)//让q1来遍历链表
    {
        if(q1->data==y)
        {
           printf("找到,%d在第%d个位置\n",y,k);
           shu=1;
        }
        q1=q2;
        q2=q1->next;//移动指针
        k++;


    }
    if(q1->data==y)
    {
        printf("找到,%d在第%d个位置\n",y,k);
        //k++;
        shu=1;
    }
    if(shu==0)
    {
       printf("没找到\n");
    }

}
int main()
{
    int n,x,i,j,y,m;
    linkptr la,lb;
    //printf("输入线性表La的长度:");
    scanf("%d",&n);
    //printf("输入线性表La中的元素:");
    creatlink(la,n);
    printf("创建好的线性表La=");
    view(la);
    scanf("%d%d",&x,&i);
    insert(la,x,i);
    printf("插入一个元素后的线性表La=");
    view(la);
    //printf("输入要删除元素的位置:");
    scanf("%d",&j);
    delink(la,j);
    printf("删除一个元素后的线性表La=");
    view(la);
    //printf("输入要查找的元素:");
    scanf("%d",&y);
    serch(la,y,n);
    exchange(la,n);
    printf("逆置后的线性表La=");
    view(la);
    //printf("输入线性表Lb的长度:");
    scanf("%d",&m);
    creatlink(lb,m);
    //view(lb);
    uninlink(la,lb);
    printf("合并La和Lb后的线性表=");
    view(la);
    return 0;
}
标题: 链表上的基本操作实现
时 限: 1000 ms
内存限制: 10000 K
总时限: 1000 ms
描述: 在单链表存储结构上实现基本操作:初始化、创建、插入、删除、查找、遍历、逆置、合并运算。
输入: 输入线性表La的长度:n
输入线性表La中的元素:a1 a2 a3 ...an(数值有序,为降序)
输入要插入到线性表La中的元素x和插入的位置i:x i
输入要删除元素的位置:i
输入要查找的元素:x
输入线性表Lb的长度:m
输入线性表Lb中的元素:b1 b2...bm(数值有序,为升序)
输出: 创建好的线性表La=a1 a2...an
插入一个元素后的线性表La=a1 a2...an+1
删除一个元素后的线性表La=a1 a2...an
查找一个输入的元素,如果找到,输出"找到,x在第i个位置";如果没有找到,输出"没找到"的信息。
逆置La后的线性表an an-1...a1
合并La和Lb后的线性表
输入样例: 6
15 13 10 9 8 5
7 6
4
10
4
1 3 6 9
输出样例:

创建好的线性表La=15 13 10 9 8 5
插入一个元素后的线性表La=15 13 10 9 8 7 5
删除一个元素后的线性表La=15 13 10 8 7 5
找到,10在第3个位置
逆置后的线性表La=5 7 8 10 13 15
合并La和Lb后的线性表=1 3 5 6 7 8 9 10 13 15

数据结构(c语言) | 阅读 1298 次
文章评论,共3条
cosdos
2011-06-18 14:28
1
这是一个 C++ 程序
维海(作者)
2011-06-20 13:26
2
<div class="quote"><span class="q"><b>cosdos</b>: 这是一个 C++ 程序</span></div>是c程序,但用到了引用
无名小卒朱超
2011-07-02 23:40
3
我要加油了.......
游客请输入验证码
浏览70052次