| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2062 人关注过本帖
标题:在单链表中插入新节点,运行结果不是预期的怎么改呀?
只看楼主 加入收藏
风铃之美
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2008-4-2
收藏
 问题点数:0 回复次数:6 
在单链表中插入新节点,运行结果不是预期的怎么改呀?
#include "stdio.h"
#include "malloc.h"
typedef struct node
{
  int data;
  int *next;
  };
  int sum;
  struct node * creat(void)
{
  struct node *p1,*p2,*head;
  p2=p1=head=(struct node *)malloc(sizeof(struct node));
  scanf("%d",&p1->data);
  head=p1;
  while(p1->data!=NULL)
  {
    p1=(struct node *)malloc(sizeof(struct node));
    scanf("%d",&p1->data);
    p2->next=p1;
    p2=p1;
   }
    p2->next=NULL;
   return(head);
  }
struct node * print(struct node *head)
{
  struct node  *p;
  sum=0;
  p=head;
  while(p->next!=NULL)
  {
    printf("%d ",p->data);
    p=p->next;sum++;
  }
}
struct node * insert(struct node *head,struct node * p)
{
  struct node *p0,*p1,*p2;
  p1=head;
  p0=p;
  if(head==NULL)
  {head=p0;p0->next=NULL;}
  else
  {
    while((p0->data>p1->data)&&(p1->next!=NULL))
    {p2=p1;p1=p1->next;}
    if(p0->data<=p1->data)
    {
     if(head==p1)head=p0;
     else p2->next=p0;
     p0->next=p1;
      }
  if(p1->next=NULL)
  {
    p1->next=p0;p0->next=NULL;
  }
  ++sum;
    return(head);
  }
  }
  main()
{
  struct node *head,*p;
  printf("please enter the data of list:\n");
  head=creat();
  printf("the data of the list are:\n");
  print(head);
  printf("please enter the data you want to insert:\n");
  p=(struct node *)malloc(sizeof(struct node));
  scanf("%d",&p->data);
  head=insert(head,p);
  printf("the new list is:\n");
  print(head);
}
搜索更多相关主题的帖子: node struct 单链 节点 head 
2008-04-05 15:09
我是菜鸟哦
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:921
专家分:209
注 册:2007-5-4
收藏
得分:0 
代码太长了
问题不明确
把你所需的预期结果和实际结果说明
把与问题无关的代码去掉再发上来看看

偶是菜鸟鸟偶惧WHO?!!!!
2008-04-05 15:41
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
TC 写的代码吧,比较难看的。

看到一个全局变量。

代码难读啊,看不下去了。-_-!

[[it] 本帖最后由 cosdos 于 2008-4-5 16:19 编辑 [/it]]

—>〉Sun〈<—
2008-04-05 16:17
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
重新写一个程序吧。

先想好如何实现,然后写实现函数。

要实现怎么样的插入啊?

[[it] 本帖最后由 cosdos 于 2008-4-5 16:33 编辑 [/it]]

—>〉Sun〈<—
2008-04-05 16:29
smltq
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:566
专家分:400
注 册:2008-1-21
收藏
得分:0 
帮你看了下,应该是这样的
#include "stdio.h"
#include "malloc.h"
typedef struct node
{
  int data;
  struct node *next;/*指向下一个元素的指针应该是结构体类型的*/
};
  int sum;
struct node * creat(void)
  {
  struct node *p1,*p2,*head;
  p2=p1=head=(struct node *)malloc(sizeof(struct node));
  scanf("%d",&p1->data);
  head=p1;
  while(p1->data!=NULL)
  {
    p1=(struct node *)malloc(sizeof(struct node));
    scanf("%d",&p1->data);
    p2->next=p1;
    p2=p1;
   }
    p2->next=NULL;
   return(head);
  }

struct node * print(struct node *head)
{
  struct node  *p;
  sum=0;
  p=head;
  while(p->next!=NULL)
  {
    printf("%d ",p->data);
    p=p->next;sum++;
  }
}

struct node * insert(struct node *head,struct node * p)
{
  struct node *p0,*p1,*p2;
  p1=head;
  p0=p;
  if(head==NULL)
  {
    head=p0;
    p0->next=NULL;
   }
  else
  {
    while((p0->data>p1->data)&&(p1->next!=NULL))
    {p2=p1;p1=p1->next;}
    if(p0->data<=p1->data)
    {
     if(head==p1)head=p0;
     else p2->next=p0;
     p0->next=p1;
      }
  if(p1->next==NULL)/*这里你落了个等号*/
  {
    p1->next=p0;p0->next=NULL;
  }
    ++sum;
    return(head);
  }
  }
main()
 {
  struct node *head,*p;
  printf("please enter the data of list:\n");
  head=creat();

  printf("the data of the list are:\n");
  print(head);

  printf("please enter the data you want to insert:\n");
  p=(struct node *)malloc(sizeof(struct node));
  scanf("%d",&p->data);
  head=insert(head,p);
  printf("the new list is:\n");
  print(head);
  getch();
}
2008-04-05 17:37
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 

//----------------------------------------------------
// 在链表中顺序插入节点
// DEV-C++ 编译通过,并测试无错,如果有错发消息给我
//----------------------------------------------------

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int iData;
    struct Node * pNext;
} * List, Node;

List InitializeList(void);                   // 初始化列表
int InsertNode(List * pList, int iNewData);  // 从小到大插入插入数据
int ShowList(List * pList);                  // 显示列表
void DelList(List * pList);                  // 删除列表

//----------------------------------------------------

int main(void)
{
    List lobj;
    int data;
   
    lobj = InitializeList();
   
    // ShowList(&lobj);
   
    printf("    请输入一组int数据,每个数据之间用空格分开,\n"
           "并一个非数字字符结束输入。\n");
    while(scanf("%d", &data) == 1)
        InsertNode(&lobj, data);

    ShowList(&lobj);
   
    DelList(&lobj);
   
    system("Pause");
    return 0;
}

//----------------------------------------------------

List InitializeList(void)           // 初始化列表
{
    return NULL;
}

int InsertNode(List * pList, int iNewData)    // 从小到大插入插入数据
{
    Node * pCurNode;    // 指向当前节点
    Node * pPreNode;    // 指向前一个节点
    Node * pNewNode;    // 指向新创建的节点
   
    pPreNode = NULL;
    pCurNode = *pList;
   
    pNewNode = (Node *)malloc(sizeof(Node));   // 创建一个新节点
   
    if(pNewNode == NULL)      // 新节点创建失败
        return 0;

    pNewNode->iData = iNewData;      // 把数据放入该节点
   
    while(pCurNode != NULL && pCurNode->iData <= iNewData)
    {
        pPreNode = pCurNode;
        pCurNode = pCurNode->pNext;
    }
   
    pNewNode->pNext = pCurNode;  // 把比 iNewData (数据)大的节点放在新节点后
   
    if(pPreNode == NULL)    // 列表为空,或在第一个数据前
    {
        *pList = pNewNode;
    }
    else                    // 列表中,或列结尾
    {
        pPreNode->pNext = pNewNode;
    }

    return 1;
}

int ShowList(List * pList)                 // 显示列表
{
    int count = 0;      // 节点个数
    Node * pCurNode;    // 指向当前节点
   
    pCurNode = *pList;  // 指向第一个节点

    while(pCurNode != NULL)
    {
        ++count;
        printf("%d ", pCurNode->iData);
        pCurNode = pCurNode->pNext;
    }
   
    if(count == 0)
        printf("\n列表中无数据!\n");

    putchar('\n');
    return count;
}

void DelList(List * pList)          // 删除列表(删除所有节点)
{
    Node * pCurNode;    // 指向当前节点
    Node * pTempNode;   // 临时节点指针
   
    pCurNode = *pList;  // 指向第一个节点
   
    while(pCurNode != NULL)
    {
        pTempNode = pCurNode->pNext;
        free(pCurNode);
        pCurNode = pTempNode;
    }
   
    *pList = NULL;
}

—>〉Sun〈<—
2008-04-05 18:38
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
“//” 是注释,如果编译器不支持这中注释,
请换成“/* ...... */”的形式。

[[it] 本帖最后由 cosdos 于 2008-4-5 18:44 编辑 [/it]]

—>〉Sun〈<—
2008-04-05 18:42
快速回复:在单链表中插入新节点,运行结果不是预期的怎么改呀?
数据加载中...
 
   



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

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