一、基礎內容
1.數據結構:相互之間存在一種或多種特定關系的數據元素的集合。
2.邏輯結構
(1)集合,所有數據在同一個集合中,關系平等。
(2)線性,數據和數據之間是一對一的關系
(3)樹,?一對多
(4)圖,多對多
3.物理結構(在內存當中的存儲關系)
(1)順序存儲,數據存放在連續的存儲單位中。邏輯關系和物理關系一致
(2)鏈式,數據存放的存儲單位是隨機或任意的,可以連續也可以不連續。
4.算法:是解決特定問題求解步驟的描述,計算機中表現為指令的有限序列,每條指令表示一個或多個操作。
5.算法的特征
1,輸入,輸出特性,輸入時可選的,輸出時必須的。
2,有窮性,執行的步驟會自動結束,不能是死循環,并且每一步是在可以接受的時間內完成。
3,確定性,同一個輸入,會得到唯一的輸出。
4,可行性,每一個步驟都是可以實現的。
6.算法的設計
(1)正確性,
????????1)語法正確
????????2)合法的輸入能得到合理的結果。
????????3)對非法的輸入,給出滿足要求的規格說明
????????4)對精心選擇,甚至刁難的測試都能正常運行,結果正確
(2)可讀性,便于交流,閱讀,理解
(3)健壯性,輸入非法數據,能進行相應的處理,而不是產生異常
(4)高效,存儲低,效率高?
7.算法時間復雜度:也就是執行這個算法所花時間的度量
8.推導時間復雜度
(1)用常數1?取代運行時間中的所有加法常數
(2)在修改后的運行函數中,只保留最高階項。
(3)如果最高階存在且不是1,則取除這個項相乘的常數。
二、線性表
1.定義:零個或者多個數據元素的有限序列;
2.特征
(1)元素之間是有順序了。如果存在多個元素,第一個元素無前驅,最有一個沒有后繼,其他的元素只有一個前驅和一個后繼。
(2)當線性表元素的個數n(n>=0)定義為線性表的長度,當n=0時,為空表。在非空的表中每個元素都有一個確定的位置,如果a1是第一個元素,那么an就是第n個元素。
3.線性表的常規操作??ADT
typedef?struct person?{
char?name[32];
char?sex;
int?age;
int?score;
}DATATYPE;
typedef?int?Datatype;
typedef?struct?list?{
DATATYPE?*head;
int?tlen;
int?clen;
}SeqList;
SeqList?*CreateSeqList(int?len);
int?DestroySeqList(SeqList?*list);
int?ShowSeqList(SeqList?*list);
int?InsertTailSeqList(SeqList?*list,?DATATYPE?data);
int?IsFullSeqList(SeqList?*list);
int?IsEmptySeqList(SeqList?*list);
int?InsertPosSeqList(SeqList?*list,?DATATYPE?data,?int?pos);
int?FindSeqList(SeqList?*list,?char?*name);
int?ModifySeqList(SeqList?*list,?char?*old,?DATATYPE?new);
int?DeleteSeqList(SeqList?*list,?char?*name);
int?ClearSeqList(SeqList?*list);
4.手撕上述代碼
(1)seqlist.h
#ifndef _SEQLIST_H_
#define _SEQLIST_H_typedef struct person {char name[32];char sex;int age;int score;
}DATATYPE;
typedef struct list {DATATYPE *head;int tlen;int clen;
}SeqList;SeqList *CreateSeqList(int len);
int DestroySeqList(SeqList *list);
int ShowSeqList(SeqList *list);
int InsertTailSeqList(SeqList *list, DATATYPE* data);
int IsFullSeqList(SeqList *list);
int IsEmptySeqList(SeqList *list);
int InsertPosSeqList(SeqList *list, DATATYPE *data, int pos);
int FindSeqList(SeqList *list, char *name);
int ModifySeqList(SeqList *list, char *old, DATATYPE *newdata);
int DeleteSeqList(SeqList *list, char *name);
int ClearSeqList(SeqList *list);
int GetSizeSeqList(SeqList *list);
DATATYPE * GetItemSeqList(SeqList*list,int ind);
#endif // !1
(2)seqlist.c
#include "seqlist.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>SeqList *CreateSeqList(int len)
{SeqList *sl = malloc(sizeof(SeqList));if(NULL == sl){fprintf(stderr,"CreateSeqList malloc error\n");return NULL;}sl->head = malloc(sizeof(DATATYPE)*len);if(NULL == sl->head){fprintf(stderr,"CreateSeqList malloc2 error\n");return NULL;}sl ->tlen = len;sl ->clen = 0;return sl;}int IsFullSeqList(SeqList *list)
{if(NULL == list){fprintf(stderr,"IsFullSeqList paramter erro\n");return 1; }return list->clen == list->tlen;
}int InsertTailSeqList(SeqList *list, DATATYPE *data)
{if(IsFullSeqList(list)){fprintf(stderr,"seqlist full\n");return 1;}memcpy(&list->head[list->clen],data,sizeof(DATATYPE));list->clen++;return 0;//list->head[list -> clen]= *data;
}
int ShowSeqList(SeqList *list)
{int len = GetSizeSeqList(list);int i;for(i = 0;i<len;++i){printf("%s %c %d %d\n",list->head[i].name,list->head[i].sex,list->head[i].age,list->head[i].score);}
}
int GetSizeSeqList(SeqList *list)
{return list->clen;
}
int IsEmptySeqList(SeqList *list)
{return 0 == list->clen;
}
int FindSeqList(SeqList *list, char *name)
{int i=0;int len = GetSizeSeqList(list);for(i=0;i<len;++i){if(0 ==strcmp(list->head[i].name,name)){return i;}}return -1;
}
DATATYPE *GetItemSeqList(SeqList *List,int ind)
{if(NULL ==List){return NULL;}int len = GetSizeSeqList(List);if(ind < 0||ind >=len){return NULL;}return &List->head[ind];
}
int InsertPosSeqList(SeqList *list, DATATYPE *data, int pos)
{if(IsFullSeqList(list)){return 1;}int len = GetSizeSeqList(list);if(pos<0||pos>len){return 1;;}int i=0;for(i = list->clen;i > pos;--i){memcpy(&list->head[i],&list->head[i-1],sizeof(DATATYPE));}memcpy(&list->head[pos], data,sizeof(DATATYPE));list->clen++;return 0;
}
int DeleteSeqList(SeqList *list, char *name)
{if (IsEmptySeqList(list)){return 1;} int vel=FindSeqList(list,name);int vel=FindSeqList(list,name);if(-1 == vel){return 1;}int i;int len = GetSizeSeqList(list);for(i=vel;i<=list->clen;++i){memcpy(&list->head[i], &list->head[i+1],sizeof(DATATYPE));}list->clen -=1;// list->clen++;return 0;
}
int ClearSeqList(SeqList *list)
{return list->clen = 0;
}
int ModifySeqList(SeqList *list, char *old, DATATYPE *newdeta)
{if (IsEmptySeqList(list)){return 1;} int vel=FindSeqList(list,old);if(-1 == vel){return 1;}memcpy(&list->head[vel], newdeta, sizeof(DATATYPE));return 0;
}
int DestroySeqList(SeqList *list)
{if(NULL == list){return 1;}free(list->head);free(list);return 0;
}
(3)main.c
#include "seqlist.h"
#include<stdio.h>
int main(int argc,char **argv)
{SeqList *s1 = CreateSeqList(5);DATATYPE data[]={{"zhangsan",'F',20,80},{"san",'M',21,81},{"zhan",'F',41,85},{"gsan",'M',35,82},{"an",'M',22,90},};InsertTailSeqList(s1,&data[0]);InsertTailSeqList(s1,&data[1]);InsertTailSeqList(s1,&data[2]);ShowSeqList(s1);printf("***************shan***\n");DeleteSeqList(s1, "zhangsan");// InsertPosSeqList(s1, &data[2],3);ShowSeqList(s1);// int ret = FindSeqList(s1,"zhangsan");// if(-1 ==ret)// {// printf("not found");// }// else// {// DATATYPE *tmp = GetItemSeqList(s1,ret);// printf("%s %d\n",tmp->name,tmp->score);// }return 0;
}
5.線性表順序存儲的優點,缺點
(1)優點
????????1)無需為表中的邏輯關系增加額外的存儲空間
????????2)可以快速隨機訪問元素O(1)
(2)缺點
????????1)插入,刪除元素需要移動元素o(n)
????????2)無法動態存儲。
三、vs—code的一些操作
(1)表頭結果:放數組的狀態信息,head:數組名,是指針指向首元素地址;tlen:總長度;clen:當前長度,代表使用的有效長度;
- sudo:以管理員的
- ping www.baidu.com:計算機是否聯上網
- 虛擬機快速上網步驟:虛擬機—》配置-網絡適配器-選地址轉換NAT(windows能上網虛擬機就可以上網)-ifconfig-看ens的名字(一般是33)-sudo vi /etc/network/interfaces-1回車