| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1943 人关注过本帖
标题:请教个程序,,麻烦看看有没有问题
只看楼主 加入收藏
T1165170241
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-12-9
结帖率:33.33%
收藏
已结贴  问题点数:10 回复次数:8 
请教个程序,,麻烦看看有没有问题
1.初始化链表L
2.销毁链表L
3.清空链表L
4.求链表L的长度
5.判链表L空否。
6.通过e返回链表L中第i个数据元素的内容(这个不太会调用)
7.在链表L中检索值为e的数据元素
8.返回链表L中结点e的直接前驱结点
9.返回链表L中结点e的直接后继结点
10.在链表L中第i个数据元素之前插入数据元素e
11.将链表L中第i个数据元素删除,并将其内容保存在e中。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
typedef  int ElemType;
  typedef struct node
  {
      ElemType data;
      struct node *next;
  }node,*LinkList;

//1.链表L初始化
void creat(LinkList L)//建立一个带头结点的单链表
{
 int n;
 LinkList p,q;
 p=L;
 printf("请输入n和n个数据元素:\n");
 scanf("%d",&n);
 while(n--)
 {
  q=(LinkList)malloc(sizeof(node));
  scanf("%d",&q->data);
  q->next=NULL;
  p->next=q;
  p=q;
 }
}

  //2.销毁链表

void del(LinkList L)  //void,nothing return
{
      LinkList p,q;
      p=L->next;
    while(p->next!=NULL)
    {
        q=p->next;
        free(p);
        p=q;
    }
    free(p);  //free the last node
}

//3.链表清空
void clearList(LinkList L)
{
    LinkList p;            
 
    if(L->next == NULL)
    {
        printf("clearList函数执行,链表为空\n");
    }
    while(L->next != NULL)
    {
        p= L->next;//保存下一结点的指针
        free(p);
        p= L->next;      //表头下移
    }
    printf("clearList函数执行,链表已经清除\n");
}

//4.计算单链表的长度

void LinkListLength(LinkList L)
{
    int num=0;
 LinkList p;
 p=L->next;
 while(p)
 {
  num++;
  printf("%d ",p->data);
  p=p->next;
 }
 printf("\n长度为%d:\n",num);
}

//   5. 判断链表是否为空
void Is_Empty(LinkList L)
{
    if (L->next==NULL)                        //判断头节点的指针部分是否为空
    {
        printf ("链表为空!\n");
        
    }
    else
    {
       printf ("链表为空!\n");
    }
}


//6.通过e返回链表L中第i个数据元素的内容

  int getelem(LinkList L,int i,int e)
  {
      LinkList p;
      int j;
      p=L->next;
      j=1;
      while(p&&j<i)
      {
          p=p->next;
          j++;
      }

      if(!p||j>i)
          return -1;
          e=p->data;
      return 0;
  }

//7.在链表L中检索值为e的数据元素
  void Getelem(LinkList L,int e)
  {
      LinkList p;
      p=L->next;
      while(p&&p->data==e)
      {
          p=p->next;
      }
printf("检索成功");
  }


//8.查找值为e的直接前驱结点p
void *Find(LinkList L,int e)     
{
 LinkList p;
for (p=L;p->next&&p->next->data!=e;p=p->next);
if (p->next->data==e) return p;
else return NULL;
}

//9.查找值为e的直接后继结点p
void *NextElem(LinkList L,int e)
{
LinkList p;
for(p=L->next;p&&p->data!=e;p=p->next);
if (p) p=p->next;
return p;
}

//10.在链表L中第i个数据元素之前插入数据元素e
void ListInsert(LinkList L,int i,ElemType e)
{
    LinkList p,s;
    int j=0;
    while(p&&(j<i-1))
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i-1)
    printf("错误");
     s = (LinkList)malloc(sizeof(node));
    s->data=e;
    s->next=p->next;
    p->next=s;
}


//11.将链表L中第i个数据元素删除,并将其内容保存在e中。
void ListDelete(LinkList L,int i,int e)
{
  int j=0;
  LinkList p,q;
  p=L->next;
  while(p->next && j< i-1)
  {
    p = p->next;
    j++;
  }
  if(!p->next || j>i-1)
  printf("错误");
  q = p->next;
  p->next = q->next;
  e = q->data;
  free(q);
  }
void Tips()
{
 printf("按数字键选择相应操作\n");
 printf("1.链表L初始化:\n");
 printf("2.销毁链表:\n");
 printf("3.链表清空:\n");
 printf("4.计算单链表的长度:\n");
 printf("5.判断链表是否为空:\n");
 printf("6.通过e返回链表L中第i个数据元素的内容:\n");
 printf("7.在链表L中检索值为e的数据元素:\n");
 printf("8.查找值为e的直接前驱结点p:\n");
 printf("9.查找值为e的直接后继结点p:\n");
 printf("10.在链表L中第i个数据元素之前插入数据元素e:\n");
 printf("11.将链表L中第i个数据元素删除,并将其内容保存在e中。:\n");
 printf("0.退出:\n");
}
void main()
{
    int n,i,j,k,a,b,m,x,e;
     LinkList L,p;
     L=(LinkList)malloc(sizeof(L));
 L->next=NULL;
 L->data=-1;
 creat(L);
 Tips();
 scanf("%d",&n);
 while(n)
 {
     switch(n)
     {
     case 1:
             creat(L);
             break;
     case 2:
         del(L);
         break;
     case 3:
         clearList(L);
         break;
     case 4:
         LinkListLength(L);
         break;
     case 5:
         Is_Empty(L);
         break;
     case 7:
         printf("输入要检索的数据");
         scanf("%d",&a);
         Getelem(L,a);
         printf("检索成功");
         break;
     case 8:
         printf("输入要返回前驱的数据");
         scanf("%d",&k);
         Find(L,k);
         break;
     case 9:
          printf("输入要返回后继的数据");
         scanf("%d",&j);
         Find(L,j);
         break;
     case 10:
         printf("输入想要插入的数据");
         scanf("%d",&i);
         printf("输入插入的位置");
         scanf("%d",&j);
         ListInsert(L,i,j);
         printf("插入成功");
         break;
     case 11:
         printf("输入想要删除的第i个数据");
         scanf("%d",&x);
         ListDelete(L,x,e);
         printf("删除成功");
         break;
     }
 }
}

[此贴子已经被作者于2016-4-15 21:27编辑过]

搜索更多相关主题的帖子: 元素 include 
2016-04-15 21:26
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:10 
遇到什么问题就说什么问题
不要让别人帮你找问题
那是编译器的活

链表初始化写错了
p = L
p = malloc

第二个赋值操作会覆盖第一个赋值操作
结果第一个赋值操作 毫无意义

https://zh.
2016-04-16 12:19
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
程序代码:
    while(L->next != NULL)
    {
        p= L->next;//保存下一结点的指针
        free(p);
        p= L->next;      //表头下移
    }

L指针一直不变
这是死循环
而且 第二次进入循环的时候 会free 第一次循环中free的内存
free 2次 也是错误的

https://zh.
2016-04-16 12:21
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
程序代码:
void Is_Empty(LinkList L)
{
    if (L->next==NULL)                        //判断头节点的指针部分是否为空
    {
        printf ("链表为空!\n");
        
    }
    else
    {
       printf ("链表为空!\n");
    }
}

不管是 if 还是 else 判断结果都是 链表是空白的
我就问问 如果传入一个 非空链表
你的这个函数怎么工作 才能输出 链表非空

https://zh.
2016-04-16 12:23
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
  int getelem(LinkList L,int i,int e)

看起来你准备让 e 存储第 i 个元素的值???
C语言只有值传递 都是单向的
你这样操作 获取这个元素的值

这是非常基础的东西
应该是 学函数的第一课就学到
你上课在做什么?

https://zh.
2016-04-16 12:25
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
程序代码:
  void Getelem(LinkList L,int e)
  {
      LinkList p;
      p=L->next;
      while(p&&p->data==e)
      {
          p=p->next;
      }
printf("检索成功");
  }

你的函数只写了 检索成功
我就问问 如果你查找的值在链表中并不存在
你的函数怎么工作才能告诉你 检索失败??

https://zh.
2016-04-16 12:27
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
不想再看了
你的能力不足以完成这个程序 基本全错
回去好好看2个星期基础 再重新写

https://zh.
2016-04-16 12:28
T1165170241
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-12-9
收藏
得分:0 
回复 7楼 lin5161678
感谢你的教导,因为有点急功近利,程序错了很多,,目前正在修改,另外函数调用确实不太理解,望指导。
2016-04-17 11:13
T1165170241
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-12-9
收藏
得分:0 
回复 8楼 T1165170241
这是我后来的修改版


#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
typedef  int ElemType;
#define ok 1;
#define error -1;
int i;
//定义结点类型
typedef struct node
{
    ElemType data;              //单链表中的数据域
    struct node *next;          //单链表的指针域
}node,*LinkList;
 
 
//1.单链表的初始化
 
ElemType LinkListInit(LinkList L)
{
    L = (node *)malloc(sizeof(node));   //申请结点空间
    if(L == NULL)                       //判断是否有足够的内存空间
        return error;
    L->next = NULL;                  //将next设置为NULL,初始长度为0的单链表
    printf("链表初始化成功\n");
 return ok;
}

  //2.销毁链表

ElemType del(LinkList L)
{
      LinkList p;
    while(L)
    {
           p=L;
          L=L->next;
          free(p);
    }
    if(L)
        printf("error\n");
    if(L==NULL)
        printf("ok\n");

}


//3.链表清空
void clearList(LinkList L)
{
    LinkList p;            
 
    if(L->next == NULL)//判断链表是否为空
    {
        printf("clearList函数执行,链表为空\n");
    }
    while(L->next != NULL)
    {
        p= L->next;//保存下一结点的指针
         L->next= p->next;
           free(p);
    }
    printf("clearList函数执行,链表已经清除\n");
}

//4.计算单链表的长度

ElemType LinkListLength(LinkList L)
{
    int len=0;
 LinkList p;
 p=L->next;
 while(p)
 {
  len++;
    p=p->next;
 }
  printf("链表长度:%d\n",len);
}

//   5. 判断链表是否为空
ElemType Is_Empty(LinkList L)
{
    if(L->next==NULL)                        //判断头节点的指针部分是否为空
        printf("1\n");
    else
       printf("-1\n");
   
}


//6.通过e返回链表L中第i个数据元素的内容

  ElemType getelem(LinkList L,ElemType i,ElemType *e)
  {
      LinkList p;
      int j;
      p=L->next;
      j=1;
      while(p&&j<i)//找出第i-1个节点
      {
          p=p->next;
          j++;
      }
      if(!p||j>i)//检测i的合理性
          printf("error");
          e=p->data;
          printf("%d\n",p->data);
  }

//7.在链表L中检索值为e的数据元素
 int *Getelem(LinkList L,ElemType e)
  {
     int i=1;
      LinkList p;
      p=L->next;
      while(p&&p->data!=e)
      {
      p=p->next;
      i++;
      }
      if(p==NULL)
          printf("错误\n");
      else
          printf("%d\n",i);
  }


//8.查找值为e的直接前驱结点p
int *PriorElem(LinkList L,int e)     
{
     LinkList p;
 p=L;
 while( p->next &&p->next->data!=e)
  p=p->next;
 if(p->next)
  printf("%d的前驱结点为:%d\n\n",e,p->data);
 else
  printf("没找到!!\n\n");
}
//9.查找值为e的直接后继结点p
int *NextElem(LinkList L,int e)
{
LinkList p;
p=L;
for(p=L->next;p&&p->data!=e;p=p->next);
if (p &&p->data==e)
{
p=p->next;
printf("%d的后继结点为:%d\n\n",e,p->data);
}
else
printf("没找到!!\n\n");
}

//10.在链表L中第i个数据元素之前插入数据元素e
ElemType ListInsert(LinkList L,ElemType i,ElemType e)
{
    int j=0;
    LinkList p,s;
    p=L;
    while(p&&(j<i-1))//查找第i-1个节点
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i-1)
    printf("错误");
     s = (LinkList)malloc(sizeof(node));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return ok;
}


//11.将链表L中第i个数据元素删除,并将其内容保存在e中。
ElemType ListDelete(LinkList L,int i,ElemType e)
{
  int j=0;
  LinkList p,q;
  p=L;
    if(!p->next|| j>i-1)
  printf("错误");
  while(p->next&& j< i-1)//查找第i-1个节点
  {
    p = p->next;
    j++;
  }
  q = p->next;
  p->next = q->next;
  e = q->data;
  free(q);
  }


void Build(LinkList L)//建立一个带头结点的单链表
{
 int n;
 LinkList p,q;
 p=L;
 printf("请输入n和n个数据元素:\n");
 scanf("%d",&n);
 while(n--)
 {
  q=(LinkList)malloc(sizeof(node));
  scanf("%d",&q->data);
  q->next=NULL;
  p->next=q;
  p=q;
 }
}

void Tips()
{
 printf("按数字键选择相应操作\n");
 printf("<1> 链表初始化:\n");
 printf("<2> 销毁链表:\n");
 printf("<3> 清空链表:\n");
 printf("<4> 计算链表长度:\n");
 printf("<5> 判断链表是否为空:\n");
 printf("<6> 通过e返回链表L中第i个数据元素的内容:\n");
 printf("<7> 在链表L中检索值为e的数据元素:\n");
 printf("<8> 查找值为e的直接前驱结点p:\n");
 printf("<9> 查找值为e的直接后继结点p:\n");
 printf("<10> 在链表L中第i个数据元素之前插入数据元素e:\n");
 printf("<11> 将链表L中第i个数据元素删除,并将其内容保存在e中:\n");
 printf("<0> 退出:\n");
}

//--------------------------------------------------------------------------
int main()
{
int op,x,a,b,c,m,n,q,p;
int e;
 LinkList L;
 L=(LinkList)malloc(sizeof(node));
 L->next=NULL;
 L->data=-1;
 Build(L);
 Tips();
 scanf("%d",&op);
 while(op)
 {
  switch(op)
  {
  case 1:
      LinkListInit(L);
   break;
  case 2:
      del(L);
   break;
  case 3:
      clearList(L);
   break;
  case 4:
   LinkListLength(L);
   break;
  case 5:
      Is_Empty(L);
   break;
  case 6:
      printf("输入想要返回的第i个数据");
      scanf("%d",&x);
      getelem(L,x,e);
      printf("%d",&e);
   break;
  case 7:
      printf("输入想要检索的数据");
      scanf("%d",&a);
      *Getelem(L,a);
   break;
  case 8:
      printf("输入想要返回数据的前驱");
      scanf("%d",&b);
      *PriorElem(L,b);
   break;
  case 9:
       printf("输入想要返回数据的后继");
      scanf("%d",&c);
      *NextElem(L,c);
   break;
  case 10:
      printf("输入想要插入的位置");
      scanf("%d",&m);
      printf("输入想要插入的数据");
      scanf("%d",&n);
      ListInsert(L,m,n);
      break;
  case 11:
      printf("输入想要删除的第i个数据");
      scanf("%d",&q);
          ListDelete(L,q,p);
           printf("删除成功");
           break;
  }
  Tips();
  scanf("%d",&op);
 }
 return 0;
}


2016-04-27 19:50
快速回复:请教个程序,,麻烦看看有没有问题
数据加载中...
 
   



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

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