❶ 急急急!!!!用c語言實現字典 要求:用無序雙向循環鏈表實現字典的基本操作如下
#include <stdafx.h> //這行是VC編譯時要的頭文件,你若TC就不要本行了
#include <stdio.h>
typedef struct dictnode{char *key; char *value; dictnode *pre; dictnode *next;} DictNode;
DictNode *pHead = NULL;
//(1)make:構造空的字典
int make()
{
if(pHead)return -1;
pHead = (DictNode*)malloc(sizeof(DictNode));
memset(pHead,0,sizeof(DictNode));
pHead->pre = pHead;
pHead->next = pHead;
return 0;
}
//(2)size:返回字的字典中記錄數
int size()
{
int i;
DictNode*p;
for(i=0,p=pHead; p->next!=pHead; p=p->next,i++);
return i;
}
//(3)IsEmpy:如果字典為空則返回真,否則返回假
int IsEmpy()
{
return (pHead->pre==pHead);
}
//(4)Clear:將字典重置為空
void Clear()
{
DictNode* p,*ptmp;
for(p=pHead->next; p!=pHead ; )
{
ptmp = p;
p = p->next;
free(ptmp->key);
free(ptmp->value);
free(ptmp);
}
pHead->next = pHead->pre = pHead;//最後一個空節點也是第一個節點
}
//(5)Insert:插入記錄到字典
int Insert(char *key,char*value)
{
DictNode* p, *ptmp;
if(!key||!value||!*key||!*value) return -100;//調用錯誤
ptmp = (DictNode*)malloc(sizeof(DictNode));
if(!ptmp) return -2; //內存不足這種極端的情況很難出現,但有可能
memset(ptmp,0,sizeof(DictNode));
ptmp->key =(char*) malloc(strlen(key)+1);
if(!ptmp->key){free(ptmp);return -2;} //內存不足這種極端的情況很難出現,但有可能
strcpy(ptmp->key,key);
ptmp->value = (char*)malloc(strlen(value)+1);
if(!ptmp->value){free(ptmp->key);free(ptmp); return -2;} //內存不足這種極端的情況很難出現,但有可能
strcpy(ptmp->value,value);
for(p=pHead->next; p->next!=pHead; p=p->next) if(p->key&&!strcmp(p->key,key)) return 1;//記錄存在,插入失敗
ptmp->next = pHead; pHead->pre = ptmp;
ptmp->pre = p; p->next = ptmp;
return 0;//操作成功返回0
}
//(6)remove:與給定關鍵字的記錄相同則刪除,該記錄被返回,否則字典保持不變
DictNode* remove(char *key)
{
DictNode* p;
for(p=pHead->next; p!=pHead&&strcmp(p->key,key); p=p->next);
if(p==pHead) return NULL;
p->pre->next = p->next;
p->next->pre = p->pre;
p->pre = p->next = NULL;
return p;//結點p的空間(key value p三個)沒有釋放,外面要接收返回值並主動釋放結點空間或做別的處理如插入另一表中等
}
//(7)IsPrensent:如果存在與給定關鍵字匹配的記錄則返回真,否則返回假
int IsPrensent(char *key)
{
DictNode* p;
for(p=pHead->next; p!=pHead&&strcmp(p->key,key); p=p->next);
return (p!=pHead);
}
//(8)Find:如果存在與給定關鍵字相同的記錄,則返回記錄;如果沒有找到,則返回空
DictNode* Find(char *key)
{
DictNode* p;
for(p=pHead->next; p!=pHead&&strcmp(p->key,key); p=p->next);
if(p==pHead) return NULL;
return p; //不要對Find返回的記錄key值做變更,value值可以修改,value加長時要重新分配空間。因為記錄還在字典鏈表中
}
void main()
{
const char *prtstr = "****************************";
DictNode* ptmp;
char keybuf[80];
char valuebuf[1024];
int c;
make();
while(1)
{
system("cls");//清屏
printf("%s 選擇菜單 %s",prtstr,prtstr);
printf("\n\tF---詞條查找\n\tI---插入新詞條\n\tR---刪除詞條\n\tC---清空字典\n\tS---顯示字典詞條數\n\tQ---退出\n");
printf("請選擇操作菜單:");
fflush(stdin);
c = getchar();
if(c>='a'&&c<='z') c -= ('a'-'A');//換大寫
if(c!='F'&&c!='I'&&c!='R'&&c!='C'&&c!='S'&&c!='Q') continue;
fflush(stdin);
switch(c)
{
case 'F':
printf("詞條查找:\n請輸入Key值:");scanf("%s",keybuf);
fflush(stdin);
ptmp = Find(keybuf);
if(ptmp){printf("Key:%s Value:%s",ptmp->key,ptmp->value);}
else{printf("沒找到詞條:%s,你可以先選擇插入這個新詞條",keybuf);}
break;
case 'I':
printf("插入新詞條:\n請輸入Key值:");scanf("%s",keybuf);
fflush(stdin);
if(IsPrensent(keybuf)){printf("詞條%s已存在\n",keybuf);}
else
{
printf("請輸入它的解釋:");gets(valuebuf);
if(!Insert(keybuf,valuebuf))printf("插入成功\n");
else printf("插入失敗\n");
}
break;
case 'R':
printf("刪除詞條:\n請輸入Key值:");scanf("%s",keybuf);
fflush(stdin);
ptmp = remove(keybuf);
if(ptmp)
{
free(ptmp->value);free(ptmp->key);free(ptmp);
printf("記錄key:[%s]已刪除\n",keybuf);
}
else
printf("未找到待刪除的記錄key:[%s]\n",keybuf);
break;
case 'C':
printf("清空字典:\n真的要清嗎?\n請輸入Yes以確認刪除操作(首字母大寫):");scanf("%s",keybuf);
fflush(stdin);
if(strcmp(keybuf,"Yes")){printf("放棄了清空操作\n");}
else {Clear();printf("Ok,你堅持操作,現在字典已清空了\n");}
break;
case 'S':
printf("顯示字典詞條數:\n當前詞條總數:%d\n", size());
break;
case 'Q':
Clear(); free(pHead);
printf("Byebye");
exit(0);
}
printf("\n按回車鍵繼續......");
fflush(stdin);
getchar();
}
}
//VC7.1 下調試通過,運行功能正常
❷ c語言各個按鍵的鍵值是什麼
,用它可以獲得鍵盤上按鍵的鍵值,獲得鍵值之後,把它們記住,或者用宏定義,就可以為以後的 判斷語句使用,
for example:
#include<stdio.h>
void main(void)
{
int key=0;
clrscr();
while(key != 0x11b) /*0x11b就是ESC鍵的鍵值,用它來判斷結束,這是我事先知道的,方法是一樣的*/
{
key = bioskey(0);
printf("%x ",key);/*把獲得的鍵值用16進制顯示*/
}
}
❸ C# Dictionary 用法;
C# Dictionary用法總結
1、用法1:常規用
增加鍵值對之前需要判斷是否存在該鍵,如果已經存在該鍵而且不判斷,將拋出異常。所以這樣每次都要進行判斷,很麻煩,在備注里使用了一個擴展方法
publicstaticvoidDicSample1()
{
Dictionary<String,String>pList=newDictionary<String,String>();
try
{
if(pList.ContainsKey("Item1")==false)
{
pList.Add("Item1","ZheJiang");
}
if(pList.ContainsKey("Item2")==false)
{
pList.Add("Item2","ShangHai");
}
else
{
pList["Item2"]="ShangHai";
}
if(pList.ContainsKey("Item3")==false)
{
pList.Add("Item3","BeiJiang");
}
}
catch(System.Exceptione)
{
Console.WriteLine("Error:{0}",e.Message);
}
//判斷是否存在相應的key並顯示
if(pList.ContainsKey("Item1"))
{
Console.WriteLine("Output:"+pList["Item1"]);
}
//遍歷Key
foreach(varkeyinpList.Keys)
{
Console.WriteLine("OutputKey:{0}",key);
}
//遍歷Value
foreach(StringvalueinpList.Values)
{
Console.WriteLine("OutputValue:{0}",value);
}
//遍歷Key和Value
foreach(vardicinpList)
{
Console.WriteLine("OutputKey:{0},Value:{1}",dic.Key,dic.Value);
}
}
2、用法2:Dictionary的Value為一個數組
///<summary>
///Dictionary的Value為一個數組
///</summary>
publicstaticvoidDicSample2()
{
Dictionary<String,String[]>dic=newDictionary<String,String[]>();
String[]ZheJiang={"Huzhou","HangZhou","TaiZhou"};
String[]ShangHai={"Budong","Buxi"};
dic.Add("ZJ",ZheJiang);
dic.Add("SH",ShangHai);
Console.WriteLine("Output:"+dic["ZJ"][0]);
}
3、用法3: Dictionary的Value為一個類
//Dictionary的Value為一個類
publicstaticvoidDicSample3()
{
Dictionary<String,Student>stuList=newDictionary<String,Student>();
Studentstu=null;
for(inti=0;i<3;i++)
{
stu=newStudent();
stu.Name=i.ToString();
stu.Name="StuName"+i.ToString();
stuList.Add(i.ToString(),stu);
}
foreach(varstudentinstuList)
{
Console.WriteLine("Output:Key{0},Num:{1},Name{2}",student.Key,student.Value.Name,student.Value.Name);
}
}
Student類:
publicclassStudent
{
publicStringNum{get;set;}
publicStringName{get;set;}
}
4 備註:Dictionary的擴展方法使用
///<summary>
///Dictionary的擴展方法使用
///</summary>
publicstaticvoidDicSample4()
{
//1)普通調用
Dictionary<int,String>dict=newDictionary<int,String>();
.TryAdd(dict,1,"ZhangSan");
.TryAdd(dict,2,"WangWu");
.AddOrPeplace(dict,3,"WangWu");
.AddOrPeplace(dict,3,"ZhangWu");
.TryAdd(dict,2,"LiSi");
//2)TryAdd和AddOrReplace這兩個方法具有較強自我描述能力,用起來很省心,而且也簡單:
dict.AddOrPeplace(20,"Orange");
dict.TryAdd(21,"Banana");
dict.TryAdd(22,"apple");
//3)像Linq或jQuery一樣連起來寫
dict.TryAdd(10,"Bob")
.TryAdd(11,"Tom")
.AddOrPeplace(12,"Jom");
//4)獲取值
StringF="Ba";
dict.TryGetValue(31,outF);
Console.WriteLine("F:{0}",F);
foreach(vardicindict)
{
Console.WriteLine("Output:Key:{0},Value:{1}",dic.Key,dic.Value);
}
//5)下面是使用GetValue獲取值
varv1=dict.GetValue(111,null);
varv2=dict.GetValue(10,"abc");
//6)批量添加
vardict1=newDictionary<int,int>();
dict1.AddOrPeplace(3,3);
dict1.AddOrPeplace(5,5);
vardict2=newDictionary<int,int>();
dict2.AddOrPeplace(1,1);
dict2.AddOrPeplace(4,4);
dict2.AddRange(dict1,false);
}
擴展方法所在的類
publicstaticclass
{
///<summary>
///嘗試將鍵和值添加到字典中:如果不存在,才添加;存在,不添加也不拋導常
///</summary>
publicstaticDictionary<TKey,TValue>TryAdd<TKey,TValue>(thisDictionary<TKey,TValue>dict,TKeykey,TValuevalue)
{
if(dict.ContainsKey(key)==false)
dict.Add(key,value);
returndict;
}
///<summary>
///將鍵和值添加或替換到字典中:如果不存在,則添加;存在,則替換
///</summary>
publicstaticDictionary<TKey,TValue>AddOrPeplace<TKey,TValue>(thisDictionary<TKey,TValue>dict,TKeykey,TValuevalue)
{
dict[key]=value;
returndict;
}
///<summary>
///獲取與指定的鍵相關聯的值,如果沒有則返回輸入的默認值
///</summary>
publicstaticTValueGetValue<TKey,TValue>(thisDictionary<TKey,TValue>dict,TKeykey,TValuedefaultValue)
{
returndict.ContainsKey(key)?dict[key]:defaultValue;
}
///<summary>
///向字典中批量添加鍵值對
///</summary>
///<paramname="replaceExisted">如果已存在,是否替換</param>
publicstaticDictionary<TKey,TValue>AddRange<TKey,TValue>(thisDictionary<TKey,TValue>dict,IEnumerable<KeyValuePair<TKey,TValue>>values,boolreplaceExisted)
{
foreach(variteminvalues)
{
if(dict.ContainsKey(item.Key)==false||replaceExisted)
dict[item.Key]=item.Value;
}
returndict;
}
}
❹ 為什麼C#的Dictionary的Add函數不是把新的鍵值對添加到字典末尾
各位大俠我也遇到個這么個問題,我把調試過程發下
定義:
是這樣的,Dictionary本身不是有序的,這是正常的
❺ 用C語言寫個具有查字典功能的程序,誰幫我看看哪裡出錯了
fgets(a,1000,fp);是讀取文件而你的文件打開方式確是
fp=fopen("E:\\13計科外包班\\詞典工程\\dict.txt","w");
你是已寫的方式打開的
要改成
fp=fopen("E:\\13計科外包班\\詞典工程\\dict.txt","r");
望樓主採納
❻ 列表中嵌入字典訪問後如何使個鍵值橫排輸出
摘要 字典使用鍵-值(key-value)存儲,具有極快的查找速度。字典和列表不同,字典里的對象是無序的,是通過一對對的鍵和值來反映一種映射關系。
❼ c# 中Dictionary怎麼用
我們用的比較多的非泛型集合類主要有 ArrayList類 和 HashTable類。我們經常用HashTable 來存儲將要寫入到資料庫或者返回的信息,在這之間要不斷的進行類型的轉化,增加了系統裝箱和拆箱的負擔,如果我們操縱的數據類型相對確定的化 用 Dictionary<TKey,TValue> 集合類來存儲數據就方便多了,例如我們需要在電子商務網站中存儲用戶的購物車信息( 商品名,對應的商品個數)時,完全可以用 Dictionary<string, int> 來存儲購物車信息,而不需要任何的類型轉化。
下面是簡單的例子,包括聲明,填充鍵值對,移除鍵值對,遍歷鍵值對
Dictionary<string, string> myDic = new Dictionary<string, string>();
myDic.Add("aaa", "111");
myDic.Add("bbb", "222");
myDic.Add("ccc", "333");
myDic.Add("ddd", "444");
//如果添加已經存在的鍵,add方法會拋出異常
try
{
myDic.Add("ddd","ddd");
}
catch (ArgumentException ex)
{
Console.WriteLine("此鍵已經存在:" + ex.Message);
}
//解決add()異常的方法是用ContainsKey()方法來判斷鍵是否存在
if (!myDic.ContainsKey("ddd"))
{
myDic.Add("ddd", "ddd");
}
else
{
Console.WriteLine("此鍵已經存在:");
}
//而使用索引器來負值時,如果建已經存在,就會修改已有的鍵的鍵值,而不會拋出異常
myDic ["ddd"]="ddd";
myDic["eee"] = "555";
//使用索引器來取值時,如果鍵不存在就會引發異常
try
{
Console.WriteLine("不存在的鍵""fff""的鍵值為:" + myDic["fff"]);
}
catch (KeyNotFoundException ex)
{
Console.WriteLine("沒有找到鍵引發異常:" + ex.Message);
}
//解決上面的異常的方法是使用ContarnsKey() 來判斷時候存在鍵,如果經常要取健值得化最好用 TryGetValue方法來獲取集合中的對應鍵值
string value = "";
if (myDic.TryGetValue("fff", out value))
{
Console.WriteLine("不存在的鍵""fff""的鍵值為:" + value );
}
else
{
Console.WriteLine("沒有找到對應鍵的鍵值");
}
//下面用foreach 來遍歷鍵值對
//泛型結構體 用來存儲健值對
foreach (KeyValuePair<string, string> kvp in myDic)
{
Console.WriteLine("key={0},value={1}", kvp.Key, kvp.Value);
}
//獲取值得集合
foreach (string s in myDic.Values)
{
Console.WriteLine("value={0}", s);
}
//獲取值得另一種方式
Dictionary<string, string>.ValueCollection values = myDic.Values;
foreach (string s in values)
{
Console.WriteLine("value={0}", s);
}
常用的屬性和方法如下: 常用屬性
屬性說明
Comparer
獲取用於確定字典中的鍵是否相等的 IEqualityComparer。
Count
獲取包含在 Dictionary中的鍵/值對的數目。
Item
獲取或設置與指定的鍵相關聯的值。
Keys
獲取包含 Dictionary中的鍵的集合。
Values
獲取包含 Dictionary中的值的集合。
常用的方法 方法說明
Add
將指定的鍵和值添加到字典中。
Clear
從 Dictionary中移除所有的鍵和值。
ContainsKey
確定 Dictionary是否包含指定的鍵。
ContainsValue
確定 Dictionary是否包含特定值。
Equals
已重載。 確定兩個 Object 實例是否相等。 (從 Object 繼承。)
GetEnumerator
返回循環訪問 Dictionary的枚舉數。
GetHashCode
用作特定類型的哈希函數。GetHashCode 適合在哈希演算法和數據結構(如哈希表)中使用。 (從 Object 繼承。)
GetObjectData
實現 System.Runtime.Serialization.ISerializable 介面,並返回序列化 Dictionary實例所需的數據。
GetType
獲取當前實例的 Type。 (從 Object 繼承。)
OnDeserialization
實現 System.Runtime.Serialization.ISerializable介面,並在完成反序列化之後引發反序列化事件。
ReferenceEquals
確定指定的 Object實例是否是相同的實例。 (從 Object 繼承。)
Remove
從 Dictionary中移除所指定的鍵的值。
ToString
返回表示當前 Object的 String。 (從 Object 繼承。)
TryGetValue
獲取與指定的鍵相關聯的值。
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace Test
{
class Program
{
static void Main(string[] args)
{
char[] chars = new char[] { 'a', 'b', 'c', 'a', 'b', 'c', 'c', 'd', 'd', 'e', 'c' };
//存儲字元和字元個數
Dictionary<char, int> dic = new Dictionary<char, int>();
foreach (char c in chars)
{
if (dic.ContainsKey(c))
dic[c] += 1;
else
dic.Add(c, 1);
}
//排序
List<KeyValuePair<char, int>> list = new List<KeyValuePair<char, int>>();
foreach (KeyValuePair<char, int> p in dic)
{
int count = list.Count;
for (int i = 0; i < list.Count; i++)
{
if (p.Value > list[i].Value)
{
list.Insert(i, p);
break;
}
else
{
if (p.Value == list[i].Value)
{
if (p.Key < p.Key)
{
list.Insert(i, p);
break;
}
else
continue;
}
else
continue;
}
}
if (count == list.Count)
list.Add(p);
}
//顯示字元
string s = "";
foreach (KeyValuePair<char, int> p in list)
{
s += new string(p.Key, p.Value);
}
Console.WriteLine(s);
Console.Read();
}
}
}
摘自csdn 希望能幫助你
❽ 怎麼判斷字典是否有某個鍵值 python 3
#dict.values()可以獲取所有的鍵值
d={'1':'a','2':'b','3':'c'}
print(d)
print(d.values())
print('a'ind.values())
print('z'ind.values())
#輸出
{'2':'b','1':'a','3':'c'}
dict_values(['b','a','c'])
True
False
❾ C# 如何通過Key鍵獲取Dictionary集合內的Value
很簡單,這樣的就行:string value=aa["1"];
就可以了,另外告訴你dictionary的時間效率是1,是一個很效率很高的數據結構。
既然時間效率是1,那麼我們定址的時候就是直接定址,也不需要去遍歷dictionary,這就是為什麼鍵必須唯一,不能重復的原因,如果重復了就不可能再是直接定址的方式了。
❿ c++中怎樣讀取python字典,獲得字典中的key值(一個key中有多個值)和value值
因為這本身就不是字元串啊.你可以約定好,在python腳本中將參數先轉換成str,然後C介面這邊也接受字元串入參.