這是老師佈置的課本上的作業,歡迎大家一起來交流,很歡迎指點,大一第一次做這種事。我用的課本是浙大的數據結構,陳越和何欽銘出的書,第一篇是順序表的代碼:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MAXSIZE 100
#define ERROR -1
#define NotFound 0
typedef int Position;
struct LNode
{
int *date;
Position Last;
int MaxSize;
};
typedef struct LNode *PtrToLNode;
typedef PtrToLNode List;
void show();
List MakeEmpty(int MaxSize);
Position Find(List L, int X);
bool Insert( List L, int X, int i);
bool Delete(List L, int i);
Position BinarySearch(List L, int X);
void print(List L);
int main()
{
int n=-1, k, X, i, c=0, j=0;
List L = (List)malloc(sizeof(struct LNode));
while(1)
{
if(c==1||j==0)
{
show();
j = 1;
}
scanf("%d", &n);
//system("pause");
if(n>6||n<-1)
{
printf("請輸入合法數字!請選擇菜單序號:");
continue;
}
switch(n)
{
case 1:
{
L = MakeEmpty(MAXSIZE);
if(L)
c=1;
}
break;
case 2:
{
if(1==c)
{
printf("請輸入你要查找的數字:");
scanf("%d", &X);
k = Find(L, X);
if(k==ERROR)
printf("查找無效!重新查詢\n");
else
printf("你查找的數字在第%d個位置上\n", k+1);
}
else
{
printf("失敗!您還未創建表。重新選擇:");
}
}break;
case 3:
{
if(1==c)
{
printf("請輸入你要插入的位置:");
scanf("%d", &i);
printf("請輸入你要插入的數字:");
scanf("%d", &X);
k = Insert( L, X, i);
if(k)
printf("插入成功\n");
else
printf("插入失敗\n");
}
else
{
printf("失敗!您還未創建表。重新選擇:");
}
}break;
case 4:
{
if(1==c)
{
printf("輸入你要刪除的位序號:");
scanf("%d", &i);
k = Delete(L, i);
if(k)
printf("刪除成功!\n");
else
printf("刪除失敗,請輸入合法序號或檢查表容量");
}
else
{
printf("失敗!您還未創建表。重新選擇:");
}
}break;
case 5:
{
if(1==c)
{
printf("請輸入需要查找的數字:");
scanf("%d", &X);
k = BinarySearch(L, X);
if(k)
printf("查找的數字在第%d位置上\n", k+1);
else
printf("查找失敗!\n");
}
else
{
printf("失敗!您還未創建表。重新選擇:");
}
}break;
case 6:
if(1==c)
{
print(L);
}
else
{
printf("失敗!您還未創建表。重新選擇:");
}
break;
}
if( n==0 )
break;
}
}
List MakeEmpty(int MaxSize)//創建順序表
{
List L;
L = (List)malloc(sizeof(struct LNode));
L->date = (int*)malloc(MaxSize*sizeof(int));
L->Last = -1;
int i=0 , n, k=0;
printf("輸入一連串數字,中間用空格分開, 輸入0退出:");
while(1)
{
scanf("%d", &n);
if( n==0 )
break;
L->date[i] = n;
L->Last++;//讓指向最後的那個指針指向最後的一個數據的位置
i++;
k = 1;
}
if(k==1)
printf("創建成功\n\n");
else
printf("創建失敗\n\n");
return L;
}
Position Find(List L, int X)//查找函數
{
Position i=0;
while( i<L->Last&&L->date[i]!=X)
i++;
if( i>L->Last)
return ERROR;
else
return i;
}
bool Insert( List L, int X, int i)//插入函數
{
Position j;
if(L->Last == MAXSIZE-1 )
{
printf("表滿\n");
return false;
}
if(i<1||i>L->Last+2)
{
printf("位序不合法\n");
return false;
}
for( j=L->Last; j>=i-1; j-- )
L->date[j+1] = L->date[j];
L->date[i-1] = X;
L->Last++;
return true;
}
bool Delete(List L, int i)//刪除函數
{
Position j;
if( i<1||i>L->Last+2 )
{
printf("位序%d不存在元素\n", i);
return false;
}
for( j=i; j<=L->Last; j++ )
L->date[j-1] = L->date[j];
L->Last--;
return true;
}
Position BinarySearch(List L, int X)//這裏是二分查找法
{
Position left, right, mid;
left = 0;
right = L->Last;
while(left<=right)
{
mid=(left+right)/2;
if( X<L->date[mid])
right = mid-1;
else if( X>L->date[mid])
left = mid+1;
else
return mid;
}
return NotFound;
}
void print(List L)
{
int i;
printf("該序列爲:");
if( L->Last == -1 )
printf("序列空\n");
else
for( i=0; i<=L->Last; i++)
printf("%d ", L->date[i]);
printf("\n");
}
void show()
{
printf("\n");
printf(" *************順序表*************\n");
printf(" * 1.輸 入 數 字 *\n");
printf(" * 2.查 找 數 字 *\n");
printf(" * 3.插 入 數 字 *\n");
printf(" * 4.刪 除 數 字 *\n");
printf(" * 5.二分法 查找 *\n");
printf(" * 6.查 詢 顯 示 *\n");
printf(" * 0.退 出 系 統 *\n");
printf(" ********************************\n");
printf("請選擇菜單序號:");
}