编程完成一个带头结点的单链表建立,实现初始化、求表长、取元素、按值查找、单链表的插入、删除、遍历访

编程完成一个带头结点的单链表建立,实现初始化、求表长、取元素、按值查找、单链表的插入、删除、遍历访问等基本操作。在此基础上,利用原链表结点空间实现逆转并输出结果。
例如: L->1->3->5->8->9. 逆转后结果为 L->9->8->5->3->1

第1个回答  2015-09-30
我们前几天数据结构刚好上机做这个实验,下面是我写的代码,除了最后的链表逆转没做之外,其他的挺符合你的要求的
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int a;
struct node *next;
}node,*List;
void createList(List &l1,int n)
{
int i;
struct node *p;
l1=(List)malloc(sizeof(node));
l1->next=NULL;
for(i=0;i<n;i++)
{
p=(List)malloc(sizeof(node));
scanf("%d",&(p->a));
p->next=l1->next;
l1->next=p;
}
}
int getListElem(List l1,int i,int &e)
{
struct node *p;
int j=1;
p=l1->next;
while(p!=NULL&&j<i)
{
p=p->next;
j++;
}
if(p==NULL||j>i)
return 0;
e=p->a;
}
int listInsert(List &l1,int i,int e)
{
int j=0;
struct node *p,*s;
p=l1;
while(p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
if(p==NULL||j>i-1)
return 0;
s=(List)malloc(sizeof(node));
s->a=e;
s->next=p->next;
p->next=s;
}
int listDelete(List &l1,int i,int &e)
{
struct node *p,*q;
int j=0;
p=l1;
while(p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
if(j>i-1||p==NULL)
return 0;
q=p->next;
p->next=q->next;
e=q->a;
free(q);
}
void main()
{
int e,i,n;
List l1;

struct node *p;
printf("请输入要创建链表的大小:\n");
scanf("%d",&n);
printf("请向链表中输入%d个整型数据:\n",n);
createList(l1,n);
printf("当前链表为:\n");
p=l1->next;
while(p!=NULL)
{
printf("%d ",p->a);
p=p->next;
}
printf("\n");
do
{
printf("请输入要查找数据的位置\n");
scanf("%d",&i);
getListElem(l1,i,e);
printf("查找到的数据为:%d\n",e);
printf("输入-1继续查找,输入其他任意数值进入下一环节:\n");
scanf("%d",&i);
}while(i==-1);
do
{
printf("请输入要插入数据的位置及大小:\n");
scanf("%d%d",&i,&e);
listInsert(l1,i,e);
printf("当前链表为:\n");
p=l1->next;
while(p!=NULL)
{
printf("%d ",(p->a));
p=p->next;
}
printf("\n");
printf("输入-1继续插入,输入其他任意数值进入下一环节:\n");
scanf("%d",&i);
}while(i==-1);
do
{
printf("请输入要删除元素的位置:\n");
scanf("%d",&i);
listDelete(l1,i,e);
printf("删除的元素为:%d\n",e);
printf("当前链表为:\n");
p=l1->next;
while(p!=NULL)
{
printf("%d ",(p->a));
p=p->next;
}
printf("\n");
printf("输入-1继续删除,输入其他任意数值结束!:\n");
scanf("%d",&i);
}while(i==-1);
}追答

可以采纳吗?

本回答被提问者和网友采纳
相似回答