请教个程序,,麻烦看看有没有问题
1.初始化链表L2.销毁链表L
3.清空链表L
4.求链表L的长度
5.判链表L空否。
6.通过e返回链表L中第i个数据元素的内容(这个不太会调用)
7.在链表L中检索值为e的数据元素
8.返回链表L中结点e的直接前驱结点
9.返回链表L中结点e的直接后继结点
10.在链表L中第i个数据元素之前插入数据元素e
11.将链表L中第i个数据元素删除,并将其内容保存在e中。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
typedef int ElemType;
typedef struct node
{
ElemType data;
struct node *next;
}node,*LinkList;
//1.链表L初始化
void creat(LinkList L)//建立一个带头结点的单链表
{
int n;
LinkList p,q;
p=L;
printf("请输入n和n个数据元素:\n");
scanf("%d",&n);
while(n--)
{
q=(LinkList)malloc(sizeof(node));
scanf("%d",&q->data);
q->next=NULL;
p->next=q;
p=q;
}
}
//2.销毁链表
void del(LinkList L) //void,nothing return
{
LinkList p,q;
p=L->next;
while(p->next!=NULL)
{
q=p->next;
free(p);
p=q;
}
free(p); //free the last node
}
//3.链表清空
void clearList(LinkList L)
{
LinkList p;
if(L->next == NULL)
{
printf("clearList函数执行,链表为空\n");
}
while(L->next != NULL)
{
p= L->next;//保存下一结点的指针
free(p);
p= L->next; //表头下移
}
printf("clearList函数执行,链表已经清除\n");
}
//4.计算单链表的长度
void LinkListLength(LinkList L)
{
int num=0;
LinkList p;
p=L->next;
while(p)
{
num++;
printf("%d ",p->data);
p=p->next;
}
printf("\n长度为%d:\n",num);
}
// 5. 判断链表是否为空
void Is_Empty(LinkList L)
{
if (L->next==NULL) //判断头节点的指针部分是否为空
{
printf ("链表为空!\n");
}
else
{
printf ("链表为空!\n");
}
}
//6.通过e返回链表L中第i个数据元素的内容
int getelem(LinkList L,int i,int e)
{
LinkList p;
int j;
p=L->next;
j=1;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return -1;
e=p->data;
return 0;
}
//7.在链表L中检索值为e的数据元素
void Getelem(LinkList L,int e)
{
LinkList p;
p=L->next;
while(p&&p->data==e)
{
p=p->next;
}
printf("检索成功");
}
//8.查找值为e的直接前驱结点p
void *Find(LinkList L,int e)
{
LinkList p;
for (p=L;p->next&&p->next->data!=e;p=p->next);
if (p->next->data==e) return p;
else return NULL;
}
//9.查找值为e的直接后继结点p
void *NextElem(LinkList L,int e)
{
LinkList p;
for(p=L->next;p&&p->data!=e;p=p->next);
if (p) p=p->next;
return p;
}
//10.在链表L中第i个数据元素之前插入数据元素e
void ListInsert(LinkList L,int i,ElemType e)
{
LinkList p,s;
int j=0;
while(p&&(j<i-1))
{
p=p->next;
++j;
}
if(!p||j>i-1)
printf("错误");
s = (LinkList)malloc(sizeof(node));
s->data=e;
s->next=p->next;
p->next=s;
}
//11.将链表L中第i个数据元素删除,并将其内容保存在e中。
void ListDelete(LinkList L,int i,int e)
{
int j=0;
LinkList p,q;
p=L->next;
while(p->next && j< i-1)
{
p = p->next;
j++;
}
if(!p->next || j>i-1)
printf("错误");
q = p->next;
p->next = q->next;
e = q->data;
free(q);
}
void Tips()
{
printf("按数字键选择相应操作\n");
printf("1.链表L初始化:\n");
printf("2.销毁链表:\n");
printf("3.链表清空:\n");
printf("4.计算单链表的长度:\n");
printf("5.判断链表是否为空:\n");
printf("6.通过e返回链表L中第i个数据元素的内容:\n");
printf("7.在链表L中检索值为e的数据元素:\n");
printf("8.查找值为e的直接前驱结点p:\n");
printf("9.查找值为e的直接后继结点p:\n");
printf("10.在链表L中第i个数据元素之前插入数据元素e:\n");
printf("11.将链表L中第i个数据元素删除,并将其内容保存在e中。:\n");
printf("0.退出:\n");
}
void main()
{
int n,i,j,k,a,b,m,x,e;
LinkList L,p;
L=(LinkList)malloc(sizeof(L));
L->next=NULL;
L->data=-1;
creat(L);
Tips();
scanf("%d",&n);
while(n)
{
switch(n)
{
case 1:
creat(L);
break;
case 2:
del(L);
break;
case 3:
clearList(L);
break;
case 4:
LinkListLength(L);
break;
case 5:
Is_Empty(L);
break;
case 7:
printf("输入要检索的数据");
scanf("%d",&a);
Getelem(L,a);
printf("检索成功");
break;
case 8:
printf("输入要返回前驱的数据");
scanf("%d",&k);
Find(L,k);
break;
case 9:
printf("输入要返回后继的数据");
scanf("%d",&j);
Find(L,j);
break;
case 10:
printf("输入想要插入的数据");
scanf("%d",&i);
printf("输入插入的位置");
scanf("%d",&j);
ListInsert(L,i,j);
printf("插入成功");
break;
case 11:
printf("输入想要删除的第i个数据");
scanf("%d",&x);
ListDelete(L,x,e);
printf("删除成功");
break;
}
}
}
[此贴子已经被作者于2016-4-15 21:27编辑过]