我刚学C语言,有没有高手能给一个链表的程序给我看看?

时间:2021-08-22 12:12:33
要求该程序能用链表实现数组元素的插入、删除、查找等,
不胜感激!

13 个解决方案

#1


其实前面有很多人问链表的程序,叫大家帮忙改错的,你把修改以后的程序复制下来就可以了阿

#2


课本上有的是啊!

你随便拿两个来看看不就得了?

#3


潭浩强的那本书中就有

#4


http://community.csdn.net/Expert/topic/3859/3859538.xml?temp=.1191522
这里有一个链表的程序,它有一点错误,我在下面写出了修改方法,简单改一下就可以了

#5


这是前几天做的用链表实现数组元素的插入
其他的稍改一下应该就可以了



#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct LNode 
{
  int data;
  LNode *next;
};

void Del(LNode *str)
{
  LNode *tmp;
  while(str)
  {
   tmp=str;
   free(str);
   str=tmp->next;
   }
}
   

LNode* CreateList_L( int n) 

  
  LNode *p,*L;
  int i;
  L = (LNode *)malloc(sizeof(LNode));
  L->next = NULL;              
  for (i=n; i>0; --i) 
  {
     p = (LNode *)malloc(sizeof(LNode));
     p->data =rand()%200;     
     p->next = L->next;    
     L->next = p;   
  }
  return L;


int main()
{
    int num=0;
    LNode *list=NULL;
    scanf("%d", &num);
    list=CreateList_L( num); 
    while(list)
        {
        printf("%d ",list->data);
        list=list->next;
        }
     Del(list);   
    system("PAUSE");
    return 0;
  }
  

#6


无语。

#7


我今天才看过这一部分 等晚上我再给你弄上来哈

#8


呵呵
楼主
到数据结构书上去找啊
很多啊
到处都是啊
这样别人给你发东西也没有用啊
要自己体会啊
不然看了也白看啊

#9


/*建立一个n个结点的环形双向链表*/
#include<stdio.h>
struct node
{
    char data ;
    struct node*llink,*rlink ;
}
;
typedef struct node NODE ;
NODE*head ;

/*插入数据y在x之后*/
int insert_d_l(head,x,y)
NODE*head ;
char x,y ;
{
    NODE*p,*q ;
    p=head->rlink ;
    while(p!=head&&p->data!=x)
    p=p->rlink ;
    if(p==head)return(1);
    q=(NODE*)malloc(sizeof(NODE));
    q->data=y ;
    q->rlink=p->rlink ;
    p->rlink=q ;
    q->rlink->llink=q ;
    q->llink=p ;
    return(0);
}

/*删除值为x的结点*/
int delet_d_l(head,x)
NODE*head ;
char x ;
{
    NODE*p ;
    p=head->rlink ;
    while(p!=head&&p->data!=x)
    p=p->rlink ;
    if(p==head)return(1);
    p->llink->rlink=p->rlink ;
    p->rlink->llink=p->llink ;
    free(p);
    return(0);
}

NODE*creat_d_l(n)
int n ;
{
    int i ;
    NODE*head,*p,*q ;
    if(n==0)return(NULL);
    head=(NODE*)malloc(sizeof(NODE));
    p=head ;
    for(i=0;i<n;i++)
    {
        scanf("%c",&(p->data));
        q=(NODE*)malloc(sizeof(NODE));
        q->llink=p ;
        p->rlink=q ;
        p=q ;
    }
    scanf("%c",&(p->data));
    getchar();
    p->rlink=head ;
    head->llink=p ;
    return(head);
}
/*从左向右输出队列*/
void r_output (head)
NODE *head ;
{
    NODE *p ;
    p=head ;
    printf("The link is(left->right):");
    while(p->rlink!=head)
    {
        printf("%c",p->data);
p=p->rlink ;
    }
    printf("%c\n",p->data);
}

/*从右向左输出队列*/
void l_output (head)
NODE *head ;
{
    NODE *p ;
    p=head ;
    printf("The link is(right->left):");
    while(p->llink!=head)
    {
        printf("%c",p->data);
p=p->llink ;
    }
    printf("%c\n",p->data);
}

main()
{
    int length,k=1,step ;
    char a,b ;
    printf("length=:");
    scanf("%d",&length);
    head=creat_d_l(length);
    while(k)
    {
        printf("1--insert\n2--delet:\n");
        scanf("%d",&step);
        switch(step)
        {
            case 1 :
            printf("Input the insert position:");
            scanf("%s",&a);
            printf("Input the insert data:");
            scanf("%s",&b);
            insert_d_l(head,a,b);
    r_output (head);
l_output (head);
            break ;
            case 2 :
            printf("Input the delet data:");
            scanf("%s",&a);
            delet_d_l(head,a);
    r_output (head);
         l_output (head);
 break ;
        }
        printf("1--continue\n0--exit:\n");
        scanf("%d",&k);
    }
}

以前写的一个环型双向链表的程序,现在看来不够精简,楼主看看还行不??

#10


呵呵,顶一下

#11


我们交流交流呀,这是我门老师个的程序你看看


/*线性表的顺序表示 */

#include<stdio.h>
#include<stdlib.h>
#define MAXNUM  20
#define TRUE 1
#define FALSE 0
#define SPECIAL -1
typedef int DataType;
struct Seqlist
   {
      DataType element[MAXNUM]; /*存放在线性表中的元素*/
      int  n;                   /*存放在线性表中的元素的个数n<MAXNUM*/
    };

typedef struct Seqlist *PSeqList;

PSeqList createNUlllist_seq(void)
  {
    PSeqList palist;
    palist=(PSeqList)malloc(sizeof(struct Seqlist));
    if(palist!=NULL)
       palist->n=0;  /*空表长度为零*/
     else
       printf("Out of spalistce!!\n"); /*存储分配失败*/
      return (palist);

   }
int insert_seq(PSeqList palist, int p, DataType x) /*在palist所指的顺序表中下标为p的元素之前插入元素*/

     { int q;
       if(palist->n==MAXNUM)
          { printf("OverFlow!!\n");   /*溢出*/
            return(FALSE);
           }
       if(p<0||p>palist->n)           /*不存在下标为p的元素*/
           { printf("Not exist!!\n");
            return(FALSE);
           }
       for(q=palist->n-1;q>=p;q--)    /*插入位置及以后的元素均后移一个位置*/
           palist->element[q+1]=palist->element[q];
       palist->element[p]=x;           /*插入元素x*/
       palist->n=palist->n+1;          /*元素个数加 1 */
       return (TRUE);
     }
int deleteSeq(PSeqList palist,int p )  /*在palist所指的顺序表中删除下标为p的元素*/
      { int q;
        if(p<0||p>palist->n)           /*不存在下标为p的元素*/
           {
             printf("Not exist!!\n");
             return(FALSE);
            }
        for(q=p;q<palist->n-1;q++)   /*被删除元素以后的元素均前移一个位置*/
          palist->element[q]=palist->element[q+1];
        palist->n=palist->n-1;        /*元素个数减 1 */
        return (TRUE);
     }

int locate_seq(PSeqList palist,DataType x) /* 求x在 palist中所指顺序表中下标*/
    {
      int q;
      for(q=0;q<palist->n;q++)   
        if(palist->element[q]==x)
            return(q);
      return(-1);
  
     }
DataType retrieve_seq(PSeqList palist,int p)/*palist中所指顺序表中下标为p的元素值*/
      {
        if(p>=0&&p<palist->n)           /*存在下标为p的元素*/
             return(palist->element[p]);
         printf("Not exist!!\n");
         return(SPECIAL);              /*返回一个顺序表中没有的特殊值*/
       }
int isNulllist_seq(PSeqList palist)
    { 
      return(palist->n==0);
     }
void printseqlist(PSeqList palist)
 { int i;
  for(i=0;i<=palist->n-1;i++)
    printf("%4d", palist->element[i]);
  printf("\n");
}

int main()
    { return 0; }

#12


555555555555555555
抢分的真多

#13


我也给一个吧,这两天我们学数据结构,搞了两下链表,我的是弱智形的,楼主见笑了!
#include <stdio.h>
#include <stdlib.h>
typedef struct node *link;

struct node {
    long id;
    float score;
    link next;
};

main()
{
    int i;
    link head=NULL;
    link pre=NULL,cur;
    for (i=0; i<10; i++) {
        cur=(link) malloc (sizeof *cur);
        if (head==NULL) head=cur;
        else pre->next=cur;
        cur->next=NULL;
        scanf("%ld",&cur->id);
        pre=cur;
    }
    cur=head;
    while (cur) {
        scanf("%f",&cur->score);
        cur=cur->next;
    }
    cur=head;
    while (cur) {
        printf("%ld  %f  ",cur->id,cur->score);
        cur=cur->next;
    }

}

只建立了一个链表,什么都没做,也没释放!

#1


其实前面有很多人问链表的程序,叫大家帮忙改错的,你把修改以后的程序复制下来就可以了阿

#2


课本上有的是啊!

你随便拿两个来看看不就得了?

#3


潭浩强的那本书中就有

#4


http://community.csdn.net/Expert/topic/3859/3859538.xml?temp=.1191522
这里有一个链表的程序,它有一点错误,我在下面写出了修改方法,简单改一下就可以了

#5


这是前几天做的用链表实现数组元素的插入
其他的稍改一下应该就可以了



#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct LNode 
{
  int data;
  LNode *next;
};

void Del(LNode *str)
{
  LNode *tmp;
  while(str)
  {
   tmp=str;
   free(str);
   str=tmp->next;
   }
}
   

LNode* CreateList_L( int n) 

  
  LNode *p,*L;
  int i;
  L = (LNode *)malloc(sizeof(LNode));
  L->next = NULL;              
  for (i=n; i>0; --i) 
  {
     p = (LNode *)malloc(sizeof(LNode));
     p->data =rand()%200;     
     p->next = L->next;    
     L->next = p;   
  }
  return L;


int main()
{
    int num=0;
    LNode *list=NULL;
    scanf("%d", &num);
    list=CreateList_L( num); 
    while(list)
        {
        printf("%d ",list->data);
        list=list->next;
        }
     Del(list);   
    system("PAUSE");
    return 0;
  }
  

#6


无语。

#7


我今天才看过这一部分 等晚上我再给你弄上来哈

#8


呵呵
楼主
到数据结构书上去找啊
很多啊
到处都是啊
这样别人给你发东西也没有用啊
要自己体会啊
不然看了也白看啊

#9


/*建立一个n个结点的环形双向链表*/
#include<stdio.h>
struct node
{
    char data ;
    struct node*llink,*rlink ;
}
;
typedef struct node NODE ;
NODE*head ;

/*插入数据y在x之后*/
int insert_d_l(head,x,y)
NODE*head ;
char x,y ;
{
    NODE*p,*q ;
    p=head->rlink ;
    while(p!=head&&p->data!=x)
    p=p->rlink ;
    if(p==head)return(1);
    q=(NODE*)malloc(sizeof(NODE));
    q->data=y ;
    q->rlink=p->rlink ;
    p->rlink=q ;
    q->rlink->llink=q ;
    q->llink=p ;
    return(0);
}

/*删除值为x的结点*/
int delet_d_l(head,x)
NODE*head ;
char x ;
{
    NODE*p ;
    p=head->rlink ;
    while(p!=head&&p->data!=x)
    p=p->rlink ;
    if(p==head)return(1);
    p->llink->rlink=p->rlink ;
    p->rlink->llink=p->llink ;
    free(p);
    return(0);
}

NODE*creat_d_l(n)
int n ;
{
    int i ;
    NODE*head,*p,*q ;
    if(n==0)return(NULL);
    head=(NODE*)malloc(sizeof(NODE));
    p=head ;
    for(i=0;i<n;i++)
    {
        scanf("%c",&(p->data));
        q=(NODE*)malloc(sizeof(NODE));
        q->llink=p ;
        p->rlink=q ;
        p=q ;
    }
    scanf("%c",&(p->data));
    getchar();
    p->rlink=head ;
    head->llink=p ;
    return(head);
}
/*从左向右输出队列*/
void r_output (head)
NODE *head ;
{
    NODE *p ;
    p=head ;
    printf("The link is(left->right):");
    while(p->rlink!=head)
    {
        printf("%c",p->data);
p=p->rlink ;
    }
    printf("%c\n",p->data);
}

/*从右向左输出队列*/
void l_output (head)
NODE *head ;
{
    NODE *p ;
    p=head ;
    printf("The link is(right->left):");
    while(p->llink!=head)
    {
        printf("%c",p->data);
p=p->llink ;
    }
    printf("%c\n",p->data);
}

main()
{
    int length,k=1,step ;
    char a,b ;
    printf("length=:");
    scanf("%d",&length);
    head=creat_d_l(length);
    while(k)
    {
        printf("1--insert\n2--delet:\n");
        scanf("%d",&step);
        switch(step)
        {
            case 1 :
            printf("Input the insert position:");
            scanf("%s",&a);
            printf("Input the insert data:");
            scanf("%s",&b);
            insert_d_l(head,a,b);
    r_output (head);
l_output (head);
            break ;
            case 2 :
            printf("Input the delet data:");
            scanf("%s",&a);
            delet_d_l(head,a);
    r_output (head);
         l_output (head);
 break ;
        }
        printf("1--continue\n0--exit:\n");
        scanf("%d",&k);
    }
}

以前写的一个环型双向链表的程序,现在看来不够精简,楼主看看还行不??

#10


呵呵,顶一下

#11


我们交流交流呀,这是我门老师个的程序你看看


/*线性表的顺序表示 */

#include<stdio.h>
#include<stdlib.h>
#define MAXNUM  20
#define TRUE 1
#define FALSE 0
#define SPECIAL -1
typedef int DataType;
struct Seqlist
   {
      DataType element[MAXNUM]; /*存放在线性表中的元素*/
      int  n;                   /*存放在线性表中的元素的个数n<MAXNUM*/
    };

typedef struct Seqlist *PSeqList;

PSeqList createNUlllist_seq(void)
  {
    PSeqList palist;
    palist=(PSeqList)malloc(sizeof(struct Seqlist));
    if(palist!=NULL)
       palist->n=0;  /*空表长度为零*/
     else
       printf("Out of spalistce!!\n"); /*存储分配失败*/
      return (palist);

   }
int insert_seq(PSeqList palist, int p, DataType x) /*在palist所指的顺序表中下标为p的元素之前插入元素*/

     { int q;
       if(palist->n==MAXNUM)
          { printf("OverFlow!!\n");   /*溢出*/
            return(FALSE);
           }
       if(p<0||p>palist->n)           /*不存在下标为p的元素*/
           { printf("Not exist!!\n");
            return(FALSE);
           }
       for(q=palist->n-1;q>=p;q--)    /*插入位置及以后的元素均后移一个位置*/
           palist->element[q+1]=palist->element[q];
       palist->element[p]=x;           /*插入元素x*/
       palist->n=palist->n+1;          /*元素个数加 1 */
       return (TRUE);
     }
int deleteSeq(PSeqList palist,int p )  /*在palist所指的顺序表中删除下标为p的元素*/
      { int q;
        if(p<0||p>palist->n)           /*不存在下标为p的元素*/
           {
             printf("Not exist!!\n");
             return(FALSE);
            }
        for(q=p;q<palist->n-1;q++)   /*被删除元素以后的元素均前移一个位置*/
          palist->element[q]=palist->element[q+1];
        palist->n=palist->n-1;        /*元素个数减 1 */
        return (TRUE);
     }

int locate_seq(PSeqList palist,DataType x) /* 求x在 palist中所指顺序表中下标*/
    {
      int q;
      for(q=0;q<palist->n;q++)   
        if(palist->element[q]==x)
            return(q);
      return(-1);
  
     }
DataType retrieve_seq(PSeqList palist,int p)/*palist中所指顺序表中下标为p的元素值*/
      {
        if(p>=0&&p<palist->n)           /*存在下标为p的元素*/
             return(palist->element[p]);
         printf("Not exist!!\n");
         return(SPECIAL);              /*返回一个顺序表中没有的特殊值*/
       }
int isNulllist_seq(PSeqList palist)
    { 
      return(palist->n==0);
     }
void printseqlist(PSeqList palist)
 { int i;
  for(i=0;i<=palist->n-1;i++)
    printf("%4d", palist->element[i]);
  printf("\n");
}

int main()
    { return 0; }

#12


555555555555555555
抢分的真多

#13


我也给一个吧,这两天我们学数据结构,搞了两下链表,我的是弱智形的,楼主见笑了!
#include <stdio.h>
#include <stdlib.h>
typedef struct node *link;

struct node {
    long id;
    float score;
    link next;
};

main()
{
    int i;
    link head=NULL;
    link pre=NULL,cur;
    for (i=0; i<10; i++) {
        cur=(link) malloc (sizeof *cur);
        if (head==NULL) head=cur;
        else pre->next=cur;
        cur->next=NULL;
        scanf("%ld",&cur->id);
        pre=cur;
    }
    cur=head;
    while (cur) {
        scanf("%f",&cur->score);
        cur=cur->next;
    }
    cur=head;
    while (cur) {
        printf("%ld  %f  ",cur->id,cur->score);
        cur=cur->next;
    }

}

只建立了一个链表,什么都没做,也没释放!