69,382
社区成员
发帖
与我相关
我的任务
分享
#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
}
参考一下吧
多个功能有多处错误;
添加链表,搜索,插入和删除都有一些逻辑问题。
逆序存在死循环的问题。问题都一一修改了,建议对比一下代码找一下自己的原因。