删除数组中的空元素

How do I remove empty elements from an array in JavaScript?

Is there a straightforward way, or do I need to loop through it and remove them manually?

转载于:https://stackoverflow.com/questions/281264/remove-empty-elements-from-an-array-in-javascript

csdnceshi55
~Onlooker It would be helpful if your question had specified exactly what you mean by "empty elements", since most of the answers here interpret that incorrectly (IMHO) to mean "falsey" elements. NB: there is a difference between what you get for var a = [,,] and var a = [undefined, undefined]. The former is truly empty, but the latter actually has two keys, but with undefined values.
大约 4 年之前 回复

29个回答

EDIT: This question was answered almost 9 year ago, when there were not much useful built-in methods in the Array.prototype.

Now, certainly I would just recommend you to use the filter method.

Take in mind that this method will return you a new array with the elements that pass the criteria of the callback function you provide to it, for example, if you want to remove null or undefined values:

var array = [0, 1, null, 2, "", 3, undefined, 3,,,,,, 4,, 4,, 5,, 6,,,,];

var filtered = array.filter(function (el) {
  return el != null;
});

console.log(filtered);

It will depend on what you consider to be "empty", for example if you were dealing with strings, the above function wouldn't remove elements that are an empty string.

One common pattern that I see often used is to remove elements that are falsy, which include an empty string "", 0, NaN, null, undefined, and false.

You can simply pass to the filter method, the Boolean constructor function, or simply return the same element in the filter criteria function, for example:

var filtered = array.filter(Boolean);

Or

var filtered = array.filter(function(el) { return el; });

In both ways this works because the filter method in the first case, calls the Boolean constructor as a function, converting the value, and in the second case, the filter method internally converts the return value of the callback implicitly to Boolean.

If you are working with sparse arrays, and you are trying to get rid of the "holes", you can simply use the filter method passing a callback that returns true, for example:

var sparseArray = [0, , , 1, , , , , 2, , , , 3],
    cleanArray = sparseArray.filter(function () { return true });

console.log(cleanArray); // [ 0, 1, 2, 3 ]

Old answer: Don't do this!

I use this method, extending the native Array prototype:

Array.prototype.clean = function(deleteValue) {
  for (var i = 0; i < this.length; i++) {
    if (this[i] == deleteValue) {         
      this.splice(i, 1);
      i--;
    }
  }
  return this;
};

test = new Array("", "One", "Two", "", "Three", "", "Four").clean("");
test2 = [1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,];
test2.clean(undefined);

Or you can simply push the existing elements into other array:

// Will remove all falsy values: undefined, null, 0, false, NaN and "" (empty string)
function cleanArray(actual) {
  var newArray = new Array();
  for (var i = 0; i < actual.length; i++) {
    if (actual[i]) {
      newArray.push(actual[i]);
    }
  }
  return newArray;
}

cleanArray([1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,]);
</div>
csdnceshi65
larry*wei you're right, I have updated the answer, it has been almost 10 years!
一年多之前 回复
csdnceshi75
衫裤跑路 Nowadays this shouldn't be the accepted answer
一年多之前 回复
csdnceshi56
lrony* Another short and beautiful way using ECMA 5 could be [1, 2,,, 3,,,,,,,,, 4,, 4,,, 5,,, 6,,,,,].filter( e => e !== ('' || null || undefined))
一年多之前 回复
csdnceshi52
妄徒之命 downvote because its outdated. you can do this with a oneliner nowadays. const filteredArray = unfilteredArray.filter(item => *condition to keep item in array*)
一年多之前 回复
csdnceshi54
hurriedly% no, in modern code you should safely extend Array.prototype using Object.defineProperty to make the new function a non-enumerable property and then avoid the performance hit caused by putting .hasOwnProperty in every loop.
4 年多之前 回复
weixin_41568208
北城已荒凉 WARNING: the first method could make for (i in array) to fail. To prevent it you should place a if (array.hasOwnProperty(i)) { inside the loop.
4 年多之前 回复
csdnceshi54
hurriedly% I can't believe how many votes this and the 2nd answer are getting. Neither actually answer the question that was asked.
大约 5 年之前 回复
weixin_41568196
撒拉嘿哟木头 your suggestion didn't work for me. I tried results['data'] = results['data'].slice(0); and results['data'] still contains null values
5 年多之前 回复
csdnceshi59
ℙℕℤℝ Also, you could write your loop a bit more performant by avoiding counting array elements on every loop like so: for(var i = 0, j = actual.length; i<j; i++)
接近 7 年之前 回复
csdnceshi78
程序go i love how so many of those best answers are native extensions while so many people preach how evil it is
接近 7 年之前 回复
csdnceshi54
hurriedly% - on all apart from the newest browsers #2 will have the best performance, because arrays in JS aren't really arrays. The splice call is really expensive on older browsers because they have to renumber all of the array keys to close up the gap.
接近 9 年之前 回复
csdnceshi79
python小菜 And what has the best performance? 1) or 2) approach? (or something like jQuery.grep() / Array.filter )
大约 10 年之前 回复
csdnceshi63
elliott.david Your first solution is really nice if you don't have access to the "filter" method. Else I believe Alnitak's answer is better.
11 年多之前 回复
csdnceshi61
derek5. I realize that - which is why I only spoke of the second option. As for the first one, it is so narrow in scope that I would hesitate to make it part of the Array's prototype. See Alnitak's answer on this page for something that would be more ideal. Yours does allow for chaining though, obviously.
11 年多之前 回复
csdnceshi65
larry*wei Yes the second method, but the first one you pass the value of the elements that you want to delete [null,,,0,,0,0,0,false,null,0].clean(null) == [0,0,0,0,false,0]
11 年多之前 回复
csdnceshi61
derek5. WARNING: The 2nd option will remove any elements from an array considered "falsy," i.e. the values of false, 0, null & undefined. This array would end up with nothing at all in it: [null,,,0,,0,0,0,false,null,0] even though I might want the elements with values of 0, as in this array: [1,0,1,0,0,1]
11 年多之前 回复
csdnceshi57
perhaps? Could clone it and return that instead...
11 年多之前 回复

If you've got Javascript 1.6 or later you can use Array.filter using a trivial return true callback function, e.g.:

arr = arr.filter(function() { return true; });

since .filter automatically skips missing elements in the original array.

The MDN page linked above also contains a nice error-checking version of filter that can be used in JavaScript interpreters that don't support the official version.

Note that this will not remove null entries nor entries with an explicit undefined value, but the OP specifically requested "missing" entries.

csdnceshi68
local-host Awesome, it is work properly.
大约 2 年之前 回复
csdnceshi60
℡Wang Yan you've completely missed my point. The OP asked to remove missing entries, whilst the bulk of the answers here (incorrectly) remove any "falsey" entries.
3 年多之前 回复
csdnceshi70
笑故挽风 To remove undefined or null entries, just make a small modification... arr = arr.filter(function(v) { return v; });
3 年多之前 回复
csdnceshi66
必承其重 | 欲带皇冠 Array.filter is ES5 and works on IE9 and up.
4 年多之前 回复
csdnceshi60
℡Wang Yan I've clarified - the code above does work to remove entries for which no value exists at all, which (I've subsequently) learnt is semantically different to the case of a key that exists but which has undefined as its given value.
5 年多之前 回复
weixin_41568127
?yb? Yes, won't work. Seems that as long as it's not undefined, it's true.
5 年多之前 回复
weixin_41568184
叼花硬汉 Not working for me on the latest version of Chrome
5 年多之前 回复
weixin_41568196
撒拉嘿哟木头 +1 As Alnitak said, they have the code that can be used in the case of not having js 1.6 available
接近 10 年之前 回复
weixin_41568183
零零乙 Yeah, it works - but not all browsers have JavaScript 1.6, so it's only that good.
11 年多之前 回复
csdnceshi55
~Onlooker You're right! It can be so simple as this (and works!): test3 = [1,2,,3,,3,,,,7,,,7,,,0,,,4,,4,,5,,6,,undefined,,null,,]; printp( "Using array's native filtering: ", test3.filter( function(value){return (value==undefined) ? 0 : 1;} ) );
11 年多之前 回复

If you need to remove ALL empty values ("", null, undefined and 0):

arr = arr.filter(function(e){return e}); 

To remove empty values and Line breaks:

arr = arr.filter(function(e){ return e.replace(/(\r\n|\n|\r)/gm,"")});

Example:

arr = ["hello",0,"",null,undefined,1,100," "]  
arr.filter(function(e){return e});

Return:

["hello", 1, 100, " "]

UPDATE (based on Alnitak's comment)

In some situations you may want to keep "0" in the array and remove anything else (null, undefined and ""), this is one way:

arr.filter(function(e){ return e === 0 || e });

Return:

["hello", 0, 1, 100, " "]
csdnceshi75
衫裤跑路 OR use var myarr=[1, 2,, 3,, 3,undefined,,"",,0, 4,, 4,, 5,, 6,,,,].filter(Boolean); removes undefined,"" and 0
接近 4 年之前 回复
csdnceshi76
斗士狗 Nice and elegant. +1
大约 4 年之前 回复
csdnceshi51
旧行李 it all depends on how you define "empty". I updated my answer based in your comment. Thanks!
大约 5 年之前 回复
csdnceshi77
狐狸.fox Doesn't actually answer the question that was asked.
大约 5 年之前 回复
csdnceshi59
ℙℕℤℝ Please note that !!e will include NaN (unlike 0) whereous e would not (like 0).
大约 5 年之前 回复
csdnceshi61
derek5. The test function could be a little more explicit: function(e){return !!e}
5 年多之前 回复
weixin_41568196
撒拉嘿哟木头 Yup this is nice cuz removes "" as well.
大约 7 年之前 回复

Simply one liner:

[1, false, "", undefined, 2].filter(Boolean); // [1, 2]

or using underscorejs.org:

_.filter([1, false, "", undefined, 2], Boolean); // [1, 2]
// or even:
_.compact([1, false, "", undefined, 2]); // [1, 2]
weixin_41568184
叼花硬汉 Will fail both if there is value 0 in the array
大约 3 年之前 回复
csdnceshi60
℡Wang Yan all JS constructors are functions - what matters is whether they also permit themselves to be called without new or not. Boolean does, as do the other standard types, but typically a browser's DOM functions do not.
4 年多之前 回复
csdnceshi62
csdnceshi62 No idea what you're saying, @null.
大约 5 年之前 回复
csdnceshi56
lrony* Im just gonna leave this here, (true).constructor === Boolean. And then tell me if we can do this with other build-ins in JS. ;)) (of course excluted the other 5 build-in constructors. (String, Array, Object, Function, Number))
大约 5 年之前 回复
csdnceshi62
csdnceshi62 You're not treating Boolean as a function; it is a function. (A completely normal function, except that it's natively-implemented.) Somebody needs to do a little research on the JavaScript object model. ;)
大约 5 年之前 回复
csdnceshi56
lrony* If you treat Boolean as a function it will simply return true or false wether the value is truly/falsy.
大约 7 年之前 回复
csdnceshi61
derek5. This is really cool - I have a newb question though: it looks like you're using a class name as a function call -- is that typecasting? I haven't seen this before and am not sure I get why passing Boolean works as a function...
大约 7 年之前 回复

I'm simply adding my voice to the above “call ES5's Array..filter() with a global constructor” golf-hack, but I suggest using Object instead of String, Boolean, or Number as suggested above.

Specifically, ES5's filter() already doesn't trigger for undefined elements within the array; so a function that universally returns true, which returns all elements filter() hits, will necessarily only return non-undefined elements:

> [1,,5,6,772,5,24,5,'abc',function(){},1,5,,3].filter(function(){return true})
[1, 5, 6, 772, 5, 24, 5, 'abc', function (){}, 1, 5, 3]

However, writing out ...(function(){return true;}) is longer than writing ...(Object); and the return-value of the Object constructor will be, under any circumstances, some sort of object. Unlike the primitive-boxing-constructors suggested above, no possible object-value is falsey, and thus in a boolean setting, Object is a short-hand for function(){return true}.

> [1,,5,6,772,5,24,5,'abc',function(){},1,5,,3].filter(Object)
[1, 5, 6, 772, 5, 24, 5, 'abc', function (){}, 1, 5, 3]
csdnceshi50
三生石@ I prefer the shortest, and clearest, solution, except in tight-loops. Personal preference, I suppose. (=
大约 5 年之前 回复
csdnceshi64
游.程 Nice answer, although I wonder about the performance overhead of calling the Object constructor as opposed to the return true method. @robocat the OP asked for empty elements to be removed, not nulls.
大约 5 年之前 回复
weixin_41568183
零零乙 BEWARE: filter(String) and filter(Object) do not filter out null or numbers. Because a constructor is also a function you can pass String to filter i.e. someArray.filter(String); is actually equivalent to someArray.filter(function(x){ return String(x); });. If you want to remove all falsy values someArray.filter(Boolean); works to remove 0, -0, NaN, false, '', null, and undefined.
大约 7 年之前 回复

@Alnitak

Actually Array.filter works on all browsers if you add some extra code. See below.

var array = ["","one",0,"",null,0,1,2,4,"two"];

function isempty(x){
if(x!=="")
    return true;
}
var res = array.filter(isempty);
document.writeln(res.toJSONString());
// gives: ["one",0,null,0,1,2,4,"two"]  

This is the code you need to add for IE, but filter and Functional programmingis worth is imo.

//This prototype is provided by the Mozilla foundation and
//is distributed under the MIT license.
//http://www.ibiblio.org/pub/Linux/LICENSES/mit.license

if (!Array.prototype.filter)
{
  Array.prototype.filter = function(fun /*, thisp*/)
  {
    var len = this.length;
    if (typeof fun != "function")
      throw new TypeError();

    var res = new Array();
    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this)
      {
        var val = this[i]; // in case fun mutates this
        if (fun.call(thisp, val, i, this))
          res.push(val);
      }
    }

    return res;
  };
}
csdnceshi65
larry*wei no, it shouldn't, because an element with an empty string in it is not the same as an "empty element", the latter being what the OP asked for.
大约 5 年之前 回复
csdnceshi78
程序go This should be the accepted answer, as it works out of the box. Thanks very much.
5 年多之前 回复
csdnceshi65
larry*wei yes, that's exactly what I said in my answer.
接近 10 年之前 回复

This works, I tested it in AppJet (you can copy-paste the code on its IDE and press "reload" to see it work, don't need to create an account)

/* appjet:version 0.1 */
function Joes_remove(someArray) {
    var newArray = [];
    var element;
    for( element in someArray){
        if(someArray[element]!=undefined ) {
            newArray.push(someArray[element]);
        }
    }
    return newArray;
}

var myArray2 = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];

print("Original array:", myArray2);
print("Clenased array:", Joes_remove(myArray2) );
/*
Returns: [1,2,3,3,0,4,4,5,6]
*/
csdnceshi50
三生石@ This only appears to work "by accident", since it's the act of enumerating the keys via for ... in that actually causes the skipping of missing elements. The test for undefined only serves to remove real elements that are explicitly set to that value.
大约 4 年之前 回复

What about this(ES6) : To remove Falsy value from an array.

var arr = [0,1,2,"test","false",false,true,null,3,4,undefined,5,"end"];

arr.filter((v) => (!!(v)==true));

//output:

//[1, 2, "test", "false", true, 3, 4, 5, "end"]

What about that:

js> [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,].filter(String).join(',')
1,2,3,3,0,4,4,5,6
csdnceshi77
狐狸.fox join() === join(',') :)
大约 9 年之前 回复

For removing holes, you should use

arr.filter(() => true)
arr.flat(0) // Currently stage 3, check compatibility before using this

For removing hole, and, falsy (null, undefined, 0, -0, NaN, "", false, document.all) values:

arr.filter(x => x)

For removing hole, null, and, undefined:

arr.filter(x => x != null)

arr = [, null, (void 0), 0, -0, NaN, false, '', 42];
console.log(arr.filter(() => true)); // [null, (void 0), 0, -0, NaN, false, '', 42]
console.log(arr.filter(x => x)); // [42]
console.log(arr.filter(x => x != null)); // [0, -0, NaN, false, "", 42]

</div>
weixin_41568208
北城已荒凉 holes are unfilled array items ie [, ,]
接近 2 年之前 回复
csdnceshi78
程序go This should be high up in the answer. Can you expand what you mean by holes/hole ..?
大约 2 年之前 回复
共29条数据 1 3 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C++栈的运算求大佬帮忙
设计一个(整数)栈类Stack(用数组实现),成员函数(方法)主要有:构造函数,析构函数(如果需要),栈的运算(判栈满、栈空、返回栈顶元素、元素压入栈顶、删除栈顶元素)
CArray 模板类中想删除元素,但是不想让数组移位怎么办
我用MFC CArray模板类来绘制了一个波形图,我想让这个波形图刷新,设置一个缺口刷新, 缺口往右走,边走边刷新,而且只刷新缺口左右的数据,就像数字示波器那样,有个亮点在不停的跑动刷新,而且只有亮点左右刷新。 我用的是双缓冲绘图。我现在就像像上面一样绘图刷新,但是当我使用Add()后不使用RemoveAt()的话绘图就会失败,当我用RemoveAt()后整个波形就会移动的刷新。 可不可以有一种方法或者结构,我把数据一个一个装进去,到绘图的时候拿出来,并且随着缺口的跑动,我删除相应的数据,但是剩下的数据不要占用这个空的地方,也就是不要移位,这样绘图就会呈现出边跑动边刷新波形了。但是怎么办呢? 各位大神帮帮忙吧
c++程序填空求大佬帮忙
整数栈2(用动态数组实现) 描述 设计一个(整数)栈类Stack(用动态数组实现),成员函数(方法)主要有: 构造函数,析构函数,栈的运算(判栈满、判栈空、返回栈顶元素、元素压入栈顶、返回并删除栈顶元素), 可以设计其它你自己认为必要的方法并进行充分的测试。 #include<iostream> using namespace std; //自定义整数栈类(用动态数组实现) _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ ...... _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ //输出栈的所有元素 void showStack(Stack &s) { int x; for (int i=0;i<=s.getMaxTop();i++) { //获得栈(顶)元素并存入x中 if (_____________) cout<<x<<' '; else cout<<"Stack is empty.\n"; //删除栈(顶)元素并存入x中 if (_____________) cout<<x<<endl; else cout<<"Stack is empty.\n"; } } int main() { int i,n,x; cin>>n; //定义一个栈最多可以存放n个元素 ______________________________; for (i=0;i<=s.getMaxTop();i++) { cin>>x; //元素x压入栈(顶) if (!________________) { cout<<"Stack is full.\n"; } } cout<<endl; //用默认长度构造2个整数栈s1和s2 _______________________________; s2=s1=s; //使用赋值运算 //用栈s2构造s3(会调用拷贝构造函数) Stack s3(s2); showStack(s); cout<<endl; showStack(s1); cout<<endl; showStack(s3); cout<<endl; //s2.showStatus(); return 0; } 输入 第1行:正整数n(栈的大小) 第2~m行:n个将入栈的整数和1个额外用于测试的整数(空格分开) 输出 2+3*(n+3)行,其中: 第1行:Stack is full. 第2行:空行 接下去的n:每行2个相同的用空格分开的整数(返回栈顶元素、返回并删除栈顶元素) 输出2行的Stack is empty. 第n+4行:空行 接下去的2个n+3行都和前面的n+3行一样。 输入样例 1 15 12 80 78 62 63 89 5 9 88 23 91 6 33 54 30 9999 输出样例 1 Stack is full. 30 30 54 54 33 33 6 6 91 91 23 23 88 88 9 9 5 5 89 89 63 63 62 62 78 78 80 80 12 12 Stack is empty. Stack is empty. 30 30 54 54 33 33 6 6 91 91 23 23 88 88 9 9 5 5 89 89 63 63 62 62 78 78 80 80 12 12 Stack is empty. Stack is empty. 30 30 54 54 33 33 6 6 91 91 23 23 88 88 9 9 5 5 89 89 63 63 62 62 78 78 80 80 12 12 Stack is empty. Stack is empty.
求大家帮我看看这个队列问题,我要崩了啊啊啊啊
本人大一小白,今天做pta的一道队列问题,我真是崩溃了啊啊啊,求大神救救孩子吧!!! 双端队列(deque,即double-ended queue的缩写)是一种具有队列和栈性质的数据结构,即可以(也只能)在线性表的两端进行插入和删除。若以顺序存储方式实现双端队列,请编写例程实现下列操作: Push(X,D):将元素X插入到双端队列D的头; Pop(D):删除双端队列D的头元素,并返回; Inject(X,D):将元素X插入到双端队列D的尾部; Eject(D):删除双端队列D的尾部元素,并返回。 https://pintia.cn/problem-sets/434/problems/6096网站 下面是我写的两个答案,第一个答案错误,头指针指向头一个元素的前一个位置;第二个答案全对,尾指针指向最后一个元素的后一个位置,我感觉第一个答案没问题啊,已经有点崩溃了 第一个错误的//头指针指向头一个元素的前一个 bool Push(ElementType X, Deque D) { if ((D->Rear + 1) % D->MaxSize == D->Front) return false; D->Data[D->Front] = X; D->Front = (D->Front + D->MaxSize - 1) % D->MaxSize; //避免出现负数 return true; } ElementType Pop(Deque D) { if (D->Rear == D->Front) return ERROR; D->Front = (D->Front + 1) % D->MaxSize; return D->Data[D->Front]; } bool Inject(ElementType X, Deque D) { if ((D->Rear + 1) % D->MaxSize == D->Front) return false; D->Rear = (D->Rear + 1) % D->MaxSize; D->Data[D->Rear] = X; return true; } ElementType Eject(Deque D) { if (D->Rear == D->Front) return ERROR; ElementType temp = D->Data[D->Rear]; D->Rear = (D->Rear + D->MaxSize - 1) % D->MaxSize; //避免出现负数 return temp; } 第二个正确的 //尾指针指向最后一个元素的后一个 bool Push(ElementType X, Deque D) { if ((D->Rear + 1) % D->MaxSize == D->Front) return false; D->Front = (D->Front - 1 + D->MaxSize) % D->MaxSize; D->Data[D->Front] = X; return true; } ElementType Pop(Deque D) { if (D->Rear == D->Front) return ERROR; ElementType a = D->Data[D->Front]; D->Front = (D->Front + 1) % D->MaxSize; return a; } bool Inject(ElementType X, Deque D) { if ((D->Rear + 1) % D->MaxSize == D->Front) return false; D->Data[D->Rear] = X; D->Rear = (D->Rear + 1) % D->MaxSize; return true; } ElementType Eject(Deque D) { if (D->Rear == D->Front) return ERROR; D->Rear = (D->Rear - 1 + D->MaxSize) % D->MaxSize; ElementType a = D->Data[D->Rear]; return a; } 下面是题干 #include <stdio.h> #include <stdlib.h> #define ERROR -1 typedef int ElementType; typedef enum { push, pop, inject, eject, end } Operation; typedef enum { false, true } bool; typedef int Position; typedef struct QNode *PtrToQNode; struct QNode { ElementType *Data; /* 存储元素的数组 */ Position Front, Rear; /* 队列的头、尾指针 */ int MaxSize; /* 队列最大容量 */ }; typedef PtrToQNode Deque; Deque CreateDeque( int MaxSize ) { /* 注意:为区分空队列和满队列,需要多开辟一个空间 */ Deque D = (Deque)malloc(sizeof(struct QNode)); MaxSize++; D->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType)); D->Front = D->Rear = 0; D->MaxSize = MaxSize; return D; } bool Push( ElementType X, Deque D ); ElementType Pop( Deque D ); bool Inject( ElementType X, Deque D ); ElementType Eject( Deque D ); Operation GetOp(); /* 裁判实现,细节不表 */ void PrintDeque( Deque D ); /* 裁判实现,细节不表 */ int main() { ElementType X; Deque D; int N, done = 0; scanf("%d", &N); D = CreateDeque(N); while (!done) { switch(GetOp()) { case push: scanf("%d", &X); if (!Push(X, D)) printf("Deque is Full!\n"); break; case pop: X = Pop(D); if ( X==ERROR ) printf("Deque is Empty!\n"); else printf("%d is out\n", X); break; case inject: scanf("%d", &X); if (!Inject(X, D)) printf("Deque is Full!\n"); break; case eject: X = Eject(D); if ( X==ERROR ) printf("Deque is Empty!\n"); else printf("%d is out\n", X); break; case end: PrintDeque(D); done = 1; break; } } return 0; } /* 你的代码将被嵌在这里 */
初学c语言,可以评价一下我写的顺序表吗?
望各位批评指教,十分感谢。 ``` #include <stdio.h> #include <stdlib.h> #define INITSIZE 100 typedef struct { int * data; //声明一个动态数组 int length; //记录当前顺序表的长度(实际长度) int MaxSize; //顺序表的最大长度 }SqList; /* 初始化顺序表,调用InitList()函数可以创建一个空的顺序表 */ void InitList(SqList *L) { (*L).data = (int*)malloc(INITSIZE*sizeof(int)); //构造新的顺序表并为顺序表分配空间 (*L).length = 0; //空表的长度为0; (*L).MaxSize = INITSIZE; //空表的初始存储空间为INITSIZE } /* 输出打印顺序表 */ void PrintList(SqList *L) { for(int i=0;i<(*L).length;i++) { printf("%4d",(*L).data[i]); } printf("\n"); } /* 顺序表插入操作 将给定值e插入到顺序表的第i个位置 */ void InsertList(SqList *L,int e,int i) { //判断i的范围是否合法 if(i<1||i>(*L).MaxSize) { printf("插入位置有问题。\n"); return; } //判断顺序表是否已满 if((*L).length==(*L).MaxSize) { printf("顺序表已满,无法插入\n"); return; } //执行插入操作。将第i个位置及其后的元素后移 for(int j=(*L).length-1;j>=i;j++) { (*L).data[j+1] = (*L).data[j]; } //然后将待插入的元素放入第i个位置,由于数组下标是从0开始,所以第i的位置的元素下标应该是i-1 (*L).data[i-1] = e; //顺序表长度加一 (*L).length++; } /* 顺序表删除操作 删除顺序表上第i个位置上的元素 */ void DeleteList(SqList *L,int i) { //判断i的范围是否合法 if(i<1||i>(*L).MaxSize) { printf("删除位置有问题。\n"); return; } //将顺序表中第i个之后的元素前移,把第i的位置上原有的元素覆盖掉,实现删除 for(int j=i-1;j<(*L).length;j++) { (*L).data[j] = (*L).data[j+1]; } //顺序表长度加一 (*L).length--; } /* 顺序表查找操作 按位查找 查找顺序表上第i个位置上的元素 */ void SearchList_1(SqList (*L),int i) { //判断i的范围是否合法 if(i<1||i>(*L).length) { printf("查找的位置有问题。\n"); return; } printf("顺序表上第%d个元素为:%d\n",i,(*L).data[i-1]); } /* 顺序表查找操作 按值查找 查找给定值在顺序表中的位置 */ int SearchList_2(SqList *L,int e) { for(int i=0;i<(*L).length;i++) { if((*L).data[i]==e) return i+1; } printf("查找失败\n"); return -1; } /* 顺序表修改操作 修改顺序表第i个位置上的元素修改为新的值e */ void ChangeList(SqList *L,int i,int e) { //判断i的范围是否合法 if(i<1||i>(*L).length) { printf("需要修改的位置有问题。\n"); return; } (*L).data[i-1] = e; } /* 主函数 */ int main() { SqList *L; //初始化线性表 InitList(&L); //往顺序表中插入元素 InsertList(&L,12,1); InsertList(&L,24,2); InsertList(&L,38,3); InsertList(&L,45,4); InsertList(&L,52,5); InsertList(&L,69,6); InsertList(&L,73,7); //输出打印顺序表中所有元素 printf("原顺序表:"); PrintList(&L); //查找 printf("查找顺序表中第3个元素:");SearchList_1(&L,3); printf("69是顺序表中第%d个元素\n",SearchList_2(&L,69)); //删除线性表中元素 printf("删除第二个元素\n"); DeleteList(&L,2); printf("删除之后的顺序表:"); PrintList(&L); //修改顺序表的元素 printf("将顺序表中第3个元素修改为100\n"); ChangeList(&L,3,100); printf("一顿操作之后的顺序表:"); PrintList(&L); return 0; } ```
PHP数组取值的奇怪问题,哪位帮忙给看看,谢谢~
在拉取微信用户信息写入数据库的过程中,遇到一个奇怪的问题,折磨了我一天了,希望哪位高人给看一下,在通过接口获取到微信用户的信息后,使用网上找的一个数据库操作类写入数据表,在数据库操作类的insert函数中有个检查传入数组元素是否为空的判断,只要去掉它,就获取不到数组数据了,加上它就有,奇怪了 wx.php ``` include "dbMysqli.class.php"; $db=ConnectMysqli::getIntance(); $url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$_SESSION['token']['access_token']."&openid=".$_SESSION['token']['openid']."&lang=zh_CN"; $res = https_request($url); $resArr = json_decode($res, true); $data = array("openID"=>"{$resArr['openid']}","nickName"=>"{$resArr['nickname']}","city"=>"{$resArr['city']}","province"=>"{$resArr['province']}","country"=>"{$resArr['country']}","headImgUrl"=>"{$resArr['headimgurl']}"); $db->insert('tb_users',$data); } ``` dbMysqli.class.php ``` <?php header('content-type:text/html;charset=utf-8'); /* 掌握满足单例模式的必要条件 (1)私有的构造方法-为了防止在类外使用new关键字实例化对象 (2)私有的成员属性-为了防止在类外引入这个存放对象的属性 (3)私有的克隆方法-为了防止在类外通过clone成生另一个对象 (4)公有的静态方法-为了让用户进行实例化对象的操作 */ class ConnectMysqli{ //私有的属性 private static $dbcon=false; private $host; private $port; private $user; private $pass; private $db; private $charset; private $link; //私有的构造方法 private function __construct($config=array()){ $this->host = isset($config['host']) ? $config['host'] : 'localhost'; $this->port = isset($config['port']) ? $config['port'] : '3306'; $this->user = isset($config['user']) ? $config['user'] : 'root'; $this->pass = isset($config['pass']) ? $config['pass'] : ''; $this->db = isset($config['db']) ? $config['db'] : 'db_uplus'; $this->charset=isset($arr['charset']) ? $arr['charset'] : 'utf8'; //连接数据库 $this->db_connect(); //选择数据库 $this->db_usedb(); //设置字符集 $this->db_charset(); } //连接数据库 private function db_connect(){ $this->link=mysqli_connect($this->host.':'.$this->port,$this->user,$this->pass); if(!$this->link){ echo "数据库连接失败<br>"; echo "错误编码".mysqli_errno($this->link)."<br>"; echo "错误信息".mysqli_error($this->link)."<br>"; exit; } } //设置字符集 private function db_charset(){ mysqli_query($this->link,"set names {$this->charset}"); } //选择数据库 private function db_usedb(){ mysqli_query($this->link,"use {$this->db}"); } //私有的克隆 private function __clone(){ die('clone is not allowed'); } //公用的静态方法 public static function getIntance(){ if(self::$dbcon==false){ self::$dbcon=new self; } return self::$dbcon; } //执行sql语句的方法 public function query($sql){ $res=mysqli_query($this->link,$sql); if(!$res){ echo "sql语句执行失败<br>"; echo "错误编码是".mysqli_errno($this->link)."<br>"; echo "错误信息是".mysqli_error($this->link)."<br>"; } return $res; } //打印数据 public function p($arr){ echo "<pre>"; print_r($arr); echo "</pre>"; } public function v($arr){ echo "<pre>"; var_dump($arr); echo "</pre>"; } //获得最后一条记录id public function getInsertid(){ return mysqli_insert_id($this->link); } /** * 查询某个字段 * @param * @return string or int */ public function getOne($sql){ $query=$this->query($sql); return mysqli_free_result($query); } //获取一行记录,return array 一维数组 public function getRow($sql,$type="assoc"){ $query=$this->query($sql); if(!in_array($type,array("assoc",'array',"row"))){ die("mysqli_query error"); } $funcname="mysqli_fetch_".$type; return $funcname($query); } //获取一条记录,前置条件通过资源获取一条记录 public function getFormSource($query,$type="assoc"){ if(!in_array($type,array("assoc","array","row"))) { die("mysqli_query error"); } $funcname="mysqli_fetch_".$type; return $funcname($query); } //获取多条数据,二维数组 public function getAll($sql){ $query=$this->query($sql); $list=array(); while ($r=$this->getFormSource($query)) { $list[]=$r; } return $list; } /* * 定义添加数据的方法 * @param string $table 表名 * @param string orarray $data [数据] * @return int 最新添加的id */ public function insert($table,$data){ //遍历数组,得到每一个字段和字段的值 $key_str=''; $v_str=''; foreach($data as $key=>$v){ if(empty($v)){ die("insert data error"); } //$key的值是每一个字段s一个字段所对应的值 $key_str.=$key.','; $v_str.="'$v',"; } $key_str=trim($key_str,','); $v_str=trim($v_str,','); //判断数据是否为空 $sql="insert into $table ($key_str) values ($v_str)"; $this->query($sql); //返回上一次增加操做产生ID值 return $this->getInsertid(); } /* * 删除一条数据方法 * @param1 $table, $where=array('id'=>'1') 表名 条件 * @return 受影响的行数 */ public function deleteOne($table, $where){ if(is_array($where)){ foreach ($where as $key => $val) { $condition = $key.'='.$val; } } else { $condition = $where; } $sql = "delete from $table where $condition"; $this->query($sql); //返回受影响的行数 return mysqli_affected_rows($this->link); } /* * 删除多条数据方法 * @param1 $table, $where 表名 条件 * @return 受影响的行数 */ public function deleteAll($table, $where){ if(is_array($where)){ foreach ($where as $key => $val) { if(is_array($val)){ $condition = $key.' in ('.implode(',', $val) .')'; } else { $condition = $key. '=' .$val; } } } else { $condition = $where; } $sql = "delete from $table where $condition"; $this->query($sql); //返回受影响的行数 return mysqli_affected_rows($this->link); } /** * [修改操作description] * @param [type] $table [表名] * @param [type] $data [数据] * @param [type] $where [条件] * @return [type] */ public function update($table,$data,$where){ //遍历数组,得到每一个字段和字段的值 $str=''; foreach($data as $key=>$v){ $str.="$key='$v',"; } $str=rtrim($str,','); //修改SQL语句 $sql="update $table set $str where $where"; $this->query($sql); //返回受影响的行数 return mysqli_affected_rows($this->link); } } ?> ```
数据结构课题,英文单词填空游戏
问题描述:这是一款帮助学生背单词的小软件。建立单词库,可从单词库中随机抽取单词,并随机隐去该单词中的一些字母,在屏幕上显示带空格的单词,用户对空格处的字母进行补全,程序判断填补是否正确,并统计正确率。 编程任务: (1) 建立单词库,并可以方便地对单词库进行增加、删除。 (2) 随机读取一个单词。 (3) 随机隐去单词中的一些字母,规则是:长度为2~4空一个字母,5~7空二个字母,8~10空三个字母,11以上空四个字母。用随机数方式确定隐去哪几个位上的字母,并在屏幕上显示带空格单词。 (4) 用户填充空格处的字母,程序判断填充是否正确。 (5) 当用户结束游戏时,统计正确率,并输出相应的鼓励语句。 ------------------------ 不求代码,只求思想,大概的算法。多谢各位大神指点 ------------------------ 就把这个问答当作思路的记录吧。 整个程序在控制台里完成。 1.先在控制台中输入单词,并输出到txt文件中保存待下次调用。 2.读取txt中所有单词并存入数组,再随机输出下标来达到随机抽取单词的目的。 3.对于已经抽取出来的单词,再随机输出数字n表示第n位字母用下划线替代,原字母按顺序保存,n可以有多个。 4.依次输入字母,完成输入。 5.依次比对3中保存的字母和4中输入的字母,判断对错。 ------------------ 3和4中的字母存储方式应该用数组a,b,数组长度由游戏规则决定。 **现在的问题是,已经读取的每个单词(字符串)都是一个数组A元素,怎么样再把它变成一个数组B,让其组成字母(字符)变成数组B的元素。** -------
想用堆实现哈夫曼树,为啥一开始就不得行了数值都输不动?
#include<stdio.h> #include<stdlib.h> //创建最小堆 typedef struct HeapStruct *MinHeap; struct HeapStruct { struct TreeNode *a;//存储堆元素的数组 int size;//堆的当前元素的个数 int capacity;//堆的最大容量 } ; //======================================== typedef struct TreeNode *HuffmanTree; struct TreeNode { int Weight; HuffmanTree Left,Right; }; //====================================== MinHeap Creat(int MinSize)//创建一个堆的过程 { //创建容量为Maxsize的空的最大堆 MinHeap H= (MinHeap)malloc(sizeof(struct HeapStruct)); H->a =(HuffmanTree)malloc((MinSize+1)*sizeof(struct TreeNode)); H->size =0; H->capacity =MinSize; H->a[0].Weight =1000; //赋一个最大值当作哨兵,不论怎么调整堆节点 //这个哨兵总是比他大 return H; } void Insert(MinHeap H,int item) { //将元素item插入到最大堆H,其中H->Elements[0]已经定义为哨兵 int i; if(H->size ==H->capacity ) { printf("最小堆已经满了"); return ; } i=++H->size ;//i指向插入后堆中的第一个元素的位置 for(;H->a[i/2].Weight >item;i/2) { H->a[i].Weight =H->a[i/2].Weight ; } H->a[i].Weight =item; } HuffmanTree DeleteMin(MinHeap H)//删除堆定元素 { int parent,child; int temp;HuffmanTree MinItem; if(H->size ==0)//判断堆是否为空 { printf("最小堆已经为空"); HuffmanTree error; return error; } MinItem=&(H->a[1]);//最大元素为堆顶元素 temp=H->a[H->size--].Weight; for(parent=1;parent*2>=H->size ;parent=child) { child=parent*2; if((child!=H->size )&&(H->a[child].Weight >H->a[child+1].Weight )) child++;//右孩子比左孩子大,child指向右孩子 if(temp>=H->a[child].Weight ) break; else H->a[parent].Weight =H->a[child].Weight ; } H->a[parent].Weight =temp; return MinItem; } void BuildMinHeap(MinHeap H) { printf("请输入5个元素\n"); int num[5]; for(int i=0;i<5;i++) { printf("请输入第%d个元素\n",i+1); scanf("%d",&num[i]); Insert(H,num[i]); } } //================================== HuffmanTree Huffman(MinHeap H) { int i; HuffmanTree T; BuildMinHeap(H); for(i=1;i<H->size ;i++) { T=(HuffmanTree)malloc(sizeof(struct TreeNode)); T->Left =DeleteMin(H); T->Right =DeleteMin(H); } } //=================================== int main() { MinHeap H; BuildMinHeap(H); return 0; } ``` ```
二叉查找树 删除结点
/*包含头文件*/ #include "stdio.h" #include "stdlib.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 typedef int Status; /* 二叉树的二叉链表结点结构定义 */ typedef struct BiTNode /* 结点结构 */ { int data; /* 结点数据 */ struct BiTNode *lchild, *rchild; /* 左右孩子指针 */ } BiTNode, *BiTree; /**BiTree等价于typedef BiTNode *BiTree*/ /*查找二叉排序树T中是否存在key(递归查找)*/ Status Search(BiTree T, int key, BiTree f, BiTree *p) { if (!T) /* 查找不成功 */ { *p = f; return FALSE; } else if (key==T->data) /* 查找成功 */ { *p = T; return TRUE; } else if (key<T->data) return Search(T->lchild, key, T, p); /* 在左子树中继续查找 */ else return Search(T->rchild, key, T, p); /* 在右子树中继续查找 */ } /* 当二叉排序树T中不存在关键字等于key的数据元素时, */ /* 插入key并返回TRUE,否则返回FALSE */ Status Insert(BiTree *T, int key) { BiTree p,s; if (!Search(*T, key, NULL, &p)) /* 查找不成功 */ { s = (BiTree)malloc(sizeof(BiTNode)); s->data = key; s->lchild = s->rchild = NULL; if (!p) *T = s; /* 插入s为新的根结点 */ else if (key<p->data) p->lchild = s; /* 插入s为左孩子 */ else p->rchild = s; /* 插入s为右孩子 */ return TRUE; } else return FALSE; /* 树中已有关键字相同的结点,不再插入 */ } /* 从二叉排序树中删除结点p,并重接它的左或右子树。 */ Status DeleteBST(BiTree &p) { BiTree q,s; if(p->rchild==NULL) /* 右子树空则只需重接它的左子树(待删结点是叶子也走此分支) */ { **_ q=p; p=p->lchild; free(q);_** } else if(p->lchild==NULL) /* 只需重接它的右子树 */ { _** q=p; p=p->rchild; free(q);**_ } else /* 左右子树均不空 */ { q=p; s=p->lchild; while(s->rchild) /* 转左,然后向右到尽头(找待删结点的前驱) */ { q=s; s=s->rchild; } p->data=s->data; /* s指向被删结点的直接前驱(将被删结点前驱的值取代被删结点的值) */ if(q!=p) q->rchild=s->lchild; /* 重接q的右子树 */ else q->lchild=s->lchild; /* 重接q的左子树 */ free(s); } return TRUE; } /* 若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素结点, */ /* 并返回TRUE;否则返回FALSE。 */ Status Delete(BiTree &T,int key) { if(!T) /* 不存在关键字等于key的数据元素 */ return FALSE; else { if (key==T->data) /* 找到关键字等于key的数据元素 */ return DeleteBST(T); else if (key<T->data) return Delete(T->lchild,key); else return Delete(T->rchild,key); } } /*二叉树中序遍历*/ void LDR(BiTree T) { if (T!=NULL) { LDR(T->lchild); printf("%d ",T->data); LDR(T->rchild); } } #define N 10 void main() { int i,j; BiTree T=NULL; //定义数组和初始化SeqList int d[N]={62,88,58,47,35,73,51,99,37,93}; for (i=0;i<N;i++) { Insert(&T,d[i]); } printf("***************二叉排序树查找(C版)***************\n"); printf("初始化二叉排序树\n中序遍历数据:"); LDR(T); printf("\n***************删除节点1***************\n"); Delete(T,93); printf("删除叶节点93\n中序遍历后:"); LDR(T); printf("\n***************删除节点2***************\n"); Delete(T,47); printf("删除双孩子节点47\n中序遍历后:"); LDR(T); printf("\n***************删除节点3***************\n"); Delete(T,58); printf("删除单孩子节点58\n中序遍历后:"); LDR(T); getchar(); } 删除结点的部分 if(p->rchild==NULL) /* 右子树空则只需重接它的左子树(待删结点是叶子也走此分支) */ { q=p; p=p->lchild; free(q); } else if(p->lchild==NULL) /* 只需重接它的右子树 */ { q=p; p=p->rchild; free(q); } 要删除p指向的结点,那么应该把p->lchild或p->rchild赋给p指向结点的双亲啊,为什么要给p呢?
请教一下,vs2017 为什么我的c++代码定义的没有问题,也没有错误提示,但是一编译就爆出很奇怪的错误
![图片说明](https://img-ask.csdn.net/upload/201906/26/1561479311_174644.png) ![图片说明](https://img-ask.csdn.net/upload/201906/26/1561479319_641194.png) ![图片说明](https://img-ask.csdn.net/upload/201906/26/1561479334_460955.png) ![图片说明](https://img-ask.csdn.net/upload/201906/26/1561479342_908336.png) 以下是完整代码 ``` #include "pch.h" #include<iostream> using namespace std; typedef struct { int weight; BTreeNode *left; BTreeNode *right; }BTreeNode; BTreeNode* CreateHuffman(int a[], int n) { // 根据数组a中n个权值建立一颗哈夫曼树,则返回树根指针 BTreeNode **b, *q; // 动态地分配一个由b指向的指针数组 b = new BTreeNode*[n]; int i, j; // 初始化b指针数组,使每个指针元素指向a数组中对应元素的结点 for (i = 0; i < n; i++) { b[i] = new BTreeNode; b[i]->weight = a[i]; b[i]->left = b[i]->right = NULL; } // 进行n-1此循环建立哈夫曼树 for (i = 1; i < n; i++) { // 用k1表示森林中具有最小权值的树根节点下标 // 用k2表示森林中具有次小权值的树根节点下标 int k1=-1, k2; for (j = 0; j < n; j++) { if (b[j] != NULL && k1 == -1) { k1 = j; continue; } if (b[j] != NULL) { k2 = j; break; } } // 从当前森林中求出最小权值树和次小权值树 for (j = k2; j < n; j++) { if (b[j] != NULL) { if (b[j]->weight < b[k1]->weight) { k2 = k1; k1 = j; } else if (b[j]->weight < b[k2]->weight) k2 = j; } } // 由最小权值树和次小权值树建立一棵新树,q指向树跟结点 q = new BTreeNode; q->weight = b[k1]->weight + b[k2]->weight; q->left = b[k1]; q->right = b[k2]; // 将指向新树的指针赋给b指针数组k1位置,k2位置置为空 b[k1] = q; b[k2] = NULL; } // 删除动态建立的数组b delete []b; // 返回整个哈夫曼树的树根指针 return q; } void HuffManCoding(BTreeNode *FBT, int len) { // 根据FBT指针所指向的哈夫曼树输出每个叶子的编码,len初值为0 static int code[10]; // 数组的长度要至少等于哈夫曼树的深度减1 if (FBT != NULL) { // 访问到叶子结点时输出其保存在数组code中的0和1序列编码 if (FBT->left == NULL && FBT->right == NULL) { cout << "结点权值为" << FBT->weight << "的编码:"; for (int i = 0; i < len; i++) cout << code[i] << " "; cout << endl; } // 访问到非叶子节点时分别向左、右子树递归调用,并分别把分支上 // 的0、1编码保存到数组code,向下深入一层时len+1 else { code[len] = 0; HuffManCoding(FBT->left, len + 1); code[len] = 1; HuffManCoding(FBT->right, len + 1); } } } void CleanBTree(BTreeNode *BT) { if (BT != NULL) { CleanBTree(BT->left); CleanBTree(BT->right); delete BT; BT = NULL; } } int main() { int n, i; BTreeNode *fbt = NULL; // 输入哈夫曼树中叶子结点数 cout << "输入待构造的哈夫曼树中带权叶子结点的权值n:"; cin >> n; // 用数组a保存从键盘输入的n个叶子结点的权值 int *a = new int[n]; cout << "输入" << n << "个整数作为权值:"; for (i = 0; i < n; i++) cin >> a[i]; // 根据数组a建立哈夫曼树 fbt = CreateHuffman(a, n); // 输出哈夫曼编码,即每个叶子节点所对应的0、1序列 cout << "树种每个叶子的哈夫曼编码:" << endl; HuffManCoding(fbt, 0); CleanBTree(fbt); } ```
7-2 jmu-ds-顺序表的基本操作(15 分)
实现顺序表的基本运算:初始化、插入、删除、求表的长度、判空、释放。 (1)从键盘输入数据到数组; (2)用数组的数据创建顺序表; (3)输出顺序表L; (4)输出顺序表L的长度; (5)判断顺序表L是否为空; (6)输出顺序表L的第3个元素; (7)输出元素a的位置; (8)在第4个元素位置上插入‘f’元素; (9)输出顺序表L; (10)删除L的第3个元素; (11)输出顺序表L; (12)释放顺序表L。 package sss; import java.util.*; import java.util.Scanner; import java.util.ArrayList; public class Qllll { public static void main(String[] args) { Scanner in = new Scanner(System.in); int a=in.nextInt(); String string=""; while(in.hasNextLine()){ String s=in.nextLine(); if(s.equals("\n")){ in.close(); break; }else{ string=string+s; } } ArrayList list =new ArrayList(); char[] ar = string.toCharArray(); char []sc=new char[a]; int n=0; for(int i=0;i<a;i++) { sc[i]=ar[n]; n=n+2; } System.out.println(ar); for(int i=0;i<a;i++) { list.add(sc[i]); } for(Object obj : list) { System.out.print(obj); } System.out.println(); System.out.println(list.size()); if(list.isEmpty()); else{ System.out.println("no"); } System.out.println(list.get(2)); System.out.println(list.indexOf('a')+1); list.add(3,'f'); for(Object obj : list) { System.out.print(obj); } System.out.println(); list.remove(2); for(Object obj : list) { System.out.print(obj); } } }输入字符窜的时候输入换行不能结束输入为什么
C语言静态链表问题,vc下为什么会编译不通过呢?
#include<stdio.h> #include<malloc.h> #include<stdlib.h> #define NULL 0 #define Maxsize 100 typedef int elemtype,status; typedef struct { int cur; elemtype data; }component,SLinkList[Maxsize];/*SLinkList是一个结构体数组*/ void Initspace_SL(SLinkList &space)/*将一维数组space中各分量链成一个备用链表 */ { int i; for(i=0;i<Maxsize-1;i++) space[i].cur=i+1; space[Maxsize-1].cur=0; } int LocateElem(SLinkList &space,int e)/*在静态的单链线性表中查找第一个值为e的元素*/ { int i; i=space[0].cur; while(i&&space[i].data!=e) i=space[i].cur; return i; } int Malloc_SL(SLinkList &space)/*若备用空间链表非空,则返回分配的结点下标*/ { int i; i=space[0].cur; if(space[0].cur) space[0].cur=space[i].cur; return(i); } status Insert_SLinkList(SLinkList &space,int i,elemtype e)/*在静态单链表中第i个位置之前插入一个元素e*/ { int j=1,m; while(j<i-1) j=space[j].cur; m=Malloc_SL(space); space[m].data=e; space[m].cur=space[j].cur; space[j].cur=m; return 1; } void free(SLinkList &space,int k)/*将下标为k的空闲结点回收到备用链表*/ { space[k].cur=space[0].cur; space[0].cur=k; } status Delet_SL(SLinkList &space,int i,elemtype e)/*删除静态单链表中第i个元素并用e返回其值*/ { int j=1,k=Maxsize-1; for(j=1;j<i;j++) k=space[k].cur; j=space[k].cur; space[k].cur=space[j].cur; e=space[j].data; free(space,j); return e; } void main()/*还有求链表长度,以及求链表前驱后继的函数以后有空再写*/ { SLinkList La; int length,i,e; printf("请输入链表的长度:\n"); scanf("%d",&length); Initspace_SL(La); printf("请输入链表的元素:\n"); for(i=0;i<length;i++) scanf("%d",&La[i].data); printf("请输入要删除元素的位置:\n"); scanf("%d",&i); e=Delet_SL(La,i,e); printf("要删除的元素的值是:%d\n",e); printf("请输入要插入元素的位置:\n"); scanf("%d",&i); printf("要插入的元素的值是:\n"); scanf("%d",&e); Insert_SLinkList(La,i,e); for(i=0;i<length;i++) printf("%d ",La[i].data); } 这个是完全按照严尉敏的数据结构课程中关于静态链表写的程序,请教大神为什么编译会出错,提示语法有问题?看了很多遍了,好像是没有呀。
关于泛型的问题 Java 核心技术 一
Function: 但在添加或删除元素时,具有自动调节数组容量的功能,而不需要为此编写任何代码。 ArrayList<Employee> staff = new ArrayList<>(); 这被称为“菱形” 语法,因为空尖括号<>就像一个菱形。 可以结合new操作符使用菱形语法。 编译器会检查新值是什么。 如果赋值给一个变量,或传递到某个方法,或者从某个方法返回,编译器会检查这个变量,参数或方法的泛型类型,然后将这个类型放在<>中。 在这个例子中,new ArrayList<>()将赋至一个类型为ArrayList<Employee>的变量,所以泛型类型为Employee。 1. 我在书上看到一个叫做 ArrayList<T>(), 这个T 就是泛型吧。 2. 求大神给写一个简单的泛型程序给我看一下。 (书上将Arraylist直接放到了继承中说,但是也是一笔带过,我上网查了一下,这个泛型也是一种对象类型,目的是为了统一,所以希望能有一个简单的程序加深一下理解)
这里为什么用while 不用 if ?
![图片说明](https://img-ask.csdn.net/upload/201902/15/1550216227_825429.png) ``` public class BoundedQueue<T> { private Object[] items; // 添加的下标,删除的下标和数组当前数量 private int addIndex, removeIndex, count; private Lock lock = new ReentrantLock(); private Condition notEmpty = lock.newCondition(); private Condition notFull = lock.newCondition(); public BoundedQueue(int size) { items = new Object[size]; } // 添加一个元素,如果数组满,则添加线程进入等待状态,直到有"空位" public void add(T t) throws InterruptedException { lock.lock(); try { while (count == items.length) notFull.await(); items[addIndex] = t; if (++addIndex == items.length) addIndex = 0; ++count; notEmpty.signal(); } finally { lock.unlock(); } } // 由头部删除一个元素,如果数组空,则删除线程进入等待状态,直到有新添加元素 @SuppressWarnings("unchecked") public T remove() throws InterruptedException { lock.lock(); try { while (count == 0) notEmpty.await(); Object x = items[removeIndex]; if (++removeIndex == items.length) removeIndex = 0; --count; notFull.signal(); return (T) x; } finally { lock.unlock(); } } } ```
栈 队列 基础数据结构
1.利用数组实现两种基础的数据结构:队列(queue,先进先出)和栈(stack,先进后出)。 首先定义一个全局数组int arr[100]; (定义在所有函数之前,#include语句之后)。   1)队列— 仅支持两种操作 int dequeue() 函数返回队列最前面的元素,并将其从队列中删除。 void enqueue(int a)函数将a的值插入队列的末尾。 2)栈支持两种操作 int pop() 函数返回栈最上面的元素,并将其从中删除。 void push(int a)函数将a的值插入栈的最上面。 现在有两个程序 (C语言) #include <stdio.h> int arr[100]; int qh = 100; //队头 int qt = 100; //队尾 int ERR = 9999999; int dequeue() { if (qh <= qt) { printf("队空"); return ERR; } int x = arr[qh]; qh--; return x; } void enqueue(int a) { if (qt == 0) { printf("队满"); return ERR; } arr[qt] = a; qt--; } int main() { enqueue(1); enqueue(2); enqueue(3); printf("%d\n", dequeue()); enqueue(4); printf("%d\n", dequeue()); printf("%d\n", dequeue()); printf("%d\n", dequeue()); printf("%d\n", dequeue()); } #include <stdio.h> int arr[100]; int top = -1; int ERR = 9999999; int pop() { if (top < 0) { printf("堆栈空"); return ERR; } return arr[top--]; } void push(int a) { top++; if (top >= 100) { printf("堆栈满"); return ERR; } arr[top] = a; } int main() { push(1); push(2); push(3); push(4); printf("%d\n", pop()); printf("%d\n", pop()); printf("%d\n", pop()); printf("%d\n", pop()); printf("%d\n", pop()); } 现在要加这样一个要求 在main函数中设计一个死循环,询问用户操作类型并根据操作类型返回结果(dequeue或pop),或者进一步询问用户操作数(enqueue或push)   请帮忙修改一下
静态链表为什么实现不了数据反转,哪里错了,具体的代码如何实现?
``` //vc6.0实现的C++版 //功能:静态链表实现线性表的基本功能 #include <iostream.h>//读入必须包含的头文件 #include <windows.h>//清屏和颜色设置需要 #include <iomanip.h> enum returninfo{success,fail,overflow,underflow,range_error};//定义返回信息清单 #define NULLP -1//静态链表的空地址模拟 const int MAXSIZE=10;//静态链表的总空间大小 class node { public: int data;//数据域 int next;//指针域 }; /* 定义一个线性表类staticlinklist */ class staticlinklist { private: node dataarray[MAXSIZE];//定义静态链表的数组 int freep,headp;//freep管理空闲空间,headp管理实际线性表空间 int count;//计数器 统计结点个数即线性表的长度 public: staticlinklist();//构造函数 ~staticlinklist();//析构函数 int getnewnode(void);//申请一个新的可用空间 returninfo create(int number);//静态链表的初始化 bool empty(void) const;//判断是否空链 int size(void) const;//求静态链表的长度 void deletenode(int position);//把某个空间地址归还给空闲空间 returninfo traverse(void);//遍历静态链表所有元素 returninfo retrieve(int position,int &item) const;//读取一个结点 returninfo replace(int position,const int &item);//修改一个结点 returninfo insert(int position,const int &item);//插入一个结点 returninfo remove(int position);//删除一个结点 returninfo invertlist(void);//静态链表所有数据反转 void showinfo(void);//显示静态链表相关信息 }; staticlinklist::staticlinklist()//构造函数 { //静态链表初始化,约定开始时地址域为从小到大顺序挂链,最后一个为NULLP(即-1) int i; for(i=0;i<MAXSIZE;i++) dataarray[i].next=i+1; dataarray[MAXSIZE-1].next=-1; freep=0;//设置空闲区的指针 count=0;//计数器清零,表明开始时没有实际数据 headp=NULLP; } staticlinklist::~staticlinklist()//析构函数 { } staticlinklist::getnewnode(void) { int tempaddress;//定义一个临时地址指针 tempaddress=freep;//保存目前可用空间的第一个地址 freep=dataarray[freep].next;//可用空间头指针后移 return tempaddress; } returninfo staticlinklist::create(int number)//静态链表的初始化 { int tempaddress,tempp; cout<<"请依次输入数据(用空格隔开):"; for(int i=1;i<=number;i++) { tempaddress=getnewnode(); cin>>dataarray[tempaddress].data; dataarray[tempaddress].next=NULLP; count++; if(i==1)//挂第一个结点 { headp=tempaddress; tempp=headp; } else//挂其他结点 { dataarray[tempp].next=tempaddress; tempp=tempaddress; } } return success; } bool staticlinklist::empty(void) const//判断是否空链 { if(headp==NULLP) return true; else return false; } int staticlinklist::size(void) const//求静态链表的长度 { return count; } void staticlinklist::deletenode(int position) { dataarray[position].next=freep; freep=position; } returninfo staticlinklist::traverse(void)//遍历静态链表中的所有元素 { int searchp;//启用搜索指针 if(empty()) return underflow;//空表的处理 searchp=headp; cout<<"静态链表中的全部数据为:Headp->";//提示显示数据开始 while(searchp!=NULLP)//循环显示所有数据 { cout<<"["<<dataarray[searchp].data; if(dataarray[searchp].next==NULLP) cout<<"|^]"; else cout<<"|-]->"; searchp=dataarray[searchp].next; } cout<<endl;//最后有一个回车的控制 return success;//本次操作成功 } returninfo staticlinklist::retrieve(int position,int &item) const//读取一个结点 { if(empty())//处理意外,空表 return underflow; if(position<=0||position>=count+1) //处理意外,范围不正确 return range_error; int searchp=headp;//定义搜索指针,初始化 for(int i=1;i<position&&searchp!=NULLP;i++)//提示:注意小于号 searchp=dataarray[searchp].next;//顺序访问方式,用循环,算法复杂度是O(n) item=dataarray[searchp].data;//返回读取的数据 return success;//本次操作成功 } returninfo staticlinklist::replace(int position,const int &item)//修改一个结点 { if(empty())//处理意外,空表 return underflow; if(position<=0||position>=count+1) //处理意外,范围不正确 return range_error; int searchp=headp;//定义搜索指针,初始化 for(int i=1;i<position&&searchp!=NULLP;i++)//提示:注意小于号 searchp=dataarray[searchp].next;//顺序访问方式,用循环,算法复杂度是O(n) dataarray[searchp].data=item;//实际修改数据的语句 return success;//本次操作成功 } returninfo staticlinklist::insert(int position,const int &item)//插入一个结点 { if(position<=0||position>=count+2) //处理意外,范围不正确 return range_error; int newnodep,searchp=headp,followp=NULLP; newnodep=getnewnode();//此处需要申请新的一个可用空间,地址赋给newnodep if(newnodep==NULLP) return overflow; dataarray[newnodep].data=item;//给数据赋值 if(position==1) { dataarray[newnodep].next=headp; headp=newnodep; count++; return success; } for(int i=1;i<position&&searchp!=NULLP;i++)//以下为查找插入位置 { followp=searchp; searchp=dataarray[searchp].next; } //以下开始修改链表,完成插入数据 dataarray[newnodep].next=dataarray[followp].next;//注意此处的次序相关性 dataarray[followp].next=newnodep; count++;//计数器加1 return success; } returninfo staticlinklist::remove(int position)//删除一个结点 { if(empty())//处理意外,空表 return underflow; if(position<=0||position>=count+1) //处理意外,范围不正确 return range_error; int searchp=headp,followp=NULLP;//这里两个指针的初始值设计一前一后 if(position==1) { searchp=headp; headp=dataarray[headp].next; deletenode(searchp);//释放该结点空间 count--;//计数器减1 return success; } for(int i=1;i<position&&searchp!=NULLP;i++) { followp=searchp; searchp=dataarray[searchp].next; } dataarray[followp].next=dataarray[searchp].next;//删除结点的实际语句 deletenode(searchp);//释放该结点 count--;//计数器减1 return success; } returninfo staticlinklist::invertlist(void)//静态链表所有数据反转 { int nowp,midp,lastp;//启用多个辅助指针 if(empty()) return underflow; nowp=dataarray[headp].next; midp=NULLP; while(nowp!=NULLP) { lastp=midp; midp=nowp; nowp=dataarray[nowp].next; dataarray[midp].next=lastp; } dataarray[headp].next=midp; return success; } void staticlinklist::showinfo(void)//显示静态链表相关信息 { int searchp; cout<<"目前静态链表总空间:"<<setw(3)<<MAXSIZE<<"地址为(0--"<<MAXSIZE-1<<")"<<endl; cout<<"其中自由空间大小为:"<<setw(3)<<MAXSIZE-count<<"编号为:"; searchp=freep; while(searchp!=NULLP) { cout<<" "<<searchp; searchp=dataarray[searchp].next; } cout<<endl; cout<<"线性表的已用空间为:"<<setw(3)<<count<<"编号为:"; searchp=headp; while(searchp!=NULLP) { cout<<" "<<searchp; searchp=dataarray[searchp].next; } cout<<endl; } /* 定义一个实现静态链表功能的菜单处理类interfacebase */ class interfacebase { private: staticlinklist listonface; public: void clearscreen(void);//清屏 void showmenu(void);//显示菜单函数 int userchoice(void);//用户的选项 returninfo processmenu(int menuchoice);//菜单函数 }; void interfacebase::clearscreen(void) { system("cls"); } void interfacebase::showmenu(void) { cout<<"静态链表基本功能菜单"<<endl; cout<<"=================="<<endl; cout<<"1.输入数据(键盘输入)"<<endl; cout<<"2.显示数据(遍历全部数据)"<<endl; cout<<"3.修改数据(要提供位置和新值)"<<endl; cout<<"4.插入数据(要提供位置和新值)"<<endl; cout<<"5.删除数据(要提供位置)"<<endl; cout<<"6.读取数据(要提供位置)"<<endl; cout<<"7.求表长度"<<endl; cout<<"8.数据反转(全部数据逆序存储)"<<endl; cout<<"9.静态链表相关信息"<<endl; cout<<"0.退出程序"<<endl; cout<<"=================="<<endl; } int interfacebase::userchoice(void) { int menuchoice; cout<<"请输入您的选择:"; cin>>menuchoice; return menuchoice; } returninfo interfacebase::processmenu(int menuchoice) { int position,item,returnvalue; switch(menuchoice)//根据用户的选择进行相应的操作 { case 1: cout<<"请问你要输入数据的个数,注意要在"<<MAXSIZE<<"个以内:"; cin>>item; if(item>MAXSIZE) cout<<"对不起,输入数据超限,操作已取消!请按任意键继续..."<<endl; else { returnvalue=listonface.create(item); if(returnvalue==success) cout<<"建立静态链表操作成功!请按任意键继续..."<<endl; } break; case 2: returnvalue=listonface.traverse(); if(returnvalue==underflow) cout<<"静态链表目前为空,没有数据可以显示!请按任意键继续..."<<endl; else cout<<"静态链表遍历操作成功!请按任意键继续..."<<endl; break; case 3: cout<<"请输入要修改数据的位置:"; cin>>position; cout<<"请输入要修改的新数据:"; cin>>item; returnvalue=listonface.replace(position,item); if(returnvalue==underflow) cout<<"对不起,静态链表已空!请按任意键继续..."<<endl; else if(returnvalue==range_error) cout<<"对不起,修改的位置超出了范围!请按任意键继续..."<<endl; else cout<<"修改操作成功!请按任意键继续..."<<endl; break; case 4: cout<<"请输入要插入数据的位置:"; cin>>position; cout<<"请输入要插入的新数据:"; cin>>item; returnvalue=listonface.insert(position,item);//注意这个位置的参数 if(returnvalue==overflow) cout<<"对不起,静态链表溢出,无法插入新数据!请按任意键继续..."<<endl; else if(returnvalue==range_error) cout<<"对不起,插入的位置超出了范围!请按任意键继续..."<<endl; else cout<<"插入操作成功!请按任意键继续..."<<endl; break; case 5: cout<<"请输入要删除数据的位置:"; cin>>position; returnvalue=listonface.remove(position);//注意这个位置的参数 if(returnvalue==underflow) cout<<"对不起,静态链表已空!请按任意键继续......"<<endl; else if(returnvalue==range_error) cout<<"对不起,删除的位置超出了范围!请按任意键继续..."<<endl; else cout<<"删除操作成功!请按任意键继续..."<<endl; break; case 6: cout<<"请输入要读取数据的位置:"; cin>>position; returnvalue=listonface.retrieve(position,item); if(returnvalue==underflow) cout<<"对不起,静态链表已空!请按任意键继续......"<<endl; else if(returnvalue==range_error) cout<<"对不起,读取的位置超出了范围!请按任意键继续..."<<endl; else cout<<"读取的数据为:"<<item<<endl<<"读取操作成功!请按任意键继续..."<<endl; break; case 7: cout<<"静态链表目前的长度为:"<<listonface.size()<<endl; cout<<"求静态链表长度操作成功!请按任意键继续..."<<endl; break; case 8: returnvalue=listonface.invertlist(); if(returnvalue==underflow) cout<<"对不起,链表已空!请按任意键继续......"<<endl; else cout<<"链表所有元素反转操作成功!请按任意键继续..."<<endl; break; case 9: listonface.showinfo(); break; case 0: exit(0); default: cout<<"对不起,您输入的功能编号有错!请重新输入!!!"<<endl; break; } return success; } /* 程序主入口 */ void main(void) { int menuchoice;//定义变量,菜单选单项的选择 interfacebase interfacenow; staticlinklist linklistnow; system("color f0");//修改屏幕的背景色和字的颜色 interfacenow.clearscreen();//清屏 while(1)//永真循环 { interfacenow.showmenu();//显示菜单 menuchoice=interfacenow.userchoice();//获取用户的选择 interfacenow.processmenu(menuchoice);//处理用户的选择 system("pause");//暂停 interfacenow.clearscreen();//清屏 } }//主函数结束 ```
栈的基本操作,为什么输出有乱码?
#include<stdio.h> #include<stdlib.h> #include<time.h> #define OK 1 #define ERROR 0 #define Stack_Size 20//定义栈最多能够存储的元素个数 typedef struct { int elem[Stack_Size];//利用一维数组顺序存储栈中的元素 int top;//整型变量top存储栈顶元素的下标,作为栈顶指针,top为-1时表示空栈 }SeqStack; int InitStack(SeqStack *);//初始化栈,即将一个栈清除为空 int StackEmpty(SeqStack *);//检查一个栈是否为空 int CreateStack(SeqStack *, int);//随机数顺序栈的建立 int pop(SeqStack*,int*);//向一个栈中删除元素 int push(SeqStack *, int);//向一个栈中插入元素 void Print(SeqStack*);//输出栈 int Copy(SeqStack*, SeqStack*);//将栈S1中的元素倒序输入到栈S2中 int main() { SeqStack S1, S2; int n; InitStack(&S1); InitStack(&S2); StackEmpty(&S1); StackEmpty(&S2); printf("请输入你要输入的元素个数:\n"); scanf_s("%d", &n); CreateStack(&S1, n); Print(&S1); Copy(&S1, &S2); Print(&S2); return OK; } int InitStack(SeqStack *S) { S->top = -1; return OK; } int StackEmpty(SeqStack *S) { return(S->top == -1 ? OK : ERROR); } int CreateStack(SeqStack *S, int n) { srand((unsigned)time(0));//srand种下随机种子,time(0)是得到当前的时间值,每时每刻的时间都不一样,所以每次执行得到的随机数都不一样 for (int i = 0; i < n; i++) { S->elem[++S->top] = rand() % 8+1;//随机抽取的从1到8的数字 } return OK; } int pop(SeqStack *S, int *x) { if (S->top == -1) return ERROR; else { *x = S->elem[S->top]; S->top--; return OK; } } int push(SeqStack *S, int x) { if (S->top = Stack_Size - 1) return ERROR; S->top++; S->elem[S->top] = x; return OK; } void Print(SeqStack *S) { printf("输出元素:\n"); for (int i = S->top; i >= 0; i--) { printf("%d", S->elem[i]); } printf("\n"); } int Copy(SeqStack *S1, SeqStack *S2) { int t; for (int i=S1->top; i>=0; i--) { pop(S1, &t); push(S2, t); } return OK; }
这段代码有两三个错误 代码是基础的c++ 运行环境为CB或者devc++麻烦帮我改一下~
#include<iostream> #include <string> #include <memory.h> using namespace std; class Set { int maxsize;//集合的当前最大容量 int count;//集合的当前元素个数 int *elem; public: //Set(int initsize=10);//构造函数,创建一个空集,initsize: 集合的初始容量 Set(const Set &s);//拷贝构造函数 Set();//析构函数 int Add(int a[], int len);//增加一组新元素,返回值为新增加的元素个数 int Add(int e);//增加一个新元素,返回值为新增加的元素个数 bool Contains(int e) const;//检查当前集合中是否已包含元素 e Set Intersect(const Set& s) const;//求与另一集合的交集 Set Union(const Set& s) const;//求与另一集合的并集 int GetCount() const;//获取当前集合中的元素个数 void Print() const;};//打印所有元素 };//注:const 表示该函数不会对当前对象的数据成员做出修改 int main() { int a[]={1,3,5,7,9}, b[]={2,4,6,8,10,3, 5}; Set s1, s2; s1.Add(a, 5); s2.Add(b, 7); Set s3 = s1.Intersect(s2); Set s4 = s1.Union(s2); s3.Print(); s4.Print(); } void Set::Print()const { for (int i = 0; i < count; i++) cout << elem[i] << " "; cout << endl; } Set Set::Union(const Set& s) const { Set r(s); //用 s 来初始化新集合 r.Add(elem, count); //再添加入当前集合中包含的内容 return r; } inline int Set::GetCount() const { return count; } Set Set::Intersect(const Set& s) const { //int Set::count; Set r(s.count + this->count); for (int i = 0; i < s.count; i++) { if (Contains(s.elem[i])) r.Add(s.elem[i]); //两个集合中都有的元素,加入到交集中。 } return r; } Set::Set(const Set& s) { maxsize = s.maxsize; count = s.count; elem = new int[maxsize]; //为新元素分配空间 memcpy(elem, s.elem, sizeof(int)*count); //复制所有元素 } Set::Set() { delete[] elem; //释放占用空间 } Set::Set(int initsize) :maxsize(initsize), count(0) { elem = new int [maxsize]; if (!elem) throw "申请集合空间失败!"; } int Set::Add(int a[], int len) { int c = 0; //用于记录新增加的元素个数 for (int i = 0; i < len; i++) c+= Add(a[i]); return c; } int Set::Add(int e) { if (Contains(e)) return 0; //当前集合中已包含了指定元素,不用添加了。 if (count == maxsize) //空间已满,再增加空间 { int *tmp = new int[maxsize+10]; if (!tmp) return 0; //申请新空间失败,退出 memcpy(tmp, elem, count*sizeof(int)); //将原来的内容复制到新空间中 maxsize += 10; //最大容量增长10个数据单位 delete[] elem; //删除原有空间 elem = tmp; } elem[count++] = e; //将新元素存放在数组的最后 return 1; } bool Set::Contains(int e) const { for (int i = 0; i < count; i++) if (elem[i] == e) return true; return false;}
Java 电本系统,按照电话号码查询 查不到人求解决!!!
```package test01; import java.util.Scanner; class TelBook { static boolean i = true; // 主要用于执行整个系统的循环以及可用循环时 String[] name = new String[100]; String[] bumen = new String[100]; long[] tel = new long[100]; } /** *电话本的操作类,添加,删除,修改,查询所有,名字查询,退出,操作类继承了数据类以便获取数据; */ class TellAllHandle extends TelBook { //---------------------添加操作方法----------------------------- public void add() { int numAdd=0; for (int y=0 ; y < name.length;y++) { if (name[y]!=null) { //判断是否有数据,如果有,就将本次添加的数据添加到下一个角标,添加到不同位置避免覆盖 numAdd++; } } addOrAlter(numAdd); // 调用添加操作方法 printAll(numAdd); // 调用打印信息方法 System.out.println("添加成功"); } //---------------------删除操作方法----------------------------- public void delete() { // 删除操作 int numDelete = nameRead(0,0); // 调用名字查询方法,并且将返回的角标值赋,加以判断 if (name[numDelete] != null) { System.out.println("确定要删除吗?【1(是),0(否)】"+"输入选项:"); Scanner input = new Scanner(System.in); int ifDelete = input.nextInt(); switch (ifDelete) { case 1: //如果输入为1,则将查询到的对应数据全部设置为空或0,表示为删除 System.out.println("正在删除:"+"["+name[numDelete]+"]"+"的所有信息"); name[numDelete] = null; bumen[numDelete] = null; tel[numDelete] = 0L; System.out.println("删除成功"); break; case 0: System.out.println("您未作任何删除"); break; default: System.out.println("您的输入有误,请重新选择业务"); break; } } } //---------------------修改操作方法----------------------------- public void update() { // 修改操作 int numUpdate = nameRead(0,0); if (name[numUpdate] != null) { System.out.println("请重新输入信息:"); addOrAlter(numUpdate); printAll(numUpdate); System.out.println("修改成功"); } } //---------------------查询所有操作方法----------------------------- public void read() { // 查询所有 int numR1 = 0; int numR2 = 0; while (numR1 < name.length-1) { if (name[numR1] != null) { printAll(numR1); numR2 = 0; } else { numR2 = 1; } numR1++; } if (numR2 != 0) { System.out.println("以上为所有联系人,按 1 添加更多联系人"); } } //---------------------姓名查找操作方法----------------------------- public int nameRead(int numIf1,int numIf2) { System.out.print("请输入需要查找联系人姓名:"); Scanner input = new Scanner(System.in); String inputName = input.next(); while(numIf1 < name.length-1) { //防止未找到角标越界,-1 if(inputName.equals(name[numIf1])) { //遍历数组,查找是否有和输入字符相同的元素,如果有,则打印这个对应角标的所有信息。以表示查找到了要删除的信息 printAll(numIf1); numIf2 = 0; break; //如过找到了则直接结束本次循环 } else { //如果都没有找到和输入相匹配的字符,则将值numIf2赋值为1 numIf2 = 1; } numIf1++; } if (numIf2 != 0) { //为了不重复打印此语句,在循环外判断最后numIf2的值来达到提示未查找到 System.out.println("抱歉,查询错误,无该人信息"); } return numIf1; } //---------------------部门查找操作方法----------------------------- public int bumen(int numIf3,int numIf4) { System.out.print("请输入需要查找联系人的部门:"); Scanner input = new Scanner(System.in); String inputbumen = input.next(); while(numIf3 < bumen.length-1) { if(inputbumen.equals(bumen[numIf3])) { printAll(numIf3); numIf4 = 0; break; } else {numIf4 = 1;} numIf3++; } if (numIf4 != 0) { System.out.println("抱歉,查询错误,无该人信息"); }return numIf3; } //---------------------按电话号码查找操作方法----------------------------- @SuppressWarnings({ "unlikely-arg-type", "resource" }) public int telRead(int numIf5,int numIf6) { System.out.print("请输入需要查找联系人的电话号码:"); Scanner input = new Scanner(System.in); String inputTel = input.next(); while(numIf5 < tel.length-1) { if(inputTel.equals(tel[numIf5])) { printAll(numIf5); numIf6 = 0; break; } else {numIf6 = 1;} numIf5++; } if (numIf6 != 0) { System.out.println("抱歉,查询错误,无该人信息"); }return numIf5; } //---------------------退出操作方法----------------------------- public void exit() { i = false; // 将MainInterface类mainSelect方法循环的条件i赋值为false,致循环结束,退出系统 } //----------------------添加或修改联系人输入方法-------------------- public void addOrAlter(int in) { Scanner input = new Scanner(System.in); System.out.print("姓名:"); name[in] = input.next(); System.out.print("部门:"); bumen[in] = input.next(); System.out.print("电话:"); tel[in] = input.nextLong(); } //----------------------打印联系人详情方法-------------------------- public void printAll(int p) { System.out.println("\n"+"姓名:"+name[p]+","+"部门:"+bumen[p]+","+"电话:"+tel[p]+""); } } /** *主界面所属类,完成主界面的初始化,选择业务,以及各个操作的方法调用 */ class MainInterface { //---------------------主界面加载与选择操作方法----------------------------- public void mainSelect() { TellAllHandle T = new TellAllHandle(); //加载各项操作 while(T.i){ //进行输入循环操作,利用i = true 完成,利用在解决完成一项任务后跳出,可保持系统持续运行, T.i = true; System.out.println("-----------------------------电话本管理系统-----------------------------"); System.out.println("\t"+"1.添加"+"\t"+"2.删除"+"\t"+"3.修改"+"\t"+"4.查询所有"+"\t"+"5.根据姓名查询"+"\t"+"6.根据部门查询"+"\t"+"7.根据电话号码查询"+"\t"+"8.退出"); System.out.println("-----------------------------电话本管理系统-----------------------------"); System.out.print("\n"+"【请键入1-8选择业务】:"); Scanner input = new Scanner(System.in); int mainSelect = input.nextInt(); // 加载用户选择业务输入操作 switch (mainSelect) { // 用switch语句来选择执行指定操作 case 1: System.out.println("---------------"+"添加电话本"+"---------------"); T.add(); break; case 2: System.out.println("---------------"+"删除电话本"+"---------------"); T.delete(); break; case 3: System.out.println("---------------"+"修改电话本"+"---------------"); T.update(); break; case 4: System.out.println("-------------"+"所有电话本"+"-------------"); T.read(); break; case 5: System.out.println("---------------"+"按姓名查询"+"---------------"); T.nameRead(0,0); break; case 6: System.out.println("---------------"+"按部门查询"+"---------------"); T.bumen(0,0); break; case 7: System.out.println("---------------"+"按电话号码查询"+"---------------"); T.telRead(0,0); break; case 8: System.out.println("----------------"+"退出系统"+"----------------"); T.exit(); System.out.println("\n"+"谢谢使用,已退出系统"); break; default: System.out.println("--------------"+"您的输入有误"+"--------------"); break; } } } } public class TelBookMgnage { public static void main(String[] args) { MainInterface M = new MainInterface(); //加载主界面 M.mainSelect(); //主界面选择输入操作 } } ```
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
【JSON解析】浅谈JSONObject的使用
简介 在程序开发过程中,在参数传递,函数返回值等方面,越来越多的使用JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,同时也易于机器解析和生成、易于理解、阅读和撰写,而且Json采用完全独立于语言的文本格式,这使得Json成为理想的数据交换语言。 JSON建构于两种结构: “名称/值”对的集合(A Collection of name/va...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
只因接了一个电话,程序员被骗 30 万!
今天想给大家说一个刚刚发生在我身边的一起真实的诈骗经历,我的朋友因此被骗走30万。注:为了保护当事人隐私,部分情节进行了修改。1平安夜突来的电话开始以为就像普通的诈骗一样,想办法让你把钱...
我一个37岁的程序员朋友
周末了,人一旦没有点事情干,心里就瞎想,而且跟几个老男人坐在一起,更容易瞎想,我自己现在也是 30 岁了,也是无时无刻在担心自己的职业生涯,担心丢掉工作没有收入,担心身体机能下降,担心突...
python自动下载图片
近日闲来无事,总有一种无形的力量萦绕在朕身边,让朕精神涣散,昏昏欲睡。 可是,像朕这么有职业操守的社畜怎么能在上班期间睡瞌睡呢,我不禁陷入了沉思。。。。 突然旁边的IOS同事问:‘嘿,兄弟,我发现一个网站的图片很有意思啊,能不能帮我保存下来提升我的开发灵感?’ 作为一个坚强的社畜怎么能说自己不行呢,当时朕就不假思索的答应:‘oh, It’s simple. Wait for me for a ...
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
Java 14 都快来了,为什么还有这么多人固守Java 8?
从Java 9开始,Java版本的发布就让人眼花缭乱了。每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,...
达摩院十大科技趋势发布:2020 非同小可!
【CSDN编者按】1月2日,阿里巴巴发布《达摩院2020十大科技趋势》,十大科技趋势分别是:人工智能从感知智能向认知智能演进;计算存储一体化突破AI算力瓶颈;工业互联网的超融合;机器间大规模协作成为可能;模块化降低芯片设计门槛;规模化生产级区块链应用将走入大众;量子计算进入攻坚期;新材料推动半导体器件革新;保护数据隐私的AI技术将加速落地;云成为IT技术创新的中心 。 新的画卷,正在徐徐展开。...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
Idea 中最常用的10款插件(提高开发效率),一定要学会使用!
学习使用一些插件,可以提高开发效率。对于我们开发人员很有帮助。这篇博客介绍了开发中使用的插件。
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
立即提问