1. 程式人生 > >老師要我們寫單鏈表基本操作。。。

老師要我們寫單鏈表基本操作。。。

sca 單鏈表 基本操作 des tde length pre != putchar

#include<stdio.h>
#include<stdlib.h>
#define FALSE 0
#define TRUE 1
typedef int Datatype;
typedef struct Node{
Datatype data;
struct Node *next;
}Linklist; Linklist *InitList(Linklist *L) //初始化鏈表
{
L=(Linklist *)malloc(sizeof(Linklist));
L->next=NULL;
return L;
} void DestroyList(Linklist *L) //銷毀單鏈表
{
Linklist *pre=L,*p=L->next;
while(p!=NULL)
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
} int ListEmpty(Linklist *L)
{
return (L->next==NULL);
}

void Create_LinkF(Linklist *P,Datatype *value,int n)//頭插法
{
Linklist *s;
int i;
for(i=0;i<n;i++)
{
s=(Linklist *)malloc(sizeof(Linklist));
s->data=*(value+i);
s->next=P->next;
P->next=s;
}
} void Create_LinkR(Linklist *p,Datatype *value,int n)//尾插法
{
Linklist *s;
// r=p;
int i;
for(i=0;i<n;i++)
{
s=(Linklist *)malloc(sizeof(Linklist));
s->data=*(value+i);
p->next=s;
p=s;
}
p->next=NULL;
}

void DispList(Linklist *L) //顯示鏈表
{
Linklist *p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
putchar(10);
} int ListLength(Linklist *L) //計算鏈表的長度
{
int n=0;
while(L->next!=NULL)
{
n++;
L=L->next;
}
return n;
} int LocateElem(Linklist *L,Datatype e,int *p) //查找某一元素的下標
{
int i=-1,j=0;
Linklist *s;
s=L;
while(s->next!=NULL)
{
s=s->next;
i++;
if(s->data==e)
{
*p=i;
p++;
j++;
}
}
return j;
} int LinklistInsert(Linklist *L,int i,Datatype value) //在指定下標插入元素
{
Linklist *s;
s=(Linklist *)malloc(sizeof(Linklist));
int j=0;
while(j<i-1&&L!=NULL)
{
j++;
L=L->next;
}
if(L==NULL)
{
return -1;
}
else
{
s->data=value;
s->next=L->next;
L->next=s;
return 0;
}
} int ListDelete(Linklist *L,int i) //刪除指定下標的元素
{
Linklist *s;
int j=0;
while(j<i&&L!=NULL)
{
j++;
L=L->next;
}
if(L==NULL)
{
return -1;
}
else
{
s=L->next;
if(s==NULL)
return -1;
L->next=s->next;
free(s);
return 0;
}
}

int main()
{
Linklist *L;
Datatype *a,value;
int n,i,j,flag=0,*P;
P=(Datatype *)malloc(sizeof(Datatype));
a=(Datatype *)malloc(sizeof(Datatype));
L=InitList(L);
printf("請輸入鏈表的長度:\n");
scanf("%d",&n);
printf("請輸入%d個數:\n",n); for(i=0;i<n;i++)
{
scanf("%d",&value);
*(a+i)=value;
}
printf("請選擇 1 頭插法建立鏈表。 2 尾插法建立鏈表。\n");
scanf("%d",&flag);
if(flag==1)
{ Create_LinkF(L,a,n); }

else if(flag==2)
{ Create_LinkR(L,a,n); } if(ListEmpty(L)==FALSE)
{
printf("該鏈表為:\n");
DispList(L);
}
else if(ListEmpty(L)==TRUE)
{ printf("該鏈表為空!\n"); } printf("該鏈表長度=%d\n",ListLength(L));

printf("請輸入要查找的數:\n");
scanf("%d",&value);
j=LocateElem(L,value,P);
for(i=0;i<j;i++)
printf("%d的下標為:%d \n",value,*(P+i));

printf("請輸入要插入的位置以及要插入的值:\n");
scanf("%d",&i);
scanf("%d",&value);
LinklistInsert(L,i,value);

printf("執行插入操作之後的鏈表為:\n");
DispList(L);

printf("請輸入要刪除數的下標:\n");
scanf("%d",&i);
ListDelete(L,i);
printf("執行刪除操作後的鏈表:\n");
DispList(L);
DestroyList(L);
return 0;
}

老師要我們寫單鏈表基本操作。。。