回 帖 发 新 帖 刷新版面

主题:C语言 循环链表的问题




这个程序,插入新元素实在表尾插入还是表头插入啊?
插入两个元素后, l指向的节点应该是什么?
linklist p=l->next->next; 这是第一个节点吗?
[code=c]
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
//node  ****************************************
struct node
{
 int data;
 struct node *next;

};
typedef struct node *linklist;

void visit(char e)
{
  printf("%c",e);
}

//init*********************************************
int initlist(linklist *l)
{
  //l=(linklist *)malloc(sizeof(linklist));
  *l=(linklist)malloc(sizeof(struct node));
  if(!*l)
   exit(OVERFLOW);
  (*l)->next=*l;
  return 1;
  
}

//length*****************
int listlength(linklist l)
{
  int i=0;
  linklist p=l->next;
  while(p!=l)
  {
      p=p->next;
      i++;
  }
  return i;
}
//insert插入******************
int insert(linklist *l,int i,char e)
{
    //在第i个位置 前 插入元素
    linklist p=(*l)->next,s;
    int j=0;
    if(i<=0||i>listlength(*l)+1)
        return 0;
    while(j<i-1)
    {
        p=p->next;
        j++;
    }
   s=(linklist)malloc(sizeof(struct node));
   s->data=e;
   s->next=p->next;
   p->next=s;
   if(p==*l)
       *l=s;
   return 1;
}
//遍历单循环聊表
int traverse(linklist l)
{
    [color=FF0000]linklist p=l->next->next;//指向第一个节点[/color]
    while(p!=l->next)
   {
       visit(p->data);
       p=p->next;
   }
   printf("\n");
   return 1;

}



int main()
{
  linklist l;
  char e;
 
  i=initlist(&l);
  printf("依次在单链表中插入 1,2\n");
  insert(&l,1,'a');
  insert(&l,2,'b');
  traverse(l);

 system("pause");
 return 0; 
}
[/code]

回复列表 (共2个回复)

沙发

插入新元素师在 i 之前的一个结点,因此可以是任意位置;

l 相当于head 为头结点指针,在这个程序中为头指针分配一个结点,但为空的;因此 linklist p=l->next->next; 也就是指向第一个结点!

板凳

终于看完这个代码了……晕死我了,结果上是正确的,不过说真的,我真佩服这段代码的编写者,反正我看着代码是晕得很。这个链表最诡异的地方在于他的头结点居然不是l,而是l->next,这点让我很看不懂。一般的带头链表,头结点是不会动的,底下结点在转,因此没有这么乱……

我来回复

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