//---------------------------------------------------------------------------
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#pragma hdrstop
#define null 0
typedef int ElemType;
//---------------------------------------------------------------------------
typedef struct node
{
ElemType data;
struct node *next;
}Lnode;
Lnode *head;
int length(Lnode *p)
{
int n=0;
Lnode *q=p;
while(q!=null)
{
n++;
q=q->next;
}
return n;
}
ElemType get(Lnode *p,int i)
{
int j=1;
Lnode *q=p;
while(j<i&&q!=null)
{
q=q->next;
j++;
}
if(q!=null)return(q->data);
else
{
printf("位置参数不正确\n");
return 0;
}
}
int locate(Lnode *p,ElemType x)
{
int n=0;
Lnode *q=p;
while(q!=null&&q->data!=x)
{
q=q->next;
n++;
}
if(q==null)return -1;
else return n+1;
}
int insert(ElemType x,int i)
{
int j=1;
Lnode *s,*q;
s=new Lnode;
s->data=x;
q=head;
if(i==1)
{
s->next=q;
head=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");
return 0;
}
}
return 0;
}
int Tdelete(Lnode *p,int i)
{
int j=1;
Lnode *q=p,*t; //Lnode *t初值该怎么付??
if(p==null)return 0;
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");
return 0;
}
}
if(t!=null)free(t);
return 0;
}
void display(Lnode *p)
{
Lnode *q;
q=p;
printf("单链表显示:");
if(q==null)printf("链表为空!");
else if(q->next==null)printf("%d\n",q->data);
else
{
while(q->next!=null)
{
printf("%d->",q->data);
q=q->next;
}
printf("%d",q->data);
}
printf("\n");
}
int Select()
{
int select;
do
{
printf("1--求长度\n");
printf("2--取结点\n");
printf("3--求值查找\n");
printf("4--增加结点\n");
printf("5--删除结点\n");
printf("6--退出\n");
printf("input your select:");
scanf("%d",&select);
cin.get();
}while(select>6||select<1);
return select;
}
#pragma argsused
int main(int argc, char* argv[])
{
int d,i,n,select,k;
clrscr();
head=null;
printf("请输入数据长度:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("将数据插入到单链表中:");
scanf("%d",&d);
insert(d,i);
}
display(head);
printf("\n");
do
{
select=Select();
if(select==6)break;
switch(select)
{
case 1: {
d=length(head);
printf("\n单链表的长度为:%d",d);
printf("\n");
display(head);
printf("\n");
}break;
case 2: {
printf("\n请输入取得结点的位置:");
scanf("%d",&d);
k=locate(head,d);
printf("%d\n",k);
display(head);
printf("\n");
}break;
case 3: {
printf("\n请输入要查找的数据:");
scanf("%d",&d);
k=locate(head,d);
printf("%d\n",k);
display(head);
printf("\n");
}break;
case 4: {
printf("\n请输入增加结点的位置:");
scanf("%d",&k);
printf("\n请输入增加结点的数据:");
scanf("%d",&d);
insert(d,k);
display(head);
printf("\n");
}break;
case 5: {
printf("\n请输入删除结点的位置:");
scanf("%d",&d);
Tdelete(head,d);
printf("\n");
display(head);
printf("\n");
}break;
}
}while(true);
return 0;
}
//---------------------------------------------------------------------------
就是删除不了第一个结点,明显是Lnode *t没付初值,不过不知道该怎么付