c 語言:一個連結串列的實現
#include <stdlib.h>
typedef int ElementType;
typedef int BOOL;
#define TRUE 1
#define FALSE 0
inline BOOL compare(int a,int b,BOOL flag)
{
if(( a > b && !flag)||( a < b && flag))
return TRUE;
else
return FALSE;
}
typedef struct LNode
{
ElementType data;
struct LNode * next;
} LinkList;
LinkList * CreateList()
{
LinkList * L;
LinkList * r;
LinkList * s;
int length;
ElementType e;
printf("Please Enter The Length:");
scanf("%d",&length);
L = (LinkList *)malloc(sizeof(LinkList));
L->next = NULL;
L->data = length; // L的data域儲存連結串列的長度
r = L;
printf("Please Enter The Data:");
int i;
for(i = 0;i < length;i++)
{
s = (LinkList *)malloc(sizeof(LinkList));
scanf("%d",&e);
s->data = e;
r->next = s;
r = s;
}
r->next = NULL;
return L;
}
void ListInsert(LinkList * L)
{
ElementType e;
int position;
printf("Please Enter The Insert Position:");
scanf("%d",&position);
if(position > L->data + 1 ||position < 0)
{ printf("Illgal Insert Position !\n"); return;}
printf("Please Enter The Data To Insert:");
scanf("%d",&e);
LinkList * p = L;
LinkList * s;
s = (LinkList *)malloc(sizeof(LinkList));
s->data = e;
int i;
for( i = 0;i < position - 1;i++)
p = p->next;
s->next = p->next;
p->next = s;
L->data++; // L的長度增加1
}
void ListDelete(LinkList * L)
{ int position;
printf("Please Enter The Delete Position");
scanf("%d",&position);
if(position > L->data||position < 0)
{printf("Illgal Delete Position !\n"); return;}
LinkList * p = L;
LinkList * r = p;
int i;
for( i = 0; i < position -1;i++)
p = p->next;
r = p->next;
p->next = r->next;
free(r);
L->data--; //L的長度減小1
}
void BubbleSort(LinkList * L)
{
if(L->data <= 1)
return;
LinkList * pre;
LinkList * p;
LinkList * s;
int i,j;
BOOL flag,change;
printf("Please Choice up Or down: ");
scanf("%d",&flag);
for( i = 0; i < L->data - 1; i++)
{
pre = L;
p = pre->next;
s = p->next;
change = FALSE;
for( j = 0; j < L->data - i -1; j++)
{
if(compare(p->data,s->data,flag))
{
pre->next = s;
p->next = s->next;
s->next = p;
change = TRUE;
}
pre = pre->next;
p = pre->next;
s = p->next;
}
if(!change) break;
}
}
int FindElement(LinkList * L)
{
ElementType e;
printf("Please Enter The Element To Find:");
scanf("%d",&e);
LinkList * p = L;
int i = 0;
while(p != NULL&&p->data != e)
{
p = p->next;
i++;
}
if( i > L->data)
return -1;
else
return i;
}
BOOL GetElement(LinkList * L,ElementType * eptr)
{
int position;
printf("Please Enter The Element Position:");
scanf("%d",&position);
LinkList * p = L;
if(position < 0|| position > L->data)
{
printf("Illegal Position Entered!\n");
return FALSE;
}
else
{ int i;
for( i = 0; i < position; i++)
p = p->next;
*eptr = p->data;
return TRUE;
}
}
/*
ElementType * GetElement(LinkList * L)
{
int position;
ElementType * eptr;
printf("Please Enter The Element Position:");
scanf("%d",&position);
LinkList * p = L;
if(position < 0|| position > L->data)
{
printf("Illegal Position Entered!\n");
exit(0);
}
else
{ int i;
for( i = 0; i < position; i++)
p = p->next;
*eptr = p->data;
return eptr;
}
}
BOOL GetElement(LinkList * L,ElementType ** eptr)
{
int position;
printf("Please Enter The Element Position:");
scanf("%d",&position);
LinkList * p = L;
if(position < 0|| position > L->data)
{
printf("Illegal Position Entered!\n");
return FALSE;
}
else
{ int i;
for( i = 0; i < position; i++)
p = p->next;
*eptr = &(p->data);
return TRUE;
}
}
*/
void DisplayList(LinkList * L)
{
LinkList * p = L->next;
printf("The Length Of The LinkList is:%d\n",L->data);
while(p!=NULL)
{
printf("%d ",p->data);
p = p->next;
}
}
void DistroyList(LinkList * L)
{
LinkList * p = L->next;
LinkList * pre = L;
while(p!=NULL)
{
free(pre);
pre = p;
p = p->next;
}
free(pre);
}
int main()
{
LinkList * linklist = CreateList();
int choice;
while(choice != -1)
{
printf("Please Enter Choice:1.Insert 2.Delete 3.Display 4.Bubble Sort 5.FindElement 6.GetElement -1.Quit\n");
scanf("%d",&choice);
switch(choice)
{
case 1:printf("Insert\n");ListInsert(linklist);break;
case 2:printf("Delete\n");ListDelete(linklist);break;
case 3:printf("Display\n");DisplayList(linklist);break;
case 4:printf("BubbleSort: 0 up 1 down\n");BubbleSort(linklist);break;
case 5:printf("FindElement:\n");printf("%d", FindElement(linklist));break;
case 6:printf("GetElement:\n");ElementType e; if(GetElement(linklist,&e)) printf("%d",e);break;
case -1:printf("Quit\n");break;
default:
printf("Please Enter A Leagal Choice!\n");
break;
}
printf("\n");
}
DistroyList(linklist);
return 0;
}
/* 寫程式時的一些收穫
1.c語言函式沒有引用傳遞,只能按值傳遞。在函式內的指標操作比C++要複雜。
2.for(int i = 0;i < length;i++) 這種寫法在C89下無法編譯通過。
3.if(length <= 1); if條件語句後多加一個分號,等同於空語句,編譯器不會報錯。
*/