數據結構的概念:
相互之間存在一種或多種特定關系的數據元素的集合。
數據之間關系:
邏輯關系:集合,線性(1對1,中間位置的值有且僅有一個前驅,一個后繼),樹(1對多),圖(多對多)
物理關系:
順序結構(類似于數組):存儲空間連續,有序
鏈表:存儲空間不連續
算法:
對特定問題求解步驟的描述。(類似函數)
算法的特性:輸入輸出特性(輸入可省,輸出必須有,數值的改變就可以稱為輸出),可讀性(便于閱讀), 可行性(可以用代碼執行出來),有窮性(是有限的),確定性(同一個輸入會是同一個輸出)
衡量算法好壞的方法。
時間復雜度,時間的度量(事前分析法) ,大O 記法。
O(1)<O(lgn)<O(N)<O(nLgN)<O(N^2)<O(N^3)
順序表
存儲空間是連續
?特征: ?支持隨機訪問 ? head+5 head[0] O(1)
插入,刪除, 整體移動。 ? O(N)
不具有動態存儲功能。
關于順序表的操作
#include <stdio.h>
#include <stdlib.h>
#include "seqlist.h"
#include <string.h>
int main(int argc, char** argv)
{FILE* fp = fopen("/home/linux/dict.txt","r");if(NULL == fp){perror("fopen");return 1;}SeqList* sl = CreateSeqList(20000);if(NULL == sl){fprintf(stderr,"CreateSeqList error\n");return 1;}while(1){DATATYPE data;char * word=NULL;char* mean=NULL;char linebuf[1024]={0};if(NULL==fgets(linebuf,sizeof(linebuf),fp)){break;}word = strtok(linebuf," ");mean = strtok(NULL,"\r");strcpy(data.word,word);strcpy(data.mean,mean);// strcpy(data->word,word);// strcpy(data->mean,mean);InsertTailSeqList(sl, &data);}while(1){char want_word[50]={0};printf("input word:");fgets(want_word,sizeof(want_word),stdin);// book\nwant_word[strlen(want_word)-1]='\0';if(0==strcmp(want_word,"#quit")){break;}int ret = FindSeqList(sl, want_word);if(-1 == ret){printf("cant find %s\n",want_word);}else {ShowSeqListOne(sl, ret);}}return 0;fclose(fp);DestroySeqList(sl);
}
#include "hwdict.h"
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
SeqList *CreateSeqList(int len)
{SeqList *sl = malloc(sizeof(SeqList));if (NULL == sl){perror("CreateSeqList malloc error\n");return NULL;}sl->head = malloc(sizeof(DATAWORD) * len);if (NULL == sl->head){perror("CreateSeqList malloc2 error\n");return NULL;}sl->tlen = len;sl->clen = 0;return sl;
}void ReadInfo(SeqList *list, char *argv)
{int fd = open(argv, O_RDONLY);if(-1 ==fd){perror("open");exit(1);}char buf[50];char info_buf[500];int i;int flag =1;int ret =0;//while (list->clen < list->tlen)//每一行讀取while(flag){i = 0;while (1){ret = read(fd, &buf[i], 1);if(ret<=0){flag =0;break;}if (buf[i] == ' '){buf[i] = '\0';strcpy(list->head[list->clen].name, buf);break;}i++;}i = 0;while (1){ret= read(fd, &info_buf[i], 1);if(ret<=0){flag =0;break;}if (info_buf[i] == '\n'){info_buf[i] = '\0';strcpy(list->head[list->clen].info, info_buf);break;}i++;}list->clen++;if(list->clen == list->tlen){flag=0;break;}}close(fd);
}int GetSizeSeqList(SeqList *list)
{return list->clen;
}int FindSeqList(SeqList *list, char *name)
{int len = GetSizeSeqList(list);for (int i = 0; i < len; i++){if (0 == strcmp(list->head[i].name, name)){return i;}}return -1;
}
#ifndef _SEQLIST_H_
#define _SEQLIST_H_typedef struct word
{char name[50];char info[500];
} DATAWORD;typedef struct list
{DATAWORD *head;int tlen;int clen;
} SeqList;//創建一個順序表
SeqList *CreateSeqList(int len);void ReadInfo(SeqList *list, char *argv);int GetSizeSeqList(SeqList *list);int FindSeqList(SeqList *list, char *name);
#endif