急急,编程高手请进!80分酬谢(数据结构C语言,用C++编也可)

上机输入一组整数,建立带头结点的单链表,并实现线性表的求长度,插入和删除等操作 !

80分酬谢?我喜欢高分问题。

#include "stdafx.h"
#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
struct LNode
{
ElemType data;
struct LNode *next;
};

//***********************************************************置空表setnull()
void setnull(struct LNode **p)
{
*p=NULL;
}

//************************************************************求长度length()
int length(struct LNode **p)
{
int n=0;
struct LNode *q=*p;
while (q!=NULL)
{
n++;
q=q->next;
}
return(n);
}

//*************************************************************取结点get()
ElemType get(struct LNode **p,int i)
{
int j=1;
struct LNode *q=*p;
while (j<i && q!=NULL) /**//*查找第i个结点*/
{
q=q->next;j++;
}
if (q!=NULL) /**//*找到了第i个结点*/
return(q->data);
else
{
printf("位置参数不正确!\n");
return NULL;
}
}

//************************************************************按值查找locate()
int locate(struct LNode **p,ElemType x)
{
int n=0;
struct LNode *q=*p;
while (q!=NULL && q->data!=x) /**//*查找data域为x的第一个结点*/
{
q=q->next;
n++;
}
if (q==NULL) /**//*未找到data域等于x的结点*/
return(-1);
else /**//*找到data域等于x的结点*/
return(n+1);
}

//**********************************************************插入结点insert()
void insert(struct LNode **p,ElemType x,int i)
{
int j=1;
struct LNode *s,*q;
s=(struct LNode *)malloc(sizeof(struct LNode)); /**//*建立要插入的结点s*/
s->data=x;
q=*p;
if (i==1) /**//*插入的结点作为头结点*/
{
s->next=q;
*p=s;
}
else
{
while (j<i-1 && q->next!=NULL) /**//*查找第i-1个结点*/
{
q=q->next;j++;
}
if (j==i-1) /**//*找到了第i-1个结点,由q指向它*/
{
s->next=q->next; /**//*将结点s插入到q结点之后*/
q->next=s;
}
else
printf("位置参数不正确!\n");
}
}

//*********************************************************删除结点del()
void del(struct LNode **p,int i)
{
int j=1;
struct LNode *q=*p,*t;
if (i==1) /**//*删除链表的头结点*/
{
t=q;
*p=q->next;
}
else
{
while (j<i-1 && q->next!=NULL) /**//*查找第i-1个结点*/
{
q=q->next;j++;
}

if (q->next!=NULL && j==i-1) /**//*找到第i-1个结点,由q指向它*/
{
t=q->next; /**//*t指向要删除的结点*/
q->next=t->next; /**//*将q之后的结点删除*/
}
else printf("位置参数不正确!\n");
}
if (t!=NULL) /**//*在t不为空时释放该结点*/
free(t);
}

//********************************************************显示链表display()
void display(struct LNode **p)
{
struct LNode *q;
q=*p;
printf("单链表显示:");
if (q==NULL) /**//*链表为空时*/
printf("链表为空!");
else if (q->next==NULL) /**//*链表只有一个结点时*/
printf("%c\n",q->data);
else { /**//*链表存在一个以上的结点时*/
while (q->next!=NULL) /**//*显示前面的结点*/
{
printf("%c→",q->data);q=q->next;
}

printf("%c",q->data); /**//*显示最后一个结点*/
}

printf("\n");
}

void main()
{
struct LNode *head;
setnull(&head);
insert(&head,'a',1);
insert(&head,'b',2);
insert(&head,'a',2);
insert(&head,'c',4);
insert(&head,'d',3);
insert(&head,'e',1);
display(&head);
printf("单链表长度=%d\n",length(&head));
printf("位置:%d 值:%c\n",3,get(&head,3));
printf("值:%c 位置:%d\n",'a',locate(&head,'a'));
printf("删除第1个结点:");
del(&head,1);
display(&head);
printf("删除第5个结点:");
del(&head,5);
display(&head);
printf("删除开头3个结点:");
del(&head,3);
del(&head,2);
del(&head,1);
display(&head);
}

/**//*
运行结果:
单链表显示:e→a→a→d→b→c
单链表长度=6
位置:3 值:a
值:a 位置:2
删除第1个结点:单链表显示:a→a→d→b→c
删除第5个结点:单链表显示:a→a→d→b
删除开头3个结点:单链表显示:b
*/

参考资料:希望楼主不要食言

温馨提示:内容为网友见解,仅供参考
第1个回答  2008-03-05
int length_l(linklist *head)
{
linklist *p=head;
int i=0;
while(p!=NULL)
{ i++;
p=p->next;
}
return i;
}

参考书上的正确答案,我也在学数据结构,加油啊!
第2个回答  2008-03-05
这只是一个求链表长度的函数啊!并没有实现建立链表的功能,所以应该完善的!!
相似回答