C语言链表问题

baekhyuniiii 2018-03-24 11:48:39
//求大神帮忙看看,一到删除第j个结点元素就运行错误
/*要求:
1、创建一个带头结点的单链表(头指针为head),且遍历此链表(输出链表中各结点的值);
2、查找单链表中的第i个结点,并输出结点元素的值;
3、在单链表中的第i个结点前插入一个结点值为e的正整数(从外部输入);
4、删除单链表中的第j个结点;
*5、将单链表中的各结点就地逆序(不允许另建一个链表);*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*Linklist;
void Creatlist(Linklist head,int n);
void Traverselist(Linklist head);
void del(Linklist head,int j);
void rev(Linklist head,int n);
void search(Linklist head,int i);
void Insert(Linklist head,int i,int e);
int main()
{
int n,i,e,j;
Linklist head;
head=(Linklist)malloc(sizeof(LNode));
if(head==NULL)
exit(1);
Creatlist(head,n);
printf("遍历链表,输出链表:\n");
Traverselist(head);
search(head,i);
Insert(head,i,e);
printf("插入后的链表为:\n");
Traverselist(head);
del(head,j);
printf("删除后的链表为:\n");
Traverselist(head);
rev(head,n);
printf("逆序后的链表为:\n");
Traverselist(head);
getchar();
return 0;
}
void Creatlist(Linklist head,int n)
{
int i;
head->next=NULL;
Linklist p,q;
q=head;
p=(Linklist)malloc(sizeof(LNode));
if(p==NULL)
exit(1);
printf("请输入结点个数n的值:");
scanf("%d",&n);
printf("请输入各个结点的值:");
for(i=0;i<n;i++)
{
p=(Linklist)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=NULL;
q->next=p;
q=p;
}
}
void Traverselist(Linklist head)
{
Linklist p;
p=head->next;
while(p!=NULL)
{
printf("%3d",p->data);
p=p->next;
}
}
void search(Linklist head,int i)
{
printf("\n请输入查找第i个结点的i的值:");
scanf("%d",&i);
Linklist p;
p=head;
int j=1;
while((p->next)&&(j<=i))
{
p=p->next;
j++;
}
printf("%d",p->data);
}
void Insert(Linklist head,int i,int e)
{
printf("\n在第i个结点前插入一个整数e,请分别输入i和e的值:");
scanf("%d%d",&i,&e);
Linklist p,q;
p=head;
int j=1;
while((p->next)&&(j<i))
{
p=p->next;
j++;
}
if(!p||j>i)
printf("插入位置错误");
q=(Linklist)malloc(sizeof(LNode));
q->data=e;
q->next=p->next;
p->next=q;
}
void del(Linklist head,int j)
{
Linklist p,q;
p=head;
int i=1;
printf("\n请输入要删除的第j个元素j的值:");
scanf("%d",&j);
while((p->next)&&(i<j))
{
p=p->next;
i++;
}
if(!p||j<i)
printf("删除位置不合理");
q=p->next;
p->next=q->next;
free(q);
}
/*void del(Linklist head)
{
int j,i=0;
printf("\n输入j的值:\n");
scanf("%d",&j);
Linklist p,q;
p=head;
q=head;
for(i=1;i<=j;i++)
p=p->next;
if(p==NULL)
exit(0);
for(i=1;i<j;i++)
q=q->next;
q->next=p->next;
p->next=NULL;
free(p);
printf("当前序列为:\n");
q=head->next;
while(q)
{
printf("%d\t",q->data);
q=q->next;
}
printf("\n");
}*/
void rev(Linklist head,int n)
{
Linklist p, q, r;
if(head==NULL)
return;
p=head->next;
q=p->next; //q为p下一个节点
while(q)
{
r=q->next; //r为q下一个节点
q->next=p; //指针回指
p=q;
q=r; //p, q后移 *关键是对指针间赋值的理解*
}
head->next=p;
}
...全文
600 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
FoolCarpe 2018-03-26
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
[quote=引用 2 楼 hefashion0190 的回复:] 可以参考下wiki中链表的示例 https://zh.wikipedia.org/wiki/%E9%93%BE%E8%A1%A8
对比#1和#2,我觉得wiki上的图不如我的图讲得更清楚。[/quote]
自信男孩 2018-03-26
  • 打赏
  • 举报
回复
函数参数应尽量少,看到楼主的传入参数并没有带入到函数内数值,而是把参数当做内部普通局部变量使用,这样倒不如去掉该参数,改成在函数内定义局部变量。 参数的增加会导致程序的运行效率降低,如果是初学者可以暂不考虑这个问题导致的效率降低。
自信男孩 2018-03-26
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

typedef struct LNode
{
    int data;
    struct LNode *next;
} LNode,*Linklist;

void Creatlist(Linklist head,int n);
void Traverselist(Linklist head);
void del(Linklist head,int j);
void rev(Linklist head,int n);
void search(Linklist head,int i);
void Insert(Linklist head,int i,int e);

int main()
{
    int n,i,e,j;
    Linklist head;
    head=(Linklist)malloc(sizeof(LNode));
    if(head==NULL)
        exit(1);
    Creatlist(head,n);
    printf("遍历链表,输出链表:\n");
    Traverselist(head);

    search(head,i);
    Insert(head,i,e);
    printf("插入后的链表为:\n");
    Traverselist(head);
    del(head,j);
    printf("删除后的链表为:\n");
    Traverselist(head);
    rev(head,n);
    printf("逆序后的链表为:\n");
    Traverselist(head);
    getchar();
    return 0;
}
void Creatlist(Linklist head,int n)
{
    int i;
    head->next=NULL;
    Linklist p,q;
    q = head;
    /*  多余的一个节点
    p = (Linklist)malloc(sizeof(LNode));
    if(p==NULL)
        exit(1);
    */
    printf("请输入结点个数n的值:");
    scanf("%d",&n);
    printf("请输入各个结点的值:");
    for(i=0;i<n;i++)
    {
        p=(Linklist)malloc(sizeof(LNode));
        scanf("%d", &p->data);
        p->next=NULL;
        q->next = p;
        q = p;
    }
}
void Traverselist(Linklist head)
{
    Linklist p;
    p=head->next;
    while(p!=NULL)
    {
        printf("%3d",p->data);
        p = p->next;
    }
}
void search(Linklist head,int i)
{
    printf("\n请输入查找第i个结点的i的值:");
    scanf("%d",&i);
    Linklist p;
    p = head;
    int j=1;
    while((p->next)&&(j<=i))
    {
        p=p->next;
        j++;
    }
    if (!p->next) {
        printf("Can't find it!\n");
        return;
    }
    printf("%d",p->data);
}
void Insert(Linklist head,int i,int e)
{
    printf("\n在第i个结点前插入一个整数e,请分别输入i和e的值:");
    scanf("%d%d", &i, &e);
    Linklist p,q;
    p = head;
    int j = 1;
    while((p->next)&&(j<i))
    {
        p = p->next;
        j++;
    }
    if (!p->next && j < i) {
        printf("插入位置错误");
        return;
    }

    q = (Linklist)malloc(sizeof(LNode));
    q->data = e;
    q->next = p->next;
    p->next = q;
}
void del(Linklist head,int j)
{
    Linklist p,q;
    p=head;
    int i=1;
    printf("\n请输入要删除的第j个元素的值:");
    scanf("%d", &j);
    while((p->next)&&(i<j))
    {
        p = p->next;
        i++;
    }
    if (!p->next && i < j) {
        printf("删除位置不合理");
        return;
    }
    q = p->next;
    p->next = q->next;
    free(q);
}
/*void del(Linklist head)
  {
  int j,i=0;
  printf("\n输入j的值:\n");
  scanf("%d",&j);
  Linklist p,q;
  p=head;
  q=head;
  for(i=1;i<=j;i++)
  p=p->next;
  if(p==NULL)
  exit(0);
  for(i=1;i<j;i++)
  q=q->next;
  q->next=p->next;
  p->next=NULL;
  free(p);
  printf("当前序列为:\n");
  q=head->next;
  while(q)
  {
  printf("%d\t",q->data);
  q=q->next;
  }
  printf("\n");
  }*/
void rev(Linklist head,int n)
{
    Linklist p, q, r;

    if(head==NULL)
        return;
#if 1
    q = head;
    p = head->next;
    head->next = NULL;

    while (p) {
        r = p->next;
        p->next = q->next;
        q->next = p;
        p = r;
    }
#else
    p = head->next;
    q = p->next; //q为p下一个节点
    while(q)
    {
        r=q->next; //r为q下一个节点
        q->next=p; //指针回指
        p=q;
        q=r;          //p, q后移    *关键是对指针间赋值的理解*
    }
    //head->next=p;
#endif
}
参考一下吧 多个功能有多处错误; 添加链表,搜索,插入和删除都有一些逻辑问题。 逆序存在死循环的问题。问题都一一修改了,建议对比一下代码找一下自己的原因。
赵4老师 2018-03-26
  • 打赏
  • 举报
回复
引用 2 楼 hefashion0190 的回复:
可以参考下wiki中链表的示例 https://zh.wikipedia.org/wiki/%E9%93%BE%E8%A1%A8
对比#1和#2,我觉得wiki上的图不如我的图讲得更清楚。
FoolCarpe 2018-03-26
  • 打赏
  • 举报
回复
可以参考下wiki中链表的示例 https://zh.wikipedia.org/wiki/%E9%93%BE%E8%A1%A8
赵4老师 2018-03-25
  • 打赏
  • 举报
回复
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧