/*链表 |
*/ |
# define null 0 |
typedef char ElemType; /* 字符型数据*/ |
typedef struct LNode |
{ |
ElemType data; |
struct LNode *next; |
}; |
setnull ( struct LNode **p ); |
int length ( struct LNode **p ); |
ElemType get ( struct LNode **p, int i ); |
void insert ( struct LNode **p,ElemType x, int i ); |
int delete ( struct LNode **p, int i ); |
void display ( struct LNode **p ); |
main() |
{ |
struct LNode *head,*q; /*定义静态变量*/ |
int select,x1,x2,x3,x4; |
int i,n; |
int m,g; |
char e,y; |
head=setnull ( &head ); /*建议链表并设置为空表*/ |
printf ( "请输入数据长度: " ); |
scanf ( "%d" ,&n ); |
for ( i=1; i<n; i++ ); |
{ |
printf ( "将数据插入到单链表中: " ); |
scanf ( "%d" ,&y ); |
insert ( &head,y,i ); |
} /*插入数据到链表*/ |
display ( &head ); /*显示链表所有数据*/ |
printf ( "select 1 求长度 length()\n" ); |
printf ( "select 2 取结点 get()\n" ); |
printf ( "select 3 求值查找 locate()\n" ); |
printf ( "select 4 删除结点 delete()\n" ); |
printf ( "input your select: " ); |
scanf ( "%d" ,&select ); |
switch ( select ) |
{ |
case 1: |
{ |
x1=length ( &head ); |
printf ( "输出单链表的长度%d " ,x1 ); |
display ( &head ); |
} |
break ; |
case 2: |
{ |
printf ( "请输入要取得结点: " ); |
scanf ( "%d" ,&m ); |
x2=get ( &head,m ); |
printf ( x2 ); |
display ( &head ); |
} |
break ; |
case 3: |
{ |
printf ( "请输入要查找的数据: " ); |
scanf ( "%d" ,&e ); |
x3=locate ( &head,e ); |
printf ( x3 ); |
display ( &head ); |
} |
break ; |
case 4: |
{ |
printf ( "请输入要删除的结点: " ); |
scanf ( "%d" ,&g ); |
x4= delete ( &head,g ); |
printf ( x4 ); |
display ( &head ); |
} |
break ; |
} |
} |
} |
setnull ( struct LNode **p ) |
{ |
*p=null; |
} |
int length ( struct LNode **p ) |
{ |
int n=0; |
struct LNode *q=*p; |
while ( q!=null ) |
{ |
n++; |
q=q->next; |
} |
return ( n ); |
} |
ElemType get ( struct LNode **p, int i ) |
{ |
int j=1; |
struct LNode *q=*p; |
while ( j<i&&q!=null ) |
{ |
q=q->next; |
j++; |
} |
if ( q!=null ) |
return ( q->data ); |
else |
printf ( "位置参数不正确!\n" ); |
} |
int locate ( struct LNode **p,ElemType x ) |
{ |
int n=0; |
struct LNode *q=*p; |
while ( q!=null&&q->data!=x ) |
{ |
q=q->next; |
n++; |
} |
if ( q==null ) |
return ( -1 ); |
else |
return ( n+1 ); |
} |
void insert ( struct LNode **p,ElemType x, int i ) |
{ |
int j=1; |
struct LNode *s,*q; |
s= ( struct LNode * ) malloc ( sizeof ( struct LNode ) ); |
s->data=x; |
q=*p; |
if ( i==1 ) |
{ |
s->next=q; |
p=s; |
} |
else |
{ |
while ( j<i-1&&q->next!=null ) |
{ |
q=q->next; |
j++; |
} |
if ( j==i-1 ) |
{ |
s->next=q->next; |
q->next=s; |
} |
else |
printf ( "位置参数不正确!\n" ); |
} |
} |
int delete ( 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 ) |
{ |
q=q->next; |
j++; |
} |
if ( q->next!=null&&j==i-1 ) |
{ |
t=q->next; |
q->next=t->next; |
} |
else |
printf ( "位置参数不正确!\n" ); |
} |
if ( t=null ) |
free ( t ); |
} |
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" ); |
} |