c语言程序设计 实现一个链表的插入,删除,输出 结果这个代码输出时老是出错,求帮忙

#include<stdio.h>#include<stdlib.h>typedefstructlistnode{intdata;structlistnode*next;... #include<stdio.h>
#include<stdlib.h>
typedef struct listnode{
int data;
struct listnode *next;
}linknode,*linklist;

linklist creatlist(int length) //建立链表(头插法)//
{
int number;
int i=1;
linklist head;
listnode *p;
head=NULL;
printf("请输入链表中的元素:");
scanf("%d",&number);
while(i<length)
{
p=(listnode *)malloc (sizeof(listnode));
p->data=number;
p->next=head;
head=p;
scanf("%d",&number);
i=i+1;
}
return head;
}

linklist insertlist(linklist head,int i) //插入//
{
int j,n;
listnode *q,*p;
printf("请输入插入的数值:\n");
scanf("%d",&n);
p=head;
for(j=1;p!=NULL && j<i;j++)
p=p->next;
q=(linklist)malloc (sizeof (linknode));
q->data=n;
q->next=p->next;
p->next=q;
return head;
}

linklist deletelist(linklist head,int i) //删除
{
int j;
listnode *p,*q;
p=head;
for(j=1;p!=NULL && j<i;j++)
p=p->next;
q=p->next;
p=q->next;
free(q);
return head;
}

void output(linklist head) //输出
{
linklist p;
p=head->next;
while(p!=NULL)
{
printf("%d,",p->data);
p=p->next;
}
}

void main() //主函数
{
linklist L,head;
int l,a,b;
printf("请输入链表中元素的个数\n");
scanf("%d",&l);
head=creatlist(l);
printf("输入要插入元素的位置:\n");
scanf("%d",&a);
if(a<1||a>l+1)
printf("error");
else
{
insertlist(head,a);
printf("插入后的新链表是:\n");
output(head);
}
printf("输入要删除元素的位置:\n");
scanf("%d",&b);
if(b<1||a>l)
printf("error");
else
{
printf("删除后的新链表是:\n");
deletelist(head,b);
output(head);
}
}
展开
 我来答
Count_T
2011-03-23 · TA获得超过150个赞
知道小有建树答主
回答量:162
采纳率:0%
帮助的人:120万
展开全部
按照阁下的代码,我又写了一遍
直接就可以用

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

typedef struct listnode
{
int data;
struct listnode *next;
}
linknode,*linklist;

/***************
* 建立链表
***************/
linklist creatlist(int length)
{
int number;
linklist head = (listnode *) malloc(sizeof(listnode));
listnode *p = head;

printf("请输入链表中的元素:\n");

for(int i = 0; i < length; i++)
{
scanf("%d",&number);
p->data = number;
p->next = (listnode *) malloc(sizeof(listnode));
p = p->next;
}
return head;
}

/***************
* 插入
***************/
linklist insertlist(linklist head, int pos)
{
int n;
listnode *q = (linklist) malloc(sizeof(linknode));
listnode *p = head;

printf("\n请输入插入的数值:\t");
scanf("%d",&n);

for(int i = 0; i < pos-1; i++)
p = p->next;

q->data = n;
q->next = p->next;
p->next = q;

return head;
}

/***************
* 删除
***************/
linklist deletelist(linklist head, int pos)
{
listnode *p = head,*q;

for(int i = 0; i < pos-2; i++)
p = p->next;

q = p->next;
p->next = q->next;

free(q);

return head;
}

/***************
* 输出
***************/
void output(linklist head)
{
linklist p = head;

while(p!=NULL)
{
printf("%d ",p->data);
p = p->next;
}
}

/***************
* 主函数
***************/
int main()
{
linklist head;
int l,a,b;

printf("请输入链表中元素的个数:\t");
scanf("%d",&l);

head=creatlist(l);

printf("\n输入要插入元素的位置:\t");
scanf("%d",&a);

if(a < 1 || a > l)
printf("error");
else
{
insertlist(head, a);
printf("\n插入后的新链表是:\t");
output(head);
}

printf("\n输入要删除元素的位置:\t");
scanf("%d",&b);

if(b < 1 || a > l)
printf("error");
else
{
printf("\n删除后的新链表是:\t");
deletelist(head,b);
output(head);
}
return 0;
}
有钱买不起房子
2011-03-23 · TA获得超过4324个赞
知道大有可为答主
回答量:1249
采纳率:100%
帮助的人:2065万
展开全部
更正错误,下面是调试好的代码

#include<stdio.h>
#include<stdlib.h>
typedef struct listnode{
int data;
struct listnode *next;
}linknode,*linklist;

linklist creatlist(int length) //建立链表(头插法)//
{
int number;
int i=1;
linklist head;
listnode *p;
head=NULL;
printf("请输入链表中的元素:");
//scanf("%d",&number);
while(i<=length)
{
scanf("%d",&number);
p=(listnode *)malloc (sizeof(listnode));
p->data=number;
p->next=head;
head=p;
//scanf("%d",&number);
i=i+1;
}
return head;
}

linklist insertlist(linklist head,int i) //插入//
{
int j,n;
listnode *q,*p;
printf("请输入插入的数值:\n");
scanf("%d",&n);
p=head;
for(j=1;p!=NULL && j<i;j++)
p=p->next;
q=(linklist)malloc (sizeof (linknode));
q->data=n;
q->next=p->next;
p->next=q;
return head;
}

linklist deletelist(linklist head,int i) //删除
{
int j;
listnode *p,*q;
p=head;
if(head==NULL)//空链表直接返回NULL
return NULL;
if(i==1)//删除头节点
{
if(head->next==NULL)//如果仅剩下头节点
{
free(head);
return NULL;
}
head=head->next;
free(p);
return (head);//
}

for(j=1;p!=NULL && j<i;j++)
{
q=p;//q是p的前趋
p=p->next;
}
q->next=p->next;
free(p);//释放p
return head;

}

void output(linklist head) //输出
{
linklist p;
//p=head->next;
p=head;//head存储信息,要输出
while(p!=NULL)
{
printf("%d,",p->data);
p=p->next;
}
}

void main() //主函数
{
linklist L,head;
int l,a,b;
printf("请输入链表中元素的个数\n");
scanf("%d",&l);
head=creatlist(l);
printf("新链表是:\n");
output(head);
printf("输入要插入元素的位置:\n");
scanf("%d",&a);
if(a<1||a>l+1)
printf("error");
else
{
insertlist(head,a);
printf("插入后的新链表是:\n");
output(head);
}
printf("输入要删除元素的位置:\n");
scanf("%d",&b);
if(b<1||a>l)
printf("error");
else
{
printf("删除后的新链表是:\n");
head=deletelist(head,b);//返回表头
output(head);
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zheng_zhiwen12
2011-03-23 · TA获得超过543个赞
知道小有建树答主
回答量:265
采纳率:100%
帮助的人:101万
展开全部
#include<stdio.h>
下面是调试通过的代码,你上面写的定义都写的乱七八糟,二楼的居然也没改就帖上去了!
不过我这个不能删除最后一个节点,这个问题留给你息解决吧
#include<stdlib.h>

typedef struct listnode{
int data;
struct listnode *next;
}linknode,*linklist;

linklist creatlist(int length)
{
int number;
int i=1;
linklist head;
linknode *p;
head=NULL;

while(i<=length)
{
printf("请输入链表中的元素:");
scanf("%d",&number);
p=(linknode *)malloc (sizeof(linknode));
p->data=number;
p->next=head;
head=p;
i=i+1;
}
return head;
}

linklist insertlist(linklist head,int i)
{
int j,n;
linknode *q,*p;
printf("请输入插入的数值:\n");
scanf("%d",&n);
p=head;
for(j=1;p!=NULL && j<i;j++)
p=p->next;
q=(linklist)malloc (sizeof (linknode));
q->data=n;
q->next=p->next;
p->next=q;
return head;
}

linklist deletelist(linklist head,int i)
{
int j;
linklist p,q;
q=p=head;
for(j=1;p!=NULL&& j<i;j++)
{
q=p;
p=p->next;
}
if (q==p)
{
q=p->next;
free(p);
return q;
}
else
{
q->next=p->next;
free(p);
return head;
}

}

void output(linklist head)
{
linklist p;
p=head;
while(p!=NULL)
{
printf("%d,",p->data);
p=p->next;
}
}

void main()
{
linklist L,head;
int l,a,b;
printf("请输入链表中元素的个数\n");
scanf("%d",&l);
head=creatlist(l);
output(head);
printf("输入要插入元素的位置:\n");
scanf("%d",&a);
if(a<1||a>l+1)
printf("error");
else
{
head=insertlist(head,a);
printf("插入后的新链表是:\n");
output(head);
}
printf("输入要删除元素的位置:\n");
scanf("%d",&b);
if(b<1||a>l)
printf("error");
else
{
printf("删除后的新链表是:\n");
head=deletelist(head,b);
output(head);
}
system("pause");
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
秋叶87
2012-03-26
知道答主
回答量:1
采纳率:0%
帮助的人:1628
展开全部
楼上建立链表点问题,应该将建立链表改掉:
/***************
* 建立链表
***************/

linklist creatlist(int length)
{
int number;
linklist head = (listnode *) malloc(sizeof(listnode));
listnode *p = head;
listnode *q;

printf("请输入链表中的元素:\n");

for(int i = 0; i < length; i++)
{
scanf("%d",&number);
q = (listnode *) malloc(sizeof(listnode));
q->data = number;
q->next = NULL;
p->next = q;
p = p->next;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wgang208
2011-03-23
知道答主
回答量:2
采纳率:0%
帮助的人:2.9万
展开全部
#include<stdio.h>
#include<stdlib.h>

struct listnode{
int data;
struct listnode *next;
}start,*linknode;

struct listnode *creatlist(int length) //建立链表(头插法)
{
int number;
int i=1;
//linklist *head;
//listnode *p;
linknode->next=NULL;

linknode=&start;
printf("请输入链表中的元素:");
scanf("%d",&number);
while(i<length)
{
linknode->next=(struct listnode *)malloc (sizeof(struct listnode));
linknode=linknode->next;
linknode->data=number;
linknode->next=NULL;
//p->next=head;
//head=p;
scanf("%d",&number);
i=i+1;
}
return &start;
}

struct listnode *insertlist(struct listnode *head,int i) //插入
{
int j,n;
struct listnode *q,*p;
printf("请输入插入的数值:\n");
scanf("%d",&n);
p=head;
for(j=1;p!=NULL && j<i;j++)
p=p->next;
q=(struct listnode *)malloc (sizeof (struct listnode));
q->data=n;
q->next=p->next;
p->next=q;
return head;
}

struct listnode *deletelist(struct listnode *head,int i) //删除
{
int j;
struct listnode *p,*q;
p=head;
for(j=1;p!=NULL && j<i;j++)
p=p->next;
q=p->next;
p->next=q->next;
free(q);
return head;
}

void output(struct listnode *head) //输出
{
struct listnode *p;
p=head->next;
while(p!=NULL)
{
printf("%d,",p->data);
p=p->next;
}
printf("\n");
}

void main() //主函数
{
struct listnode *L,*head;
int l,a,b;
printf("请输入链表中元素的个数:\n");
scanf("%d",&l);
head=creatlist(l);
printf("输入要插入元素的位置:\n");
scanf("%d",&a);
if((a<1)||(a>l+1))
printf("error");
else
{
insertlist(head,a);
printf("插入后的新链表是:\n");
output(head);
}
printf("输入要删除元素的位置:\n");
scanf("%d",&b);
if((b<1)||(a>l))
printf("error");
else
{
printf("删除后的新链表是:\n");
deletelist(head,b);
output(head);
}
//system("pause");
}

我帮你修改了一下,在TC下能正常运行,你对照着看一下,应该能够看懂。你的程序中有很多细节上的错误,仔细看看我给你的这个程序,希望对你能有所帮助。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式