嚴蔚敏資料結構C語言版 線性表的增删改查功能(完全自己敲的)
/*
嚴蔚敏資料結構C語言版
順序線性表的綜合程式(增删改查)
*/
//頭檔案
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//宏區
#define List_capacity 100 //線性表L的初始容量
#define List_appreciation 10 //線性表L的初始容量不足時配置設定的增量
//結構
typedef struct //結構
{
int *elem; //用于指向動态連續配置設定的存儲空間的首位址
int length; //目前線性表L的長度
int list_size; //目前線性表L的存儲容量
}Sqlist;
//函數區
void List_initialize(Sqlist *L) //線性表L的初始化
{
L->elem = (int *)malloc(List_capacity * sizeof(int)); //配置設定了一段List_capacity動态連續存儲的空間并把首位址發送給L->elem
if (!L->elem)
{
printf("初始化配置設定失敗,檢查程式!\n"); //輸出資訊,出問題時候友善查找問題所在地
exit(1); //非正常退出程式,終止程式
}
else
printf("初始化成功,請繼續下一步操作:\n");
L->length = 0; //未指派,線性表L的初始化長度為0
L->list_size = List_capacity; //記錄已經為線性表L配置設定了List_capacity長度的存儲容量
}
void List_The_default_value(Sqlist *L) //線性表L的預設指派
{
int i, j;
L->elem[0] = NULL; //初始化線性表L的下标為0的元素為0
for (i = 1;i <= 10;i++) //從1開始依次指派給線性表L的每個元素,到10為止
{
L->elem[i] = i; //将i值賦于将下标為i的元素
L->length++; //每指派一個數将線性表L的長度自增一次
if (L->length > L->list_size) //如果線性表L的目前長度大于了線性表L的容量
{
int * new1;
new1 = (int *)realloc(L->elem, (L->length + List_appreciation) * sizeof(int)); //重新配置設定L->elem的存儲空間并臨時用new1指向
if (!new1) //如果配置設定失敗
{
printf("指派時容量不夠,進行增值配置設定但配置設定失敗請檢查程式!\n"); //顯示錯誤,用于友善查找位置
exit(1); //非正常退出程式,終止程式
}
L->elem = new1; //将new1内的位址發送給L->elem使線性表L指向新配置設定的空間
L->list_size = L->length + List_appreciation; //記錄容量
}
}
printf("目前線性表L的元素值為:"); //用于提示使用者線性表L内的值
for (j = 1;j <= L->length;j++) //依次輸出線性表L的值
printf("%d ", L->elem[j]);
printf("\n指派成功請進行下一步操作:\n\n\n"); //指派成功
}
void List_insert(Sqlist *L) //線性表的插入(增)
{
int i, j, e, k;
/* //這個判斷有問題,暫時不清楚!!!!!!!
char val;
printf("是否需要增添值?(Y/N):"); //判斷使用者是否需要添加新值
scanf("%c", &val);
if (val == 'N' || val == 'n') //如果是'Y'或'y'即繼續執行,若是'N'或'n'則傳回主函數
return 0;
printf("\n");
*/
printf("請輸入你要插入的位置:");
scanf("%d", &i); //輸入插入的位置
printf("請輸入你要插入的值為:");
scanf("%d", &j); //輸入插入的值
while (i < 1 || i > L->length) //插入的值不合法,就重新輸入
{
printf("你輸入的值不合法,請重新輸入:\n");
printf("請輸入你要插入的位置:");
scanf("%d", &i);
}
if (L->length >= L->list_size) //如果線性表L的目前長度大于了線性表L的容量
{
int * new1;
new1 = (int *)realloc(L->elem, (L->length + List_appreciation) * sizeof(int)); //重新配置設定L->elem的存儲空間并臨時用new1指向
if (!new1) //如果配置設定失敗
{
printf("指派時容量不夠,進行增值配置設定但配置設定失敗請檢查程式!\n"); //顯示錯誤,用于友善查找位置
exit(1); //非正常退出程式,終止程式
}
L->elem = new1; //将new1内的位址發送給L->elem使線性表L指向新配置設定的空間
L->list_size = L->length + List_appreciation; //記錄容量
printf("\n本次插入,已經超過了原有存儲容量,現已增加容量\n"); //提示使用者增值的操作
}
for (e = L->length;i <= e;e--) //從線性表L最後一個元素開始依次往後移動,直到i的位置空出來
L->elem[e + 1] = L->elem[e]; //将線性表L的最後一個元素向後移動
L->elem[i] = j; //将需要插入的值j插入到指定位置i
L->length++; //記錄長度
printf("插入成功,線性表内的元素為:");
for (k = 1;k <= L->length;k++) //依次列印插值後的線性表L的各個元素
printf("%d ", L->elem[k]); //列印
printf("\n");
}
void List_drop(Sqlist *L) //線性表的删除(删除)
{
int i = 0, j, t, k;
/* //這個判斷有問題,暫時不清楚!!!!!!!
char val;
printf("是否需要删除值?(Y/N):"); //判斷使用者是否需要添加新值
scanf("%c", &val);
if (val == 'N' || val == 'n') //如果是'Y'或'y'即繼續執行,若是'N'或'n'則傳回主函數
return 0;
printf("\n");
*/
printf("請輸入你要删除的值:");
scanf("%d", &j);
printf("删除成功,你删除的值是:%d\n", L->elem[j]);
for (;i <= L->length;i++)
if (L->elem[i] == j)
{
L->elem[i] = NULL;
k = i;
}
for (;k <= L->length;k++) //将删除的位置的下一位依次往前移動
L->elem[k] = L->elem[k + 1];
L->length--; //記錄目前線性表的長度
printf("删除後的線性表的值為:");
for (t = 1;t <= L->length;t++) //依次輸出删除後線性表L的各個元素
printf("%d ", L->elem[t]);
printf("\n");
}
void List_change(Sqlist *L) //線性表的更改(改)
{
int i = 0, j, t, m;
/* //這個判斷有問題,暫時不清楚!!!!!!!
char val;
printf("是否需要更改值?(Y/N):"); //判斷使用者是否需要添加新值
scanf("%c", &val);
if (val == 'N' || val == 'n') //如果是'Y'或'y'即繼續執行,若是'N'或'n'則傳回主函數
return 0;
printf("\n");
*/
printf("輸入更改的位置:");
scanf("%d", &j); //輸入要改的值
printf("輸入要更改成的值:");
scanf("%d", &t); //輸入要改的位置
while (j < 0 && j > L->length) //判斷改的位置是否有誤
{
printf("改的位置有誤,請重新輸入改的位置:");
scanf("%d", &j);
}
L->elem[j] = t; //将需要改的位置上的元素改為j
for (m = 1;m <= L->length;m++) //列印輸出
printf("%d ", L->elem[m]);
printf("\n");
}
void List_examine(Sqlist *L) //線性表的查找(查)
{
int i, j;
/* //這個判斷有問題,暫時不清楚!!!!!!!
char val;
printf("是否需要增添值?(Y/N):"); //判斷使用者是否需要添加新值
scanf("%c", &val);
if (val == 'N' || val == 'n') //如果是'Y'或'y'即繼續執行,若是'N'或'n'則傳回主函數
return 0;
printf("\n");
*/
printf("請輸入你要查找的值:");
scanf("%d", &i);
for (j = 1;j <= L->length;j++)
if (i == L->elem[j])
printf("查找值為:%d,它的位置是:%d\n", i, j);
}
int main(void) //主函數
{
Sqlist L;
List_initialize(&L); //線性表L的初始化
List_The_default_value(&L); //線性表L的預設指派
printf("完全初始化線性表結束,順序線性表(增删改查)功能開始:\n\n\n");
List_insert(&L); //線性表的插入(增)
List_drop(&L); //線性表的删除(删)(删除在表中符合指定的值)
List_examine(&L); //線性表的查找(查)
List_change(&L); //線性表的更改(改)
return 0;
}
我對于一些代碼的了解不是很透徹,就像該文章所一樣的,被我打上注釋的那串代碼,我想着使用者可以自己選擇是否使用該功能,可是很奇怪,會有問題,第一個子產品的詢問是正常的當第二個子產品再次詢問時就直接跳過,這個程式是2星期前敲的,我現在也無法了解。
我能是一名中職生16歲,很遺憾當時沒好好學,不過現在是真的很想提升自己了,我想考本考研不僅僅是對我的改變更多是我可以但我不想在把自己葬送在手上,環境,師資,資源等其實我幾乎都沒有,幾乎是自己一個人慢慢的接受和習慣了,我每天的學習時間是14小時左右,以後也不會變,這篇部落格是我成長的開始
我已經正式接觸軟體程式設計有8個月了吧,我一開始學習的是HTML/CSS/JavaScript,後來遇見了一個很好的指導老師,于是我轉向了後端,
C語言學習了4個月,我大緻算了一下,1360個小時左右因為每天幾乎都是除了吃飯睡覺就是學習這一門,學完後老師讓我學習資料結構,一開始我看的是大話資料結構,1個月左右,大緻300小時,我了解了架構和步驟,但不是很熟練,然後老師讓我在學習C語言,我買了譚浩強的第五版C語言學習把書上的代碼和習題全敲了一遍,後來又不看書去敲了一遍,查漏補缺了很多。
花了很長2個月把,然後老師讓我休息,我其實覺得提升自己是一件很有激情的事情,我很樂意也很願意,與其說休息這就是我自己的休息方式。
放寒假之前一個月我開始學習MYSQL,一直到現在我的計劃主要是這樣的且一直有條有序的執行着:
6:00-7:00 是 補習理論知識(計算機組裝,計算機網絡這些知識一本一本的學)
7:00-10:00 是 MYSQL;
10:00-13:00 是 C++;
14:00 - 16:30 是 C語言的細讀了解每一句話
16:00-18:30 是資料結構嚴蔚敏的
一直到0:00是補習我的數學和英語
連結清單的一些也打了,有時間就記錄發,
我的目前主要方向是C/C++,學習了解好後,大專開始專攻網際網路網站Java web等技術不斷擴充,學習前端,後端,資料庫,架構,UI設計等等都會涉及且對我有用的會重點學習,我一直堅信T型發展才是我的路。
但是,我也很迷茫,我不知道我應該怎樣的系統的規劃和路線去學習Java等後面的路線。但是,我不會停下!我熱愛且不止于熱愛~
且剩餘時間我學習了吉他,鋼琴~
元月底會有演出,雖然是内部的但也證明我不是空談
以下是目前為止記錄的學習時間:
我發這些也許會說我摻水了,但事實勝于雄辯,我每次的記錄都會記錄我的成長,而如何要達到的程度我想我的一切都在表裡了~
謝謝觀看我的第一篇部落格~
再次感謝